第5講 配列の学習

第7話 配列による成績一覧表の改良の解説その2

残りの部分を解説していきましょう。 

            //各個人の最高点・最低点の算出と表示
            for(i=1;i<=40;i++){
              //各個人の最高点・最低点の算出
              max=0; min=100;
              for(j=1;j<=5;j++){
                if(a[i-1][j]>max)max=a[i-1][j];
                if(a[i-1][j]<min)min=a[i-1][j];
              }
              //各個人の最高点・最低点の表示
              dataGridView1[8,i]->Value=max;
              dataGridView1[9,i]->Value=min;
            }

            //各教科の最高点・最低点の算出と表示
            for(i=1;i<=5;i++){
              //各教科の最高点・最低点の算出
              max=0; min=500;
              for(j=1;j<=40;j++){
                if(a[j-1][i]>max)max=a[j-1][i];
                if(a[j-1][i]<min)min=a[j-1][i];
              }
              //各教科の最高点・最低点の表示
              dataGridView1[i,43]->Value=max;
              dataGridView1[i,44]->Value=min;
            }

            //成績順並び替え
            int bn;
            Object^ w1; //Object^型変数の用意
   
            for(i=40;i>=2;i--){
              min=500;
              for(j=1;j<=i;j++){
                if(a[j-1][6]<=min){
                  min=a[j-1][6];
                  bn=j;
                }
              }
              for(j=0;j<=6;j++){
                w2=a[bn-1][j];
                a[bn-1][j]=a[i-1][j];
                a[i-1][j]=w2;
              }
              for(j=0;j<=12;j++){
                w1=dataGridView1[j,bn]->Value;
                dataGridView1[j,bn]->Value=dataGridView1[j,i]->Value;
                dataGridView1[j,i]->Value=w1;
              }
            }
                
           for(i=1;i<=40;i++){
             dataGridView1[10,i]->Value=i;
           }
           for(i=2;i<=40;i++){
             if(a[i-2][6]==a[i-1][6])dataGridView1[10,i]->Value=dataGridView1[10,i-1]->Value;
           }

           //出席番号順並び替え
           for(i=40;i>=2;i--){
             max=0;
             for(j=1;j<=i;j++){
               if(a[j-1][0]>max){
                 max=a[j-1][0];
                 bn=j;
               }
             }
             for(j=0;j<=6;j++){
               w2=a[bn-1][j];
               a[bn-1][j]=a[i-1][j];
               a[i-1][j]=w2;
             }
             for(j=0;j<=12;j++){
               w1=dataGridView1[j,bn]->Value;
               dataGridView1[j,bn]->Value=dataGridView1[j,i]->Value;
               dataGridView1[j,i]->Value=w1;
             }
           }

  

まず、最初
            //各個人の最高点・最低点の算出と表示
            for(i=1;i<=40;i++){
              //各個人の最高点・最低点の算出
              max=0; min=100;
              for(j=1;j<=5;j++){
                if(a[i-1][j]>max)max=a[i-1][j];
                if(a[i-1][j]<min)min=a[i-1][j];
              }
              //各個人の最高点・最低点の表示
              dataGridView1[8,i]->Value=max;
              dataGridView1[9,i]->Value=min;
            }

