2016-08-05 20 views
1

Я изучаю C из книги под названием «C по примеру»Расчеты Не работает должным образом

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

/* Chapter 7 Review Exercises #2 
- You are a college professor and you have to get the average grades for 10 students. Write a program which prompts you for 10 different grades and then 
displays their average */ 

#include <stdio.h> 

int main() 
{ 

    float score1, score2, score3, score4, score5, score6, score7, score8, score9, score10; 

    float average = score1+score2+score3+score4+score5+score6+score7+score8+score9+score10/10; 

    printf("Please input the scores of the students: \n"); 
    scanf(" %f",&score1); 
    scanf(" %f",&score2); 
    scanf(" %f",&score3); 
    scanf(" %f",&score4); 
    scanf(" %f",&score5); 
    scanf(" %f",&score6); 
    scanf(" %f",&score7); 
    scanf(" %f",&score8); 
    scanf(" %f",&score9); 
    scanf(" %f",&score10); 

    printf("The average score is: %.2f" , average); 

    return 0; 

} 

Проблема здесь состоит в том, что каждый раз, когда входные I числа (при выполнении коды) Он всегда дает мне огромное количество назад (как минимум 20 номеров)

Есть ли способ ограничить число, или я делаю что-то неправильно?

+0

Не могли бы вы предоставить [mcve]? Было бы легче ответить, если бы мы знали ваш вклад. – xenteros

+1

Вам необходимо вычислить значение 'average' ** после ** ввода значений его компонентов ...... Или сделать' average' функцией, которая всегда будет перечитывать их по требованию. Как и в случае, ваша программа вызывает неопределенное поведение, читая (10) неинициализированную переменную (ы) и сохраняя ее в «среднем», которая не изменяется, если какой-либо из «оценок». –

+0

Я дал вам ответ с исправленным кодом. Пожалуйста, не стесняйтесь использовать его. Он получил второе место дважды и дважды подавался другими ответчиками, чтобы продвигать их ответы:/Хорошая практика - отметить правильный ответ как решение с зеленым тиком и правильные ответы. – xenteros

ответ

1

Следующий код будет работать. Ваш код не работает, потому что вы пытаетесь вычислить числа до их сканирования. Тем не менее вы должны помнить, что C сохраняет порядок операций, поэтому / выполнен до +. Добавить отсутствующие скобки (). В C код обрабатывается сверху вниз!

#include <stdio.h> 
int main() { 

    float score1, score2, score3, score4, score5, score6, score7, score8, score9, score10; 

    printf("Please input the scores of the students: \n"); 
    scanf(" %f",&score1); 
    scanf(" %f",&score2); 
    scanf(" %f",&score3); 
    scanf(" %f",&score4); 
    scanf(" %f",&score5); 
    scanf(" %f",&score6); 
    scanf(" %f",&score7); 
    scanf(" %f",&score8); 
    scanf(" %f",&score9); 
    scanf(" %f",&score10); 

    float average = (score1+score2+score3+score4+score5+score6+score7+score8+score9+score10)/10; 
    printf("The average score is: %.2f" , average); 

    return 0; 

} 
+1

OK ответ работает, и это не комментарий к xenteros, но это не очень эффективный способ сделать это. Попробуйте использовать цикл, хотя вы, возможно, еще не узнали о них. –

3

Вы отсутствуют некоторые скобки здесь:

float average = score1+score2+score3+score4+score5+score6+score7+score8+score9+score10/10; 

Изменить это:

float average = (score1+score2+score3+score4+score5+score6+score7+score8+score9+score10)/10; 

Вы также должны переместить эту линию вниз, так что речь идет о после стадия ввода (т.е. после всех звонков на scanf), так как нет смысла пытаться вычислить что-то до, у вас есть все входные значения.


Вы можете прочитать на старшинство операторов, а также петли, так как ваша программа может быть написана гораздо проще и лаконично:

#include <stdio.h> 

int main() 
{ 
    const int n = 10; 
    float sum = 0.0f; 
    float average; 
    int i; 

    printf("Please input the scores of the students: \n"); 

    for (i = 0; i < n; ++i) 
    { 
     float score; 

     scanf(" %f", &score); 
     sum += score; 
    } 

    average = sum/n; 

    printf("The average score is: %.2f" , average); 

    return 0; 
} 
+0

О, я не знал, что ты должен был это сделать! Большое вам спасибо: D – ImperfectLion

1

Число действительно так, потому что вы не» t понять, как C выполняет код. Он работает сверху до ботума. Так что если вам нужна оценка score1 ... оценка 10, вы сначала необходимо сделать scanf и только затем использовать +.

+0

Ahh, который исправил это! Огромное спасибо за помощь! Полностью забыл о верхнем и нижнем чтении C :) – ImperfectLion

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