Вопрос по Си

Модератор: Модераторы разделов

Аватара пользователя
wwvv
Сообщения: 115
ОС: ArchLinux

Вопрос по Си

Сообщение wwvv »

Задача заключается в том, что нужно вывести на экаран А,В или С в зависимости от значения х.
То есть х будет меняться с 0.7 к 2 с шагом 0.1
И если х<1.4 то нужно вывести А,
если x=1.4 вывести В,
если x>1.4 то С

Вот как получилось у меня:

Код: Выделить всё

#include <stdio.h>
#include <math.h>

int main()
{
float x;

for(x=0.7;x<=2;x=x+0.1) {
if (x<1.4)
{
printf("A\n");


}
else if (x>1.4)
{
printf("C\n");

}
else
{
 printf("B\n\n");

}
}

return 0;
}


После выполнения ни разу не выводится В.
В чём ошибка? :blink:

Только начал изучение Си
damn small linux=> slax => mandriva 2008 pwp => opensuse 11.0=> opensuse 11.1=> ubuntu 8.10 => Debian=>ArchLinux!!!
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Вопрос по Си

Сообщение diesel »

wwvv писал(а):
10.10.2009 20:55
После выполнения ни разу не выводится В.
В чём ошибка? :blink:

в вашем случае: if (x>1.4) означает что if((x-1.4) >= 0.1) или, скажем, if((x-1.4) > 0.01)
http://howto.wikia.com/wiki/Howto_compare_...amming_language
Объяснений почему именно так тоже можно найти.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вопрос по Си

Сообщение drBatty »

wwvv писал(а):
10.10.2009 20:55
И если х<1.4 то нужно вывести А,
если x=1.4 вывести В,
если x>1.4 то С

так и пишите:

Код: Выделить всё

#define TR 1.4
printf(x < TR ? "A" : (x == TR ? "B" : "C"));


wwvv писал(а):
10.10.2009 20:55
После выполнения ни разу не выводится В.
В чём ошибка?

А... это известные грабли:
НИКОГДА НЕ СРАВНИВАЙТЕ НА РАВЕНСТВО ДРОБНЫЕ ЧИСЛА!

ЗЫЖ
Если надо сравнить число с нулём, то сравните его модуль с какой-нибудь малой константой:
double eps = 1e-8;
if(ABS(x) < eps)...
Да и то... Лучше не надо.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
korvin
Сообщения: 39
ОС: >_<

Re: Вопрос по Си

Сообщение korvin »

drBatty писал(а):
11.10.2009 02:05
НИКОГДА НЕ СРАВНИВАЙТЕ НА РАВЕНСТВО ДРОБНЫЕ ЧИСЛА!

он же нигде и не сравнивает
(© '(define LISP (такой язык-программирования (состоящий-из смайликов (чуть более) (чем целиком)))) lurkmore)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вопрос по Си

Сообщение drBatty »

korvin писал(а):
30.12.2009 22:52
он же нигде и не сравнивает

сравнивает:
ветка про B никогда не выполнится.
(в общем случае)
В данном случае - не помню.
x=0.7;x<=2;x=x+0.1
если в сопроцессоре 0.7 и 0.1 представимы неточно, или если компилятор не будет оптимизировать (а он такое не будет, хотя я бы написал всё в целых числах), тогда x никогда не будет точно < и одновременно точно >, будет что-то вроде
1.3999999999876
разве вы такого не видели?
А это число меньше 1.4

PS: переведите мне в двоичную систему 0.1
бесконечная дробь, как и в десятичной 1/3
ну не может это точно хранится в i8087
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: