Перейти к содержимому

Как сравнить 3 числа в c

  • автор:

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

5f1457ffac8c8735895275.png

Не могу найти решения задачи потому что на моменте сравнения чисел компилятор начинает неадекватно себя вести. Значит проблема не в компиляторе. Посидев и потыкав палкой и камнем по кнопкам я понял что всё работает, если последнее число 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *