2015-05-08 3 views
2

Мне нужно написать программу на C++, которую можно использовать для определения оценок в конце семестра. Для каждого ученика, который идентифицируется целым числом от 1 до 60, необходимо сохранить четыре экзаменационных класса. Кроме того, должны вычисляться две средние средние оценки. Среднее значение первого класса - это среднее значение для всех четырех классов. Средний средний класс рассчитывается путем взвешивания четырех сортов следующим образом: первый класс получает вес 0,2, второй класс получает вес 0,3, третий класс - 0,3, а четвертый класс - 0,2; который вычисляется следующим образом:Почему моя переменная weighted_grade не работает?

0,2 * grade1 + 0,3 * grade2 + 0,3 * grade3 + 0,2 * grade4

Используя эту информацию, вы построить 60 х 7 двумерный массив, в котором используется первый столбец для номера ученика, следующие четыре столбца для оценок и последние два столбца для вычисленных окончательных оценок. Результатом программы должно быть отображение данных в заполненном массиве.

Вот что у меня есть, но мое второе среднее значение отключено. Например, у моего 1-го ученика должно быть как среднее значение 100. Однако Avg2 выходит равным 1000, и я понятия не имею, почему. Помогите?

#include <iostream> 
#include <math.h> 
using namespace std; 

int grade_Calc(int sg[][5]); 

int main() 
{ 
    int student_grades[5][5] = 
{ 
    {1, 100, 100, 100, 100}, //inputs an array of students 1-5's grades 
    {2, 100, 0, 100, 0}, 
    {3, 82, 94, 73, 86}, 
    {4, 64, 74, 84, 94}, 
    {5, 94, 84, 74, 64}, 
}; 

grade_Calc(student_grades); 
return 0; 
} 


int grade_Calc(int sg[][5]) 
{ 
int sum_for_avg = 0; 
double weighted_grade = 0.0; 
double simple_avg = 0.0; 
double sum2 = 0.0; 

cout << "Stdnt" << "\t" << "Grd1" << "\t" << "Grd2" << "\t" << "Grd3" << "\t" << "Grd4" << "\t" << "Avg1" << "\t" << "Avg2" << endl; 
for (int r = 0; r < 5; r++) 
{ 
    for (int c = 0; c < 5; c++) 
    { 
     cout << sg[r][c] << "\t\t"; 

     if (c != 0) 
     { 
      sum_for_avg += sg[r][c]; 
      if ((c == 1) || (c == 4)) 
      { 
       weighted_grade += (0.3 * sg[r][c]); 
      } 
      else 
      { 
       weighted_grade += (0.2 * sg[r][c]); 
      } 
     } 
    } 

    simple_avg = (sum_for_avg/4.0); 
    cout << "\t" << simple_avg << "\t" << weighted_grade; 
    for (int k = 0; k < 5; k++) 
    { 
     if (k != 0) 
     { 
      sum2 += pow((sg[r][k] - simple_avg), 2); 
     } 
    } 

    cout << sqrt(sum2/4.0); 
    sum_for_avg = 0; 
    weighted_grade = 0.0; 
    cout << endl; 
} 
return 0; 
} 
+0

Вы обновили вопрос по другому запросу. Это сбивает с толку, так как сейчас уже есть ответы на старые. Я думаю, вы должны открыть новый вопрос, чтобы мы могли начать с чистой точки. Конечно, вы можете поместить ссылку на новую здесь и ссылку на эту в новой. –

ответ

3

Вы должны сбросить значение sum_for_avg для каждого студента, в каждой строке вашего стола, то есть, в начале вашего for цикла по r. Так оно и есть, оно начинается правильно в 0 для первого ученика, но затем для каждого последующего ученика начинается с того значения, которое у вас уже есть.

EDIT: получается, я был слишком поспешным. sum_for_avgis Сброс после всех - просто нет, где бы я это сделал, то есть он сбрасывается в конце цикла. Таким образом, среднее право. Что происходит, так это то, что вы также печатаете другое значение, которое является стандартным отклонением, и поскольку нет пробелов, это выглядит как 1000, тогда как это конкатенация 100 и 0. Затем опять стандартное отклонение также неверно, по той причине, что я дал в начале: вы не сбрасываете его. Поэтому добавьте эту строку:

sum2 = 0; 

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

1

На самом деле Avg2 выходит 100. Но затем запустить этот бит кода по причинам, не изложенных в вашем вопросе:

for (int k = 0; k < 5; k++) 
{ 
    if (k != 0) 
    { 
     sum2 += pow((sg[r][k] - simple_avg), 2); 
    } 
} 

cout << sqrt(sum2/4.0); 

соиЬ в конце пишет 0 сразу после Avg2-х 100 так выглядит как это печать 1000.

Итак, распечатайте:

Stdnt Grd1 Grd2 Grd3 Grd4 Avg1 Avg2 
1  100  100  100  100  100  100 

, а затем идет вдоль cout << sqrt(sum2/4.0); т о распечатать другой 0, и вы получите

Stdnt Grd1 Grd2 Grd3 Grd4 Avg1 Avg2 
1  100  100  100  100  100  1000 

Clean этот бит кода, и вы увидите ошибку осквернена @Fabio Турати.

+0

Я исправил это. У меня тоже есть другой вопрос. Посмотрите мое обновление. Это может выглядеть hella noobish, но мое обучение в бимолекулярной инженерии и биохимии LOL. Мне нужно сохранить свои средние значения в массиве, чтобы я мог что-то с ними делать. Как я могу это сделать? –

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