2016-10-01 2 views
-2

Я пишу код C, который вычисляет среднее значение меток. Он запрашивает у пользователя количество меток от 3 до 40. Если пользователь не вводит от 3 до 40, он снова запрашивает. Затем он запрашивает процентные доли и добавляет все, чтобы вычислить среднее значение. Вот мой код:Программирование C Loop Неверный расчет

#include<stdio.h> 
int main() 
{ 
int number_marks,i, a=1; 
float grade, total, average; 

    printf("Please enter the number of marks (between 3 and 40): "); 
    scanf("%d", &number_marks); 

if(number_marks>3 || number_marks<40) 
{ 
    do{ 
    printf("Invalid number, enter a number between 3 and 40 inclusive: "); 
    scanf("%d",&number_marks); 
    }while(number_marks<3 || number_marks>40); 
    for(i=0;i<number_marks;i++) 
    { 
     printf("%d>",a++); 
     scanf("%f",&grade); 
    total=grade+grade+grade+grade+grade; 
    average= (total/number_marks); 
    } 
} 
printf("The average of all marks in this group is %.1f\n",average); 
printf("Program Ended."); 
return 0; 
} 

Проблема заключается в выходе вычислений. Кажется, что он выводит окончательный класс и не вычисляет среднее значение. Есть выход:

Please enter the number of marks (between 3 and 40): 2 
Invalid number, enter a number between 3 and 40 inclusive: 41 
Invalid number, enter a number between 3 and 40 inclusive: 5 
1>45 
2>90 
3>57 
4>89 
5>32 
The average of all marks in this group is 32.0 
Program Ended. 
+2

'если (number_marks> 3 || number_marks <40)' всегда верно. (возможно, вы хотите '&&'?) – wildplasser

+0

У вас так много логических ошибок в вашем коде ... –

ответ

0

Прежде всего ваш if заявление является неправильным, потому что ваш должны проверить, если число находится вне границ 3-40, вы должны использовать <> в противоположном направлении. Таким образом, чтобы исправить это:

if(number_marks<3 || number_marks>40) 
{ 
    do{ 
    printf("Invalid number, enter a number between 3 and 40 inclusive: "); 
    scanf("%d",&number_marks); 
    } 
    while(number_marks<3 || number_marks>40); 
} 

Затем в той части, где вы вычислить среднее:

1) почему вы даже использовать a++ ???? просто используйте переменную i. это обычное, правильное и логичное

2) total=grade+grade+grade+grade+grade; класс всегда одна и та же переменная с один значение независимо от того, что вы делаете. Поэтому здесь он будет добавлять только последнее сохраненное значение пять раз, а затем разделить его на 5. Вот почему вы всегда получите последний класс в результате. Правильный способ сделать это - обновлениеtotal переменная.

3) Наконец average= (total/number_marks); должен находиться вне петли. Я также использовал (float)number_marks, чтобы убедиться, что результат этого расчета всегда является числом с плавающей точкой.

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

for(i=0;i<number_marks;i++) 
{ 
    printf("%d>",(i+1)); 
    scanf("%f",&grade); 
    total+=grade; 
} 
average = (total/(float)number_marks); 
printf("The average of all marks in this group is %.1f\n",average); 
printf("Program Ended."); 
0

Ошибка в том, что вы вычисляете общее число неправильно и среднее значение внутри цикла. Он должен быть

total=0; 
for(i=0;i<number_marks;i++) 
{ 
    printf("%d>",a++); 
    scanf("%f",&grade); 
    total=total+grade; 
}  
average= (total/number_marks); 

Вы эффективно найти 5 * класса каждый раз, и деления на 5, что приводит к выходу будучи последним экземпляром самого класса.

0
total = 0; 
for(i=0;i<number_marks;i++) 
{ 
     printf("%d>",a++); 
     scanf("%f",&grade); 
     total += grade; 

} 
average= (total/number_marks); 

Поместите среднее значение = (total/number_marks) вне цикла for. класс должен быть добавлен к сумме только один раз каждый раз.

Добавляя каждую метку, которую вы получаете в качестве входных данных, а затем поиск среднего значения будет ВСЕГДА в конечном итоге получать последнюю введенную метку в качестве средней.

0

Причина среднего показа последнего класса заключается в неправильной формуле переменной total. Каждый раз, когда текущий класс добавляется 5 раз и присваивается общей сумме, таким образом, последний присвоенный класс * 5 присваивается сумме. Кроме того, среднее должно также находиться вне цикла.

total = 0; 
    for(i=0;i<number_marks;i++) 
    { 
     printf("%d>",a++); 
     scanf("%f",&grade); 
     total=total+grade; 
    } 
    average = (total/number_marks); 
Смежные вопросы