2017-02-22 74 views
0

Я пытаюсь создать программу, которая вычисляет среднее значение любого желаемого числа поплавков до EOF. Программа также должна проверить правильность ввода и вернуть «Неверный ввод», когда, например, ввод строки. Код, который я написал, работает, но он дает неправильные выходы для среднего. Может ли кто-нибудь сказать мне, почему?Правильное использование scanf() в C, неправильный вывод

#include <stdio.h> 

int main(void) { 
    int times = 0; 
    float sum = 0; 
    float scan; 
    float avrg; 
    int scanvalue = 1;  
    while (scanvalue == 1) {    
     scanvalue = scanf("%f", &scan); 
     sum = sum + scan; 
     times++;     
    }  
    if (scanvalue == EOF) { 
     avrg = sum/times; 
     printf("The average is %f\n", avrg); 
    } else { 
     printf("Wrong input"); 
    } 
    return 0; 
} 

С уважением.

+0

вы могли бы привести пример ввода и вывода? – Marievi

+0

Я бы заподозрил * неправильное использование 'scanf()' correct output *, что, в свою очередь, было, конечно, неожиданным **. –

+0

Какова ваша система и компилятор? Какой ключ вы делаете для завершения ввода? –

ответ

4

Вы не проверяете scanvalue после scanf() и по-прежнему используете значение scan, которое встряхивает средний показатель. Обратите внимание, что когда scanf() возвращает EOF, он не будет изменять scan, и поэтому он все равно будет иметь последнее значение, поэтому вы добавляете последнее значение дважды.

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

while ((result = scanf("%f", &value)) == 1) { 
} 

Кроме того, я сознательно изменил имена ваших переменных, чтобы показать лучший способ назвать их.

+0

Спасибо! Однако: зачем мне нужно скобки внутри и не могу писать сразу (result = scanf («% f», & value) == 1). Я думал, что компилятор читает такие заявления слева направо. – Mark

+1

1. Превосходство переднего хода. 2. Потому что вы также можете выйти на улицу голым, но вы все еще носите одежду. 3. Потому что он становится двусмысленным для читателей. 4. Потому что это очень уродливо. 5. Действительно, потому что это выглядит ужасно. 6. Потому что он плохо выглядит, делает чтение трудно. Но самое главное, приоритет оператора. –

+0

«Обратите внимание, что когда' scanf() 'возвращает' EOF', он не будет изменять 'scan' 'лучше, чем« Обратите внимание, что когда 'scanf()' возвращает меньше 1, он не будет изменять 'scan'. Но даже это не совсем правильно. В случае ошибки ввода, 'scanf()', может возвращать 'EOF' и изменил' scan'. – chux

0

Вам необходимо проверить значение scanvalue после scanf, в противном случае время будет увеличиваться, даже если вы введете EOF, и сумма получит неправильный ввод, что приведет к тому, что среднее значение будет неправильным/беспорядочным.

Таким образом, вы должны изменить

while (scanvalue == 1) {    
    scanvalue = scanf("%f", &scan); 
    sum = sum + scan; 
    times++;     
} 

Для

while (scanvalue == 1) { 
    scanvalue = scanf("%f", &scan); 
    if (scanvalue != 1) 
     break; 
    sum = sum + scan; 
    times++; 
} 
+0

Пожалуйста, проверьте форматирование своего ответа. –

+0

Лучше использовать 'if (scanvalue! = 1) break;' – chux

+0

право, спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^