2016-06-09 6 views
0

Приносим извинения, если я не правильно форматирую свой вопрос. Я новичок в этом сайте и новичок в программировании.Мой вывод не отображается правильно

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

#include <stdio.h> 
#include <stdlib.h> 
#define SENTINAL -1 

double sumOfScores = 0; 
double examScore = 0; 
double sumOfExams = 0; 
double average = 0; 
double calculateAverage(); 

double main(void) 
{ 
    int i; 
    for (i = 1; i <= 4; ++i) 
    { 
     calculateAverage(); 
    } 
    return 0; 
} 

double calculateAverage() 
{ 
    printf("Enter %d to terminate program. \n", SENTINAL); 
    while(examScore != SENTINAL) 
    { 
     printf("Enter test score: \n"); 
     scanf("%lf", &examScore); 
     sumOfScores += examScore; 
     sumOfExams++; 
     average = sumOfScores/sumOfExams; 

    } 
    printf("The average of the test scores entered thus far is %.2lf \n\n", average); 

return 0; 
} 

Вот мой выход

Enter -1 to terminate program. 
Enter test score: 
99 
Enter test score: 
98 
Enter test score: 
97 
Enter test score: 
96 
Enter test score: 
-1 
The average of the test scores entered thus far is 77.80 

Enter -1 to terminate program. 
The average of the test scores entered thus far is 77.80 

Enter -1 to terminate program. 
The average of the test scores entered thus far is 77.80 

Enter -1 to terminate program. 
The average of the test scores entered thus far is 77.80 

Вот что я хотел бы, чтобы это выглядело как

Enter -1 to terminate program. 
Enter test score: 
99 
Enter test score: 
98 
Enter test score: 
97 
Enter test score: 
96 
Enter test score: 
-1 
The average of the test scores entered thus far is 77.80 

Enter -1 to terminate program. 
Enter test score: 
95 
Enter test score: 
94 
Enter test score: 
93 
Enter test score: 
92 
Enter test score: 
-1 
The average of the test scores entered thus far is (avg goes here) 

я не включил еще два набора чисел в выход, который я собираюсь, но я хотел бы иметь возможность сделать это с четырьмя наборами чисел. Как только я вхожу (-1), чтобы завершить первый набор чисел, он автоматически выплескивает меня из среднего значения первого набора для остальных 3 наборов, прежде чем я могу даже ввести числа, которые я хотел бы ввести для них. Кроме того, почему это дает мне avg 77.8 для первого набора значений, когда он должен быть в 90-х годах?

+1

После того, как вы «завершили» функцию 'calculateAverage', каково значение' examScore'? Решение состоит в том, чтобы не использовать глобальные переменные. –

+0

Благодарим @JoachimPileborg за быстрый ответ. Я сделал, как вы сказали (а также то, что сказал другой пользователь), и он исправил одну из проблем. Но значение «среднего», которое я получаю, по-прежнему не соответствует действительности. – lopezgera92

+0

'double main (void)' ??? Делает изменение от 'void main()' Я полагаю ... –

ответ

0

Я бы рекомендовал использовать локальные переменные, а не глобальные. То есть, переместить эти строки:

double sumOfScores = 0; 
double examScore = 0; 
double sumOfExams = 0; 
double average = 0; 

Здесь:

double calculateAverage() 
{ 
    double sumOfScores = 0; 
    double examScore = 0; 
    double sumOfExams = 0; 
    double average = 0; 
    // ... 

Это заставит переменные быть сброшены в 0 каждый раз, когда функция начинается, а не оставлять мусор от последнего времени функция выполнена.

Я думаю, что причина, по которой вы получаете неправильное среднее значение, состоит в том, что вы включаете -1 в качестве одного из результатов теста. Вы читаете значение, затем добавляете его в среднее значение до того, как вы проверите значение -1.

printf("Enter test score: \n"); 
scanf("%lf", &examScore); 
// Is examScore equal to -1 here? It might be. 
// Don't add it to sumOfScores without checking! 
sumOfScores += examScore; 
sumOfExams++; 
average = sumOfScores/sumOfExams; 

Вы либо должен проверить, если значение -1, прежде чем пересчитывать среднее, или вам необходимо перестроить свой цикл так, что examScore != SENTINAL проверки выполняется между чтением и перерасчетом среднего.

Кроме того, строго говоря, нет необходимости делать все вычисления усреднения, пока цикл все еще работает. Вы можете сохранить линию average = sumOfScores/sumOfExams; до окончания цикла. Просто мысль.

Как сказал Пол Р, у вас также есть неправильный прототип функции для вашей функции main. Действительные прототипы для функции main можно найти here

+0

спасибо за помощь – lopezgera92

+0

@ lopezgera92 Нет проблем! Если ваша проблема решена, обязательно отметьте ответ как «Принято». – bytesized

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