第5講 配列の学習

第8話 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,1+47*i]->Value =L"番号 ";
             dataGridView1[1,1+47*i]->Value =L"国語 ";
             dataGridView1[2,1+47*i]->Value =L"社会 ";
             dataGridView1[3,1+47*i]->Value =L"数学 ";
             dataGridView1[4,1+47*i]->Value =L"理科 ";
             dataGridView1[5,1+47*i]->Value =L"社会 ";
             dataGridView1[6,1+47*i]->Value =L"合計 ";
             dataGridView1[7,1+47*i]->Value =L"平均 ";
             dataGridView1[8,1+47*i]->Value =L"最高点 ";
             dataGridView1[9,1+47*i]->Value =L"最低点 ";
             dataGridView1[10,1+47*i]->Value =L"順位 ";
             dataGridView1[11,1+47*i]->Value =L"合否 ";
             dataGridView1[12,1+47*i]->Value =L"講評  ";

             //43行から46行 行見出し
             dataGridView1[042+47*i]->Value =L"合計 ";
             dataGridView1[0,43+47*i]->Value =L"平均 ";
             dataGridView1[0,44+47*i]->Value =L"最高点 ";
             dataGridView1[0,45+47*i]->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;
               }
             }
           }

           //出席番号とデータの表示
           for(i=0;i<=2;i++){
             for(j=1;j<=40;j++){
               dataGridView1[0,47*i+j+1]->Value=a[i][j-1][0];
             }
             for(j=1;j<=40;j++){
               for(k=1;k<=5;k++){
                 dataGridView1[k,47*i+j+1]->Value=a[i][j-1][k];
               }
             }
           }

           //各生徒の合計・平均の算出と表示
           for(i=0;i<=2;i++){
             for(j=1;j<=40;j++){
               a[i][j-1][6]=0;
               for(k=1;k<=5;k++){
                 a[i][j-1][6]=a[i][j-1][6]+a[i][j-1][k];
               }
               dataGridView1[6,47*i+j+1]->Value=a[i][j-1][6];
               dataGridView1[7,47*i+j+1]->Value=(double)(a[i][j-1][6])/5;
             }
           }

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

           //各生徒の合否・講評の算出と表示
           for(i=0;i<=2;i++){
             for(j=1;j<=40;j++){
               if(a[i][j-1][6]>=250)dataGridView1[11,47*i+j+1]->Value=L"合格";
               if(a[i][j-1][6]<250)dataGridView1[11,47*i+j+1]->Value=L"不合格";
             }
             for(j=1;j<=40;j++){
               if(a[i][j-1][6]>=350)dataGridView1[12,47*i+j+1]->Value=L"上位合格です。";
               if(a[i][j-1][6]<350 && a[i][j-1][6]>=280)dataGridView1[12,47*i+j+1]->Value=L"余裕で合格です。";
               if(a[i][j-1][6]<280 && a[i][j-1][6]>=250)dataGridView1[12,47*i+j+1]->Value=L"ぎりぎり合格です。";
               if(a[i][j-1][6]<250 && a[i][j-1][6]>=230)dataGridView1[12,47*i+j+1]->Value=L"後一歩で合格です。";
               if(a[i][j-1][6]<230)dataGridView1[12,47*i+j+1]->Value=L"かなりの努力が必要です。";
             }
           }

           //各教科の合計・平均・最高点・最低点の算出と表示
           for(i=0;i<=2;i++){
             for(j=1;j<=6;j++){
               w=0;
               for(k=1;k<=40;k++){
                 w=w+a[i][k-1][j];
               }
               dataGridView1[j,47*i+42]->Value=w;
               dataGridView1[j,47*i+43]->Value=((double)w)/40;
             }
             dataGridView1[7,47*i+42]->Value=((double)w)/5;
             dataGridView1[7,47*i+43]->Value=((double)w)/200;
             for(j=1;j<=6;j++){
               max=0;min=500;
               for(k=1;k<=40;k++){
                 if(a[i][k-1][j]>max)max=a[i][k-1][j];
                 if(a[i][k-1][j]<min)min=a[i][k-1][j];
               }
               dataGridView1[j,47*i+44]->Value=max;
               dataGridView1[j,47*i+45]->Value=min;
             }
           }

           //成績順並び替え
           int bn;
           Object^ w1;
           for(i=0;i<=2;i++){
             for(j=40;j>=2;j--){
               min=500;
               for(k=1;k<=j;k++){
                 if(a[i][k-1][6]<min){
                   min=a[i][k-1][6];
                   bn=k;
                 }
               }
               for(k=0;k<=6;k++){
                 w=a[i][bn-1][k];
                 a[i][bn-1][k]=a[i][j-1][k];
                 a[i][j-1][k]=w;
               }
               for(k=0;k<=12;k++){
                 w1=dataGridView1[k,47*i+bn+1]->Value;
                 dataGridView1[k,47*i+bn+1]->Value=dataGridView1[k,47*i+j+1]->Value;
                 dataGridView1[k,47*i+j+1]->Value=w1;
               }
             }
           }

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

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


         }

};
}

実行結果例
g

3次元配列、3次元ループとなって超難解になってしまいました。
難しくなりすぎてごめんなさい。
今回の課題が卒業研究ぐらいでもよかったですね。

解説は次話で行います。
課題を出しておきましょう。
今回の解答例では、3学期まで処理してありますが、
年間処理を行っていません。
各教科のデータは3学期の平均とします。
年間処理を行いましょう。


第7話へ 第9話へ

025


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

数学研究室に戻る