も教科合計の算出とときと同様に、a[行][列]を算出基準に使っている点以外は基本的に改良前と同じです。
つまり、(int)(dataGridView1[列,行]->Value);の代わりにa[行][列]を使っているだけです。
ですが、列数は同じですが行数が一つ少なくなっていることに注意が必要です。
以後の

            //各教科の最高点・最低点の算出と表示
            for(i=1;i<=5;i++){
              //各教科の最高点・最低点の算出
              max=0; min=500;
              for(j=1;j<=40;j++){
                if(a[j-1][i]>max)max=a[j-1][i];
                if(a[j-1][i]<min)min=a[j-1][i];
              }
              //各教科の最高点・最低点の表示
              dataGridView1[i,43]->Value=max;
              dataGridView1[i,44]->Value=min;
            }

            //成績順並び替え
            int bn;
            Object^ w1; //Object^型変数の用意
   
            for(i=40;i>=2;i--){
              min=500;
              for(j=1;j<=i;j++){
                if(a[j-1][6]<=min){
                  min=a[j-1][6];
                  bn=j;
                }
              }
              for(j=0;j<=6;j++){
                w2=a[bn-1][j];
                a[bn-1][j]=a[i-1][j];
                a[i-1][j]=w2;
              }
              for(j=0;j<=12;j++){
                w1=dataGridView1[j,bn]->Value;
                dataGridView1[j,bn]->Value=dataGridView1[j,i]->Value;
                dataGridView1[j,i]->Value=w1;
              }
            }
                
           for(i=1;i<=40;i++){
             dataGridView1[10,i]->Value=i;
           }
           for(i=2;i<=40;i++){
             if(a[i-2][6]==a[i-1][6])dataGridView1[10,i]->Value=dataGridView1[10,i-1]->Value;
           }

           //出席番号順並び替え
           for(i=40;i>=2;i--){
             max=0;
             for(j=1;j<=i;j++){
               if(a[j-1][0]>max){
                 max=a[j-1][0];
                 bn=j;
               }
             }
             for(j=0;j<=6;j++){
               w2=a[bn-1][j];
               a[bn-1][j]=a[i-1][j];
               a[i-1][j]=w2;
             }
             for(j=0;j<=12;j++){
               w1=dataGridView1[j,bn]->Value;
               dataGridView1[j,bn]->Value=dataGridView1[j,i]->Value;
               dataGridView1[j,i]->Value=w1;
             }
           }

についても列数は同じですが行数が一つ少なくなっていることに注意しなければならない点は同じです。

            //成績順並び替え
            int bn;
            Object^ w1; //Object^型変数の用意
   
            for(i=40;i>=2;i--){
              min=500;
              for(j=1;j<=i;j++){
                if(a[j-1][6]<=min){
                  min=a[j-1][6];
                  bn=j;
                }
              }
              for(j=0;j<=6;j++){
                w2=a[bn-1][j];
                a[bn-1][j]=a[i-1][j];
                a[i-1][j]=w2;
              }
              for(j=0;j<=12;j++){
                w1=dataGridView1[j,bn]->Value;
                dataGridView1[j,bn]->Value=dataGridView1[j,i]->Value;
                dataGridView1[j,i]->Value=w1;
              }

            }
                
           //順位付け
           for(i=1;i<=40;i++){
             dataGridView1[10,i]->Value=i;
           }
           for(i=2;i<=40;i++){
             if(a[i-2][6]==a[i-1][6])dataGridView1[10,i]->Value=dataGridView1[10,i-1]->Value;
           }

では、

              for(j=0;j<=12;j++){
                w1=dataGridView1[j,bn]->Value;
                dataGridView1[j,bn]->Value=dataGridView1[j,i]->Value;
                dataGridView1[j,i]->Value=w1;
              }

の部分に注目して下さい。
この部分はなくてもいいのですが、
将来、これを使って現在出席番号順になっているものの下に、
成績別一覧表も表示させるなどに使うかもしれないので、一応入れておきました。

           //出席番号順並び替え
           for(i=40;i>=2;i--){
             max=0;
             for(j=1;j<=i;j++){
               if(a[j-1][0]>max){
                 max=a[j-1][0];
                 bn=j;
               }
             }
             for(j=0;j<=6;j++){
               w2=a[bn-1][j];
               a[bn-1][j]=a[i-1][j];
               a[i-1][j]=w2;
             }

             for(j=0;j<=12;j++){
               w1=dataGridView1[j,bn]->Value;
               dataGridView1[j,bn]->Value=dataGridView1[j,i]->Value;
               dataGridView1[j,i]->Value=w1;
             }
           }


             for(j=0;j<=6;j++){
               w2=a[bn-1][j];
               a[bn-1][j]=a[i-1][j];
               a[i-1][j]=w2;
             }

