Как сравнить два числа в си
Перейти к содержимому

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

  • автор:

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

Сравнение двух чисел

Начал изучать си, и в простой проге не пойму где ошибка

#include
#include
#include
int main(int argc, char *argv[])
float A, B;
printf («Ввидите А и В \n»);
scanf («%f%f, &A, &B»);
if (A>B)
printf («Больше %f \n», A );
>
printf («Больше %f \n», B);
>
system(«PAUSE»);
return 0;
>

Какие бы цифры не писал пишет что больше ноль и ошибку приложения.
пишу в Dev-C++, Эту программу нашел в книжке, перепечатал без ошибок. В чем может быть ошибка?

Программы на c, c++

В этом блоге приведены примеры задач, выполненных на c, c++. Если у вас возникнут вопросы пишите мне в facebook. Оставляете ваши комментарии под сообщением!

понедельник, 26 сентября 2011 г.

Сравнение двух чисел ( , =) [c, c++]

Задача:

Сравнение двух чисел (, =)

Код программы:

// функция
char s(int a, int b)
char r;
if(a>b) r=’>’;
else if (a else r=’=’;
return(r);
>
// конец функции

void main()
clrscr();
int x1,x2; // сравниваемые числа
char r; // результат сравнения

printf(«Введите 2 числа\n»);
scanf(«%i%i», &x1, &x2);
r=s(x1, x2); //вызов функции
printf(«%i %c %i\n», x1, r, x2);
getch();
>

Операции сравнения чисел

В условных инструкциях, в инструкциях цикла, как правило используются сравнения вида x > 0 или a != b (числа a и b не равны), то есть некоторое логическое выражение. В таких выражениях как правило используются операции сравнения (равно, неравно, меньше, больше и т.д.).

В языке C подобные операции возвращают значение типа int, либо 0, что считается ложью, либо 1, которое означает истину. В языке C++ для этого есть специальный логический тип bool .

Переменные логического типа bool принимают два значения: true (истина) и false (ложь). Также любое целочисленное выражение можно трактовать, как логическое выражение, при этом нулевое целое число означает ложь, а ненулевое — истину. Таким образом, если вместо условия написать false или 0 , то оно будет всегда ложно, если же указать true , 1 или любое ненулевое число, то условие будет истинно.

Как правило, в качестве проверяемого условия используется результат вычисления одного из следующих операторов сравнения:

Меньше — возвращает true , если первый операнд меньше второго.
> Больше — возвращает true , если первый операнд больше второго.
Меньше или равно.
>= Больше или равно.
== Равенство. Возвращает true , если два операнда равны.
!= Неравенство. Возвращает true , если два операнда неравны.

Будьте аккуратны: оператор == (два знака равенства) — это проверка на равенство двух выражений, а оператор = (один знак равенства) — это присваивание одной переменной значения выражения и использование его в условии оператора ветвления в большинстве случаев является ошибкой.

Рассмотрим эту типичную ошибку на следующем примере:

int a, b; cin >> a >> b; if (a = b) < cout else

Здесь по ошибке вместо операции сравнения == использована операция присваивания = . Поэтому при любых значениях a и b переменной a будет присвоено значение переменной b, при проверке истинности выражения a = b . Но оператор присваивания еще и возвращает значение, поэтому если значение b было ненулевым (а это интерпретируется, как истина), то программа выведет строку «Числа равны», а если нулевым — то строку «Числа не равны». При этом значение переменной a может быть вообще любым.

Как сравнить три значения в си?

Просто, не хочу писать большой код, думаю наверняка есть короткий алгоритм. Спасибо. 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
46k 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. Может это страшно, но мне нравиться. Я просто сам догоняю этот код. А остальной не очень :). С вашей точки зрения это нормальный вариант или убожество?

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

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