2015-05-08 55 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的二維陣列,其中使用所述第一列學生人數,成績的接下來的四列和計算出的最終成績的最後兩列。程序的輸出應該是完整數組中數據的顯示。

這是我的,但我的第二個平均值是關閉的。例如,我的第一個學生的平均數應該是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開始,但對於每個下一個學生,它從您已有的值開始。

編輯:原來我太倉促了。 sum_for_avg畢竟重置 - 只是不是我會這樣做,也就是說,它在循環結束時重置。所以平均值是正確的。發生的事情是,你還打印另一個值,這是標準偏差,由於沒有空格,它看起來像是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); 

末的COUT爲AVG2的100所以後馬上寫一個0看起來像它的打印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 

清除該位了,你會發現通過@Fabio圖拉蒂發現的bug。

+0

我修正了這個問題。我還有另一個問題。看看我的更新。這可能看起來好像不太好,但我的訓練是雙分子工程和生物化學。我需要將我的平均值保存到一個數組,以便我可以對它們做些什麼。我怎麼能這樣做? –