2012-05-04 204 views
0

我在獲取二維數組元素的最小值,最大值和平均值時遇到了問題。獲取二維數組中的平均值,最小值和最大值

我有一個包含學生和成績的二維數組。

我使用rand生成等級。例如當我輸入2,2打印出我

Courses : 01 02 Average Min Max 
    ID 
    01  8 50  29 
    02 74 59  29 

,我的平均功能取第一個平均值,並且不會取其他平均值。

這是我的代碼;

int A[30][30]; 

int findAverage(int noOfStudents ,int noOfGrades){ 

    float sum,average; 




    for (int i = 0 ; i < noOfGrades ; i++) { 
     for (int j = 0; j<noOfStudents; j++) { 

     sum += A[i][j]; 

     } 
     average = sum/noOfGrades; 
     // cout << " " << format(average); 
     sum = 0; 
     return format(average); 

    } 

在這裏我如何使用它

int main() { 

    int noOfCourses , noOfStudents; 
    cin >> noOfCourses >> noOfStudents; 
    cout << "Courses : " ; 

    for (int i = 0; i < noOfCourses; i++) { 
     if (i+1 >= 10) { 

      cout << i+1 << " "; 
     }else{ 
      cout <<"0" << i+1 << " "; 

     } 
    } 

    cout << "Average Min Max"; 

    for(int i=0; i<noOfStudents; i++) {   //This loops on the rows.   

     for(int j=0; j<noOfCourses; j++) {  //This loops on the columns 
      A[i][j] = genGrade(); 
     } 
    } 

    cout << "\n ID " << endl; 

    for(int i=0; i<noOfStudents; i++) { //This loops on the rows. 

     if (i+1 >= 10) { 

      cout <<" " << i+1 << " "; 
     }else{ 
      cout <<" 0" << i+1 << " "; 

     } 

     //cout <<" 0" << i+1 << " "; 

     for(int j=0; j<noOfCourses; j++) { //This loops on the columns 


      if (A[i][j] >= 10 && A[i][j] <=99) { 

       cout <<" " << A[i][j] << " "; 
      } 
      if(A[i][j] < 10) { 

       cout <<" " << A[i][j] << " "; 
      } 
      if (A[i][j] == 100) { 

       cout << A[i][j] << " "; 
      } 
     } 
     cout <<" "<<findAverage(noOfStudents,noOfCourses); 
     cout << endl; 
    } 
} 

我在做什麼錯?另外我怎麼能得到每陣列的最小值,最大值?

+0

什麼是'A'的聲明? –

+0

int A [30] [30]; ,對不起:) –

+0

在使用它之前,你還沒有初始化'sum',並且在外循環的第一次迭代中返回。有沒有理由不使用'std :: vector'來存儲數據,'std :: accumulate'來加起來呢?您可以通過'min_element'和'max_element'獲得最小值和最大值。 –

回答

0

的問題是,在你的findAverage功能,您有通過循環迴路內的return語句行。如果您想要一個非常簡單的修復程序,請在findAverage函數中添加另一個參數,以指示要計算哪個行的平均值。

int findAverage(int course ,int noOfGrades){ 

    float sum,average; 


    for (int j = 0; j<noOfStudents; j++) { 

     sum += A[course][j]; 

    } 
    average = sum/noOfGrades; 
    return format(average); 
} 

,並調用它

cout <<" "<<findAverage(i,noOfCourses); 
+0

準確的行啊,非常感謝。這工作得很好。 –

+0

您仍然必須將總和初始化爲0.0。 – Spidey

1

對於初學者來說,你是從你的循環內返回:

for (int i = 0 ; i < noOfGrades ; i++) { 
    for (int j = 0; j<noOfStudents; j++) { 
    ... 
    } 
    ... 
    return ...; 
} 

你能看到外環將只執行一次?

+0

但是,當兩個循環執行時,它只會打印出最新的一個,而不是第一個。 –

+0

這是因爲您在每個循環中重置了「sum」。 –

+0

瞭解,非常感謝! :) –

1

我強烈建議使用容器來完成此任務。例如,你可以做以下

typedef std::vector<float> grades; 
std::vector<grades> student_grades; 

//populate 

for(const grades& gr : student_grades) { 
    float min, max, avg; 
    std::tie(min, max)=std::minmax(gr.begin(), gr.end()); 
    avg=std::accumulate(gr.begin(), gr.end(), 0.0)/gr.size()); 
    std::cout << "Min" << min << " Max: " << max << " Avg: " << avg << std::endl; 
} 

http://en.cppreference.com/w/cpp/algorithm/minmax

http://en.cppreference.com/w/cpp/algorithm/accumulate

http://en.cppreference.com/w/cpp/utility/tuple/tie

+0

嗯,我沒有很多關於容器的想法。我瞭解矢量,但是什麼是領帶和積累呢?我需要一個額外的圖書館嗎? –

+0

std :: tie(min,max)= std :: minmax(gr.begin(),gr.end()); 該操作實際上做了什麼? –

+0

不,你不需要爲它們添加額外的庫,它們在標準庫中,accumulate將容器中的所有值相加,並且std :: minmax返回最小值和最大值的元組(值組) 。 std :: tie將該元組解壓縮到現有變量中。這是從函數返回多個值的非常乾淨,高效且現代的方法。我會添加一些對我的答案的引用。 – 111111

相關問題