Как сравнить три значения в си?
Просто, не хочу писать большой код, думаю наверняка есть короткий алгоритм. Спасибо. Ps @ХэшКод, расширьте, пожалуйста,лимит комментариев в данном посте.
Отслеживать
ВладиславМСК
задан 22 дек 2013 в 9:55
ВладиславМСК ВладиславМСК
1,541 11 11 золотых знаков 38 38 серебряных знаков 59 59 бронзовых знаков
int a, b, c; a = min(a, b); a = min(a, c); тогда в а храниться наименьшее число
22 дек 2013 в 11:36
@Janycz, не понял Вас. Сделать отдельную функцию для сравнения или что?
22 дек 2013 в 14:08
Аноним, аргументируй свйо минус за топик.
22 дек 2013 в 14:15
Если а, b, c — числа для сравнения, тогда: a = min(a, b); a = min(a, c); в результате в а храниться наименьшее число
22 дек 2013 в 14:16
@ВладиславМСК минус я вам поставил за то, что должно быть стыдно стыдно задавать настолько простые вопросы, особенно учитыая тот факт, что судя по вашим многочисленным вопросам и большому сроку пребывания на этом форуме, Си — язык для вас явно не новый. Так что уж не обессудьте
22 дек 2013 в 14:20
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
C++
#include using namespace std; int main(int argc, char **argv)
C
#include int min(int x, int y) < return x < y ? x : y; >int main(int argc, char **argv)
Отслеживать
ответ дан 27 дек 2013 в 13:08
2,803 1 1 золотой знак 20 20 серебряных знаков 46 46 бронзовых знаков
Если интересует не сам минимум, а переменная (адрес) содержащая минимальное значение, то можно вот так
int * pimin (int *pa, int *pb, int *pc) < int m, *pm; if (*pa else < m = *pb; pm = pb; >return (m > *pc) ? pc : pm; >
Если в main написать что-то такое
struct x < int v; const char *name; >; struct x a, b, c, *r; . int *pres = pimin(&a.v, &b.v, &c.v); . #define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) r = list_entry(pres, struct x, v); printf ("min = %d (%s)\n", *pres, r->name);
то можно получить:
avp@avp-xub11:~/hashcode$ ./a.out 4 13 21 min = 4 (a) avp@avp-xub11:~/hashcode$ ./a.out 4 13 2 min = 2 (c) avp@avp-xub11:~/hashcode$
Может Вы имели в виду такой подход?
Отслеживать
ответ дан 27 дек 2013 в 14:16
45.8k 6 6 золотых знаков 45 45 серебряных знаков 115 115 бронзовых знаков
@avp, Примерно такой, только бюез использования динамической памяти. Вы правы, мне нужна именно минимальная переменная. Я это всё сделал с помощью ответа выше, а для того, что бы понять, что это за переменная(потому что в зависимости от переменной нужны разные действия), сделал это через 3 условия, а не через адрес. Честно говоря ваш подход через адрес не совсем понял. Сейчас думаю над ним.
27 дек 2013 в 14:56
27 дек 2013 в 15:33
@uzumaxy, конечно, можно. Просто min(min(a,b),c) тут уже в разных комментариях писали раза 3. Подумал, что ТС м.б. хочет в одной функции. — @ВладиславМСК, в этой программе нет динамической памяти. Просто указатели (впрочем, указывать на динамическую память тоже можно).
27 дек 2013 в 15:43
@avp, видели мой комментарий с кодом switch-case? Я заменил конструкцию switch на if else. Может это страшно, но мне нравиться. Я просто сам догоняю этот код. А остальной не очень :). С вашей точки зрения это нормальный вариант или убожество?
Задача на сравнение 3х чисел
Чтобы попрактиковаться в питоне, друг предложил сделать «простую задачку». Простой она оказалась только на его словах… Он говорит, что в 5-6 строк делается. Можно использовать только if, сравнения и арифметические операторы, все остальное нельзя. Нельзя использовать готовые функции.
Задача такая. Вводим 3 числа, далее программа выводит их на экран в порядке возрастания. Плюс учитываем возможность того, что какие-то из них (или даже все) равны.
Сначала я потратил целый день, и получилось больше 100 строк. Все это время меня не покидало неприятное ощущение, что такого бреда быть не может. Я навелосипедил все возможные варианты и проверки, и получилась неприлично громадная программа. Но вроде кое-как работало… На следующий день я переделал, но получилось все-равно строк на 50. Потом я представил, а что если мне придется сравнивать 4 числа? А если 5? Это же тогда моя программа вообще разростется до миллиона строк. Но ведь друг сказал «всего 5 строк».
Гугл подсказывает кучу готовых решений, но открывать их не хочется. Может есть какой-то простой алгоритм для решений таких задач?
Перемещено leave из general
Сравнение 3 чисел
Сравнение чисел
Скажите, пожалуйста, логику сравнения трёх чисел на языке алгоритма, чтобы рез-т был таким: первое.
Сравнение чисел
дан 40 число если число меньше 25 надо прибавить 10. можете помочь
Сравнение чисел
Строго не судите, логику кода понять можно. Где проблема? Значение value не присваивается на 31.
Сравнение чисел
Привет всем!Люди помогите написать программ,которая сравнивает три числа и выдает наибольшее и.
60 / 21 / 10
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
Второй способ не катит.
Проверь алгоритм.
Регистрация: 15.12.2013
Сообщений: 147
В одно выражение
Max = max( x, max(y,z) );
max(a,b) — встроенная функция. Возвращает максимальное число из a и b
Регистрация: 19.11.2013
Сообщений: 74
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
cout "Способ №5" endl; switch ( x > y ) { case 1: Max = x; break; case 0: Max = y; break; } switch ( Max z ) { case 1: Max = z; break; case 0: break; } cout "Самое большое число - " Max endl;
60 / 21 / 10
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
1 2 3
cout "Способ №4" endl; Max = (x > y)? ( (x > z)? x : z ) : ( (y > z)? y : z ); cout "Самое большое число - " Max endl;
Регистрация: 19.11.2013
Сообщений: 74
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
cout "Способ №6" endl; switch ( x > y ) { case 1: switch ( x > z ) { case 1: Max = x; break; case 0: Max = z; break; } break; case 0: switch ( y > z ) { case 1: Max = y; break; case 0: Max = z; break; } break; } cout "Самое большое число - " Max endl;
60 / 21 / 10
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
// [url]https://www.cyberforum.ru/cpp-beginners/thread1055154.html[/url] /* * Всем привет)) * В колледже задали задание: написать программу, которая сравнивает 3 числа. Три варианта я сделал: */ #include using namespace std; int main() { int x, y, z, Max; cout "Введите число x: "; cin >> x; cout endl "Введите число y: "; cin >> y; cout endl "Введите число z: "; cin >> z; cout "Способ №1" endl; if(x > y) { if(x > z) Max = x; else Max = z; } else { if(y > z) Max = y; else Max = z; } cout "Самое большое число - " Max endl; cout "Способ №2" endl; // Исправлено! if(x > y && x > z) { Max = x; } else if (x > y && x z) { Max =z; } else if(y > x && y > z) { Max = y; } else Max = z; cout "Самое большое число - " Max endl; cout "Способ №3" endl; if(x > y) Max = x; else Max = y; if(Max z) Max = z; cout "Самое большое число - " Max endl; cout "Способ №4" endl; // Исправлено! Max = (x > y)? ( (x > z)? x : z ) : ( (y > z)? y : z ); cout "Самое большое число - " Max endl; // system('pause'); // У меня нет такого метода. return 0; }
2833 / 1642 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
4-м способом:
Max = (Max = x > y ? x : y) > z ? Max : z;
Вариант с std::max в C++11:
Max = std::max({a, b, c});
Регистрация: 12.10.2012
Сообщений: 10
Всем спасибо))) Особенно порадовали дополнительные варианты)))
В итоге у меня получился вот такой вот код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
#include using namespace std; int main() { setlocale(LC_ALL, "Russian"); int x, y, z, Max; cout "Введите число x: "; cin >> x; cout endl "Введите число y: "; cin >> y; cout endl "Введите число z: "; cin >> z; cout "\nСпособ №1"; if(x > y) { if(x > z) Max = x; else Max = z; } else { if(y > z) Max = y; else Max = z; } cout "\nСамое большое число - " Max endl; cout "\nСпособ №2"; if(x > y && x > z) Max = x; if(y > x && y > z) Max = y; if(z > x && z > y) Max = z; cout "\nСамое большое число - " Max endl; cout "\nСпособ №3"; if(x > y) Max = x; else Max = y; if(Max z) Max = z; cout "\nСамое большое число - " Max endl; cout "\nСпособ №4"; Max = (x > y)? x : y; Max = (Max > z)? Max : z; cout "\nСамое большое число - " Max endl; cout "\nСпособ №5"; switch (x > y) { case 1: Max = x; break; case 0: Max = y; break; } switch (Max z) { case 1: Max = z; break; case 0: break; } cout "\nСамое большое число - " Max endl; cout "\nСпособ №6"; switch (x > y) { case 1: switch (x > z) { case 1: Max = x; break; case 0: Max = z; break; } break; case 0: switch ( y > z ) { case 1: Max = y; break; case 0: Max = z; break; } break; } cout "\nСамое большое число - " Max endl; system("pause"); return 0; }
Как сравнить 3 числа в c
Ребят, подскажите пожалуйста.. Си начал учить по книженке одной «Введение в программирование на С». И там есть задания. <<Ввести три числа и определить большее из них. Если числа равны, то соответственно вывести сообщение об этом.>> Это в главе «Операторы условия if. else». Получается, что надо выполнение двойного условия «если А больше Б и А больше С то. «, но проблема в том что в моей книжке нету пример чтобы в операторе IF было несколько условий. там только типа if(x>60). и все. ну я решил что должно быть через запятую.. но сомневаюсь. где то еще видел через «&»..вот код внизу который я смог слепить..работает он коряво=(( к примеру если вводишь числа подряд » 3 4 4″, то пишет что числа равны..((
Суть топика: объяснить новичку, как в операторе IF ставить несколько условий. поправить мой нубский код, или написать свой но с использованием IF. ELSE. буду благодарен!
#include #include void main() < int a,b,c; printf("vvedi pervoe chislo umnik:\n"); scanf("%d",&a); printf("vvedi vtoroe chislo umnik:\n"); scanf("%d",&b); printf("vvedi tretee chislo umnik:\n"); scanf("%d",&c); if(a>b, b>c) < printf("max=%d\n",a); >else < if(b>a, a>c) printf("max=%d\n",b); else < if(c>a,a>b) printf("max=%d\n",c); else < if(a=b, a=c, b=c) printf("chisla ravni\n"); >> > getch(); >
Я могу, Я хочу, Я буду!
ArmanPrestige |
Посмотреть профиль |
Найти ещё сообщения от ArmanPrestige |
Пользователь
Регистрация: 24.09.2011
Сообщений: 26
int main() < int a,b,c; printf("Введите 3 числа"); scanf("%d%d%d",&a,&b,&c); if (a>b && a>c) printf("max=%d\n",a); else if (b>a && b>c) printf("max=%d\n",b); else if (c>a && c>b) printf("max=%d\n",c); else if (a==b && a==c && b==c) printf("Числа равны\n"); system("pause"); return 0; >
Пользователь
Регистрация: 24.09.2011
Сообщений: 26
Теперь объясню.
&& — это логическое «и», проверка на равенство это «==», а не «=» (это присваивание).
Еще вопросы?
Сама себе режиссер
Регистрация: 27.04.2007
Сообщений: 3,378
if(a > b && a > c) — и
if(a > b || a > c) — или
if(!(a > b && a > c)) — не
if(a > b && (a > c || a > d)) — И и ИЛИ, скобки тут показывают, что первым будет выполняться подсчет истинности ИЛИ
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery |
Посмотреть профиль |
Найти ещё сообщения от ACE Valery |
Главное желание.
Форумчанин
Регистрация: 28.11.2011
Сообщений: 122
Сообщение от Китос
Теперь объясню.
&& — это логическое «и», проверка на равенство это «==», а не «=» (это присваивание).
Еще вопросы?
Насчет присваивания и «И» понятно все. спасибо.
еще вопрос в вашем коде
system("pause"); return 0;
в чем функция return(0)?
и в какой библиотеке они находятся подскажите пожалуйста
Я могу, Я хочу, Я буду!
ArmanPrestige |
Посмотреть профиль |
Найти ещё сообщения от ArmanPrestige |
Пользователь
Регистрация: 24.09.2011
Сообщений: 26
просто я написал функцию int main(), это значит что она возвращает (как раз через оператор return) значение int. В данном случае это не обязательно, можно оставить ваш void. Ну и библиотека ей не нужна это стандартная функция си.
Главное желание.
Форумчанин
Регистрация: 28.11.2011
Сообщений: 122
Сообщение от Китос
просто я написал функцию int main(), это значит что она возвращает (как раз через оператор return) значение int. В данном случае это не обязательно, можно оставить ваш void. Ну и библиотека ей не нужна это стандартная функция си.
Будьте добры еще. подскажите пожалуйста разницу между int main() и void main()
буду очень благодарен.
ACE Valery, и вам спасибо
Я могу, Я хочу, Я буду!
ArmanPrestige |
Посмотреть профиль |
Найти ещё сообщения от ArmanPrestige |
Пользователь
Регистрация: 24.09.2011
Сообщений: 26
Ну если ты только начал изучать си то ты еще с этим обязательно столкнешься)
Ну например пишем функцию суммирования двух чисел:
int sum(int x, int y)
данная функция получает два аргумента x и y, и возвращает результат их суммы.
то есть если мы вызовем эту функцию:
z=sum(2,3);
то получим z=5.
Функция void ничего не возвращает.
Последний раз редактировалось Китос; 22.01.2012 в 01:39 .
Главное желание.
Форумчанин
Регистрация: 28.11.2011
Сообщений: 122
Сообщение от Китос
Ну если ты только начал изучать си то ты еще с этим обязательно столкнешься)
Ну например пишем функцию суммирования двух чисел:
int sum(int x, int y)
данная функция получает два аргумента x и y, и возвращает результат их суммы.
то есть если мы вызовем эту функцию:
z=sum(2,3);
то получим z=5.
понял.
и да, С изучаю не давно. 4 день=)
всем спасибо. особенно вам Китос
Я могу, Я хочу, Я буду!
ArmanPrestige |
Посмотреть профиль |
Найти ещё сообщения от ArmanPrestige |
Регистрация: 16.12.2011
Сообщений: 2,329
Сообщение от Китос
int main() < int a,b,c; printf("Введите 3 числа"); scanf("%d%d%d",&a,&b,&c); if (a>b && a>c) printf("max=%d\n",a); else if (b>a && b>c) printf("max=%d\n",b); else if (c>a && c>b) printf("max=%d\n",c); else if (a==b && a==c && b==c) printf("Числа равны\n"); system("pause"); return 0; >
1. У вас проверка на «числа равны» в три сравнения. Хотя для такой задачи достаточно только двух сравнений
2. Слишком много всяких if — else. Это не читабельно
//где то заранее ( #include) #define max(a,b) (((a) > (b)) ? (a) : (b)) if( a==b&&b==c ) < printf("Числа равны\n"); >//достаточно только двух сравнений eslse < printf("максимальное число: %i\n", max( max(a,b), c));
3. А если вдруг изменятся условия, надо будет искать максимальное из четырех чисел? В вашем случае, придётся ручками дописывать код.
А ведь поиск максимального из нескольких чисел - суть алгоритм поиска максимального числа в обычном массиве.
В таких случаях лучше подойдёт более унифицированное решение.
И ведь именно тем и силен и могуч с++, что позволяет создавать удобные, практичные, и унифицированные решения, гибкие в плане разного рода изменений.
Ниже представленный код умеет искать максимальное число в массиве.
При этом, он умеет различать:
1. Настоящие массивы на языке с++ ( тип имя[размер]; )
2. Динамические массивы (указатель + размер)
3. Совместимые с STL контейнеры.
Элементы массивов должны уметь сравниваться (operator < )
#include template inline int TGetMax(const Arr_t* Arr, size_t len) //передача указателя + размер данных < size_t nom=0; for(size_t i=1; i; template inline int TGetMax(const Arr_t (&Arr)[len]) //передача настоящего массива на с++ < return TGetMax(Arr, len); >; template inline int TGetMax(const Arr_t& Arr) //передача объекта, совместимого с контейнерами STL < Arr_t::const_iterator mmax= Arr.begin(); Arr_t::const_iterator iter= mmax+1; for(; iter!=Arr.end();++iter) if( (*mmax)<(*iter)) mmax=iter; return (*mmax); >; int main() < //подготовка к тестам int Arr[3] = < 21,17,33>; int Result=0; int* pArr=Arr; std::vector Arr2; Arr2.push_back(1); Arr2.push_back(2); Arr2.push_back(3); //сами тесты Result = TGetMax(Arr); printf("Result %i\n", Result); //при передаче настоящего массива, размер его будет вычислен автоматически Result = TGetMax(pArr,3); printf("Result %i\n", Result); //при передаче динамического массива, размер надлежит передавать явно // можно было бы тоже автоматически вычислять, //но уж больно костыльный получится метод Result = TGetMax(Arr2); printf("Result %i\n", Result); //для объектов, совместимых с STL контроль размера массива будет осуществлен через итератор >
Последний раз редактировалось _Bers; 22.01.2012 в 09:12 .