2012-05-04 25 views
0

2D配列の要素の最小値、最大値、平均値の取得に問題があります。2D配列の数値の平均値、最小値、最大値の取得

私は学生と成績を含む2D配列を持っています。

私はrandでグレードを生成しています。私はそれが

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

私を出力し、2,2を入力した場合たとえば、私の平均機能は、平均して他の人が平均取るdoesntの最初のものになります。

ここは私のコードです。私は

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; 
    } 
} 

それを使用する方法

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); 

    } 

と、ここで私が間違って何をしているのですか?また、配列ごとにどのようにmin、maxを得ることができますか?手始めに

+0

のようにそれを呼び出しますか –

+0

int A [30] [30]; 、申し訳ありません:) –

+0

あなたは 'sum'を使用する前に初期化しておらず、外側ループの最初の反復中に戻ります。データを格納するために 'std :: vector'を使用しない理由と、値を追加するために' std :: accumulate'を使用する理由はありますか? 'min_element'と' max_element'でminとmaxを得ることができます。 –

答えて

0

を行うことができます行。非常に簡単な修正が必要な場合は、平均を計算する行を示す別のパラメータを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); 
} 

と `A`の宣言は何ですか?この

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

ああ、ありがとう。それはかなりうまくいった。 –

+0

まだsumを0.0に初期化する必要があります。 – Spidey

1

、あなたのループ内から戻ってきている。

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

あなたは外側のループは、これまで一度だけ実行されますどのように見ることができますか?

+0

しかし、両方のループが実行されると、最初のものの代わりに最新のものが表示されます –

+0

これは、各ループで 'sum'をリセットするためです。 –

+0

ご理解いただきありがとうございます! :) –

1

このタスクでは、コンテナを使用することを強くおすすめします。たとえば、あなたは、問題があなたのfindAverage機能であなたを介してループしているループ内でreturnステートメントを持っているということである以下の

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(最小、最大)= std :: minmax(gr.begin()、gr.end()); その操作は実際に何をしていますか? –

+0

標準ライブラリーにある余分なライブラリーは必要ありません。蓄積するとコンテナ内のすべての値が加算され、std :: minmaxは最小値と最大値のタプル(値のグループ化)を返します。 std :: tieはそのタプルを既存の変数に展開します。これは、関数から複数の値を返す非常にきれいで効率的で現代的なアプローチです。私は私の答えにいくつかの参照を追加します。 – 111111