についても同じです。
           //順位付け
           for(i=1;i<=40;i++){
             dataGridView1[10,i]->Value=i;
           }
           for(i=2;i<=40;i++){
             if(a[i-2][6]==a[i-1][6])dataGridView1[10,i]->Value=dataGridView1[10,i-1]->Value;
           }

の部分にも解説を入れておきましょう。
最初の3行

           
for(i=1;i<=40;i++){
             dataGridView1[10,i]->Value=i;
           }
では単純に1から40まで順位付けをしています。
しかし、これだと同点なのに違う順位がついてしまう場合があります。
j
f
その問題を解決するのが次の3行です。
           for(i=2;i<=40;i++){
             if(a[i-2][6]==a[i-1][6])dataGridView1[10,i]->Value=dataGridView1[10,i-1]->Value;
           }

合計得点が同じ場合、1つ前の出席番号の生徒の順位をその生徒の順位としてつけ直せば問題は解消します。


では、最後に課題です。
出席番号順成績一覧表の下に、
成績順別成績一覧表も表示させてみましょう。
その際、配列a[i][j]を使うことを条件とさせていただきます。

もし、40行7列の配列が中途半端だとお思いなら、
成績一覧表と同じ45行13列の配列を用意されても結構です。
40行7列の配列だと、再度合計点や講評などを処理しなければならないので非合理的かもしれません。
プログラミングは試行錯誤です。
自分で、あうでもないこうでもない、と思案を繰り返さないと上達はできません。
次話では、申し訳ありませんが模範解答例は示しません。
プログラミングは、プログラマーが意図した通りに動けば、正解です。
ですから、同じ課題であってもプログラマーの数だけ正解があるのです。
本講座で示してきた解答例は、あくまで例に過ぎないのです。

次話では、3次元配列を用意して、成績一覧表を3学期まで拡大し、
年間成績も処理してみたいと思います。
途中までのコーティングを掲載しておきますので、
それを参考に年間成績も考えてください。

#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           int i,j,k,max,min,w;

           //189行加える
           for(i=0;i<188;i++)dataGridView1->Rows->Add();

           for(i=0;i<4;i++){
             //1行目 見出し
             if(i==0)dataGridView1[0,47*i]->Value =L"1学期";
             if(i==1)dataGridView1[0,47*i]->Value =L"2学期";
             if(i==2)dataGridView1[0,47*i]->Value =L"3学期";
             if(i==3)dataGridView1[0,47*i]->Value =L"1年間";

             //2行目 列見出し
             dataGridView1[0,47*i+1]->Value =L"番号 ";
             dataGridView1[1,47*i+1]->Value =L"国語 ";
             dataGridView1[2,47*i+1]->Value =L"社会 ";
             dataGridView1[3,47*i+1]->Value =L"数学 ";
             dataGridView1[4,47*i+1]->Value =L"理科 ";
             dataGridView1[5,47*i+1]->Value =L"社会 ";
             dataGridView1[6,47*i+1]->Value =L"合計 ";
             dataGridView1[7,47*i+1]->Value =L"平均 ";
             dataGridView1[8,47*i+1]->Value =L"最高点 ";
             dataGridView1[9,47*i+1]->Value =L"最低点 ";
             dataGridView1[10,47*i+1]->Value =L"順位 ";
             dataGridView1[11,47*i+1]->Value =L"合否 ";
             dataGridView1[12,47*i+1]->Value =L"講評  ";

             //43行から46行 行見出し
             dataGridView1[0,47*i+42]->Value =L"合計 ";
             dataGridView1[0,47*i+43]->Value =L"平均 ";
             dataGridView1[0,47*i+44]->Value =L"最高点 ";
             dataGridView1[0,47*i+45]->Value =L"最低点 ";
           }

           //出席番号とランダムデータ発生
           int a[4][40][7];
           for(i=0;i<3;i++){
             for(j=1;j<=40;j++){
               a[i][j-1][0]=j;
             }
             for(j=1;j<=40;j++){
               for(k=1;k<=5;k++){
                 a[i][j-1][k]=rand()%101;
               }
             }
           }

         }
};
}

実行結果例

c
g


第6話へ 第8話へ

025


vc++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る