2014-11-17 2 views
1

Может ли кто-нибудь объяснить мне, почему функция «сканирования» не работает в следующем коде? Что я делаю, чтобы исправить эту проблему? Благодаря!Функция сканирования не работает внутри цикла

int main() { 
    int age, sumage; 
    float mean; 
    sumage = 0; 
    for (int a = 1; a <= 20; a = a + 1) { 
     printf("Enter age: \n"); 
     scanf("%d", &age); 
     sumage = sumage + age; 
    } 
    mean = sumage/20; 
    printf("mean = é %f \n" , mean); 
    return 0; 
} 
+0

Не могли бы вы объяснить, что означает «не работает». –

+0

'scanf ("% d ", & age)' работает. Это другой код, который работает, но не так, как вы хотите. Посмотрите на 'mean = sumage/20;' как целочисленную проблему. – chux

+0

Прочитайте документацию по [scanf (3)] (http://man7.org/linux/man-pages/man3/scanf.3.html): вы всегда должны проверять ее результат (количество отсканированных элементов). –

ответ

1
mean = sumage/20; 

Здесь sumage представляет собой целое число. Таким образом, деление является целым делением.

Изменить на (float)sumage/20.0, чтобы получить ожидаемый результат.

+0

Строго говоря, это должно быть '(float) sumage/20.0f' или просто' sumage/20.0f'. Двойной литерал будет обеспечивать разделение, которое должно выполняться с двойной точностью, которое затем усекается для плавания. Делает программу ненужной медленной, если компилятор не сможет оптимизировать. – Lundin

+0

Я хочу прочитать 20 возрастов, но scanf просто читает первый. Приложение продолжает работать, но больше ничего не происходит. Я пробовал все, все целые числа var, double, это не сработало. Приложение в основном останавливается на scanf. – TRF

0

Вы пытаетесь заполнить float с integer значением:

mean = sumage/20; 

нуждается в cast для float, чтобы сохранить значение в качестве float:

mean = (float) sumage/20; 

Нижняя линия, int/int = int, если не указано иное. С99 ссылка для арифметической конверсии:

6.3.1.8 Обычные арифметические преобразования

В противном случае, если соответствующий реальный тип операнда либо с плавающей точкой, другой операнд преобразуется, без изменения доменного типа, до типа , соответствующий тип которого является float.51)

+0

Не стоит * хранить значение как float *, а скорее * вычислять как float * (и 'casting' 'применяется для * sumage * btw) –

+0

И' float'/'int' =' float' –

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