Как сравнить 3 числа через if?

Не могу найти решения задачи потому что на моменте сравнения чисел компилятор начинает неадекватно себя вести. Значит проблема не в компиляторе. Посидев и потыкав палкой и камнем по кнопкам я понял что всё работает, если последнее число 0. Как только это равенство меняется он показывает «минимальное»-положительно, и
«максимальное- отрицательное.
В общем вот вам один из примеров который у меня сработал при нуле, но при других целых всё идёт к чёрту.
https://onlinegdb.com/Bya0vCZlv
- Вопрос задан более трёх лет назад
- 4748 просмотров
1 комментарий
Простой 1 комментарий
Как сравнить 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 .
Как сравнить три значения в си?
Просто, не хочу писать большой код, думаю наверняка есть короткий алгоритм. Спасибо. Ps @ХэшКод, расширьте, пожалуйста,лимит комментариев в данном посте.
Отслеживать
ВладиславМСК
задан 22 дек 2013 в 9:55
ВладиславМСК ВладиславМСК
1,551 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,813 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.9k 6 6 золотых знаков 47 47 серебряных знаков 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