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