Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2008, 00:28   #11
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от FreeJaile Посмотреть сообщение
эм...вот ещё вариант, чтобы много if-else не писать (немного переделала вариант B_N ):

Код:
#include <iostream.h>

int main()
{
	int a, b, c, min = 0, max = 0, mid = 0;

	cout << "a="; cin >> a;
	cout << "b="; cin >> b;
	cout << "c="; cin >> c;

	if ((a > c) && (a > b) && (b > c)) {
		max = a;
		mid = b;
		min = c;
	}
	if ((a < b) && (a < c) && (b > c)){
		max = b;
		mid = c;
		min = a;
	}
	if ((a < b) && (a < c) && (b < c)){
		max = c;
		mid = b;
		min = a;
	}
	if ((a < c) && (b < c) && (a > b)){
		max = c;
		mid = a;
		min = b;
	}

	cout << "max: " << max << "," << " mid: " << mid << "," << " min: " << min << endl;
	cout << "max + mid = " << (max + mid) << endl;
	return 0;
}
только я не учитывала случаи, если вдруг числа равны)
И что всем так не нравится мой учебно-познавательный пример??? Надо было вот так:
Код:
max=a>b?(a>c?a:c):(b>c?b:c);
что ли написать... )
И, кстати, у меня числа упорядочиваются за 2-3 сравнения, а уж никак не за двенадцать, к тому же, я всегда считал, что три числа можно расставить шестью разными способами.... а не четырьмя.....

Последний раз редактировалось B_N; 01.03.2008 в 00:34.
B_N вне форума Ответить с цитированием
Старый 01.03.2008, 00:34   #12
FreeJaile
 
Регистрация: 29.02.2008
Сообщений: 7
По умолчанию

B_N да я же не говорю ничего против ^^ вы уж точно лучше чем я знаете..) просто почему-то моему скромному мозгу новичка кажется, что это немного наглядней %)

Цитата:
к тому же, я всегда считал, что три числа можно расставить шестью разными способами.... а не четырьмя.....
да.) вобщем, моя попытка не удалась =)
пы.сы. но работает вроде всегда, кроме случая, когда числа равны...

Последний раз редактировалось FreeJaile; 01.03.2008 в 00:40.
FreeJaile вне форума Ответить с цитированием
Старый 06.03.2008, 00:41   #13
ag-moscow
Пользователь
 
Аватар для ag-moscow
 
Регистрация: 24.02.2008
Сообщений: 13
По умолчанию

Есть еще более короткий способ:
Код:
#include<iostream.h>
#include <stdlib.h>

int compare (const void* l, const void* r);

int main ()
{
	int arr[3];
	cout<<"a="<<endl;
	cin>>arr[0];
	cout<<"b="<<endl;
	cin>>arr[1];
	cout<<"c="<<endl;
	cin>>arr[2];
 
	qsort (arr, 3, sizeof (int), compare);
	
	cout << "Summ = " << arr[0] + arr[1] << endl;
	return 0;
}
int compare (const void* l, const void* r)
{
	int* my_l = (int *)l;
	int* my_r = (int *)r;
	return *my_r > *my_l ? 1 : *my_r < *my_l ? -1 : 0;
}
Функция qsort является стандартной и описана в библиотеке stdlib. Она упорядочивает элементы массива так, как говорит ей функция compare, которую мы пишем сами. В результате мы упорядочиваем массив из введенных величин по убыванию (в данном случае), а значит максимальными будут числа, находящиеся в нулевом и первом элементах массива.
printf ("Hello, World!"), fflush (stdout);
std::cout << std::endl;
ag-moscow вне форума Ответить с цитированием
Старый 06.03.2008, 18:23   #14
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от FreeJaile Посмотреть сообщение
да.) вобщем, моя попытка не удалась =)
пы.сы. но работает вроде всегда, кроме случая, когда числа равны...
А я Вам скажу, когда она не работает:
1. a - max, c - mid
2. b - max, a - mid


Цитата:
Сообщение от ag-moscow Посмотреть сообщение
Есть еще более короткий способ:
..............
Функция qsort является стандартной и описана в библиотеке stdlib. Она упорядочивает элементы массива так, как говорит ей функция compare, которую мы пишем сами. В результате мы упорядочиваем массив из введенных величин по убыванию (в данном случае), а значит максимальными будут числа, находящиеся в нулевом и первом элементах массива.
Хорошая шутка. Для сравнения трёх чисел вызывать очень полезную, но здоровенную и лопающую "на ура" стэк функцию....
P.S. qsort не просто описана в stdlib. Поскольку CRT чуть ли не целиком прикручена к ntdll.dll и ntoskrnl.exe, qsort, фактически, является стандартной функцией WinNT, доступной в обоих режимах.
B_N вне форума Ответить с цитированием
Старый 07.03.2008, 22:40   #15
ag-moscow
Пользователь
 
Аватар для ag-moscow
 
Регистрация: 24.02.2008
Сообщений: 13
По умолчанию

Ну по поводу стека в данном случае заботится вряд ли стоит - всего три инта, да причем работа со стековыми переменными наименее затратна по времени, чем что-то иное. Для интереса провел тест на миллион циклов работы. Твой вариант работал на секунду дольше : 57 сек на 56 сек с qsort.
Объемность функции компенсируется отсутствием объемности в нашем коде - ради чего, собственно, и привел пример.
Про замечания CRT, *.dll, *.exe ничего не скажу - впервые слышу такие названия - пишу в линухе.
printf ("Hello, World!"), fflush (stdout);
std::cout << std::endl;
ag-moscow вне форума Ответить с цитированием
Старый 07.03.2008, 22:42   #16
ag-moscow
Пользователь
 
Аватар для ag-moscow
 
Регистрация: 24.02.2008
Сообщений: 13
По умолчанию

Прошу прощения, я имел в виду пример кода FreeJaile
printf ("Hello, World!"), fflush (stdout);
std::cout << std::endl;
ag-moscow вне форума Ответить с цитированием
Старый 07.03.2008, 23:43   #17
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от ag-moscow Посмотреть сообщение
Ну по поводу стека в данном случае заботится вряд ли стоит - всего три инта, да причем работа со стековыми переменными наименее затратна по времени, чем что-то иное. Для интереса провел тест на миллион циклов работы. Твой вариант работал на секунду дольше : 57 сек на 56 сек с qsort.
Хм.. Во-первых, раньше считалось, что stdcall - худший по производительности вариант, во-вторых, я не понял, как у Вас получились такие секунды - ваш вариант работает примерно в 40 раз медленнее, как того и следовало ожидать, причем все проходы, кроме первого, - над уже упорядоченными данными, а в-третьих, хоть это и формализм, в какой-то степени, но в стэке там вовсе не три инта, а:
Код:
push    ebp
mov     ebp, esp
sub     esp, 100h
B_N вне форума Ответить с цитированием
Старый 08.03.2008, 00:05   #18
ag-moscow
Пользователь
 
Аватар для ag-moscow
 
Регистрация: 24.02.2008
Сообщений: 13
По умолчанию

Вот код, который я сравнивал:
Код:
#include<iostream.h>
#include <stdlib.h>

int compare (const void* l, const void* r);

int main ()
{
	int arr[3] = {1, 5, 3};
 
	int i = 0;
        arr[2] = 2;
	while (i < 1000000)
	{ 
	 arr[0] = i + 2;
	 arr[1] += arr[0];
	
	 
	 qsort (arr, 3, sizeof (int), compare);
	 i++;
	 cout << "i = " << i << endl;
	}
	 return 0;
}
int compare (const void* l, const void* r)
{
	int* my_l = (int *)l;
	int* my_r = (int *)r;
	return *my_r > *my_l ? 1 : *my_r < *my_l ? -1 : 0;
}
и
Код:
#include <iostream.h>  
  
int main()  
{ 
  int a = 1, b = 5, c = 3;
  int min = 0, max = 0, mid = 0; 
  
  int i = 0;
  c = 2;  
  while (i < 1000000)
  { 
    a = i + 2;
    b += a;
    
    if ((a > c) && (a > b) && (b > c)) 
    { 
      max = a; 
      mid = b; 
      min = c; 
    }  
    if ((a < b) && (a < c) && (b > c))
		{ 
      max = b; 
      mid = c; 
      min = a; 
    }  
    if ((a < b) && (a < c) && (b < c))
		{ 
      max = c; 
      mid = b; 
      min = a; 
    }  
    if ((a < c) && (b < c) && (a > b))
		{ 
      max = c; 
      mid = a; 
      min = b; 
    }
    cout << "i " << i << endl;  
    i++;  
  }    
  return 0;  
}
Я, естественно, не имел в виду что в стеке всего 3 инта, а хотел сказать про объем обрабатываемых данных.
PS: Запускал на Athlon 64 3500, 2Gb mem, OC Mandriva 64 bit. Компилировал без ключей (g++ main.cpp), время засекал по секундной стрелке.
PPS: при повторном запуске экземпляр с qsort проиграл на 1 сек, но порядок времени тот же
printf ("Hello, World!"), fflush (stdout);
std::cout << std::endl;
ag-moscow вне форума Ответить с цитированием
Старый 08.03.2008, 00:27   #19
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от ag-moscow Посмотреть сообщение
Вот код, который я сравнивал:
.............................
Я, естественно, не имел в виду что в стеке всего 3 инта, а хотел сказать про объем обрабатываемых данных.
PS: Запускал на Athlon 64 3500, 2Gb mem, OC Mandriva 64 bit. Компилировал без ключей (g++ main.cpp), время засекал по секундной стрелке.
PPS: при повторном запуске экземпляр с qsort проиграл на 1 сек, но порядок времени тот же
Ха! То-то я удивляюсь, что за девайс такой - мильён проходов за минуту делает... Вы зачем "<<" в цикл затолкали? Вы его и меряли.
B_N вне форума Ответить с цитированием
Старый 08.03.2008, 01:09   #20
ag-moscow
Пользователь
 
Аватар для ag-moscow
 
Регистрация: 24.02.2008
Сообщений: 13
По умолчанию

Цитата:
Вы зачем "<<" в цикл затолкали? Вы его и меряли.
Мдя... так и было ;(.
Цикл на 100 миллионов выполняется за 14 сек с qsort против 1 сек без него. Результат на лицо, не в пользу qsort. Видно слишком мощьная машина для данного случая
printf ("Hello, World!"), fflush (stdout);
std::cout << std::endl;
ag-moscow вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа считывающая пять целых чисел и определяющая, печатающая наибольшее и наименьшее число из них Syber Общие вопросы C/C++ 3 30.06.2008 22:39
Из двух натуральных чисел, составить наибольшее число, сохраняя первоначальную последовательность.Паскаль Omedus Помощь студентам 8 19.11.2007 22:02
вычисление суммы чисел, кратных 3 из последовательности, состоящей из 10 чисел, заранее заданных Белка Помощь студентам 3 27.10.2007 11:53
Наибольшее и наименьшее значения функции mcblack Помощь студентам 9 26.04.2007 10:53