第5講 配列の学習

第10話 3次元配列の利用による年間成績一覧表の作成の解説その2
    
今日は残りを解説しましょう。


           //各生徒の合否・講評の算出と表示
           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;
               }
             }

           }






    '各学期合否・講評の算出・表示
           //各生徒の合否・講評の算出と表示
           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"かなりの努力が必要です。";
             }
           }

は合否と講評です。わかりやすさを優先してIf...Else...文は使わず、すべて肯定表現
               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++)
となっていますので同様なことを3回繰り返しています。
1回目が1学期、2回目が2学期、3回目が3学期です。
すべての処理が3回繰り返されます。


           //各教科の合計・平均・最高点・最低点の算出と表示
           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;

             }
           }

ここでは、各学期の各教科および合計点の合計を計算して、
それぞれの合計と平均を表示しています。
rty
xcv
               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;

では赤の枠を計算しています。平均は小数になってしまうので、配列の対象にしていませんでした。
そこで茶色の枠の値を使い、平均の合計と平均の平均を計算しています。
合計の合計を5教科の5で割れば、平均の合計値になります。
また、合計の合計を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;
             }

          
 }

では、
fgsdfg
の表示をしています。ここでも、


超難解な
           //成績順並び替え
           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;
               }
             }
           }   

ですが、 a[i][j-1][k]のj-1とdataGridView1[k,47*i+j+1]->Valueのj+1の間に2つのずれがあることを把握すれば、
第7話で解説したものと代わりありません。第7話では1つのずれだったのが2つになったのは、各学期の見出し行vdvdに1行追加したからです。
見出し行と列見出しの2行分ずれているわけです。



           //順位付け
           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;
             }
           }

第7話で解説したとおりです。それが3回繰り返されている点以外は変わりません。


           //出席順並び替え
           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;
               }
             }
           }

については、
           //成績順並び替え
           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;
               }
             }
           }       

と基本的に同じです。
基準になっているのがa[i][k-1][6]a[i][k-1][0]の違いと
降順と昇順の違いがあるだけです。a[i][k-1][6]とは合計値、a[i][k-1][0]とは出席番号でした。



この講は難解になってしまって申し訳ありません。
成績一覧表を題材にしてしまったことが原因です。
これでこの講は閉じて、次講ではC言語のもっとも大きな特徴の1つであるポインタについて学習していきます。



第9話へ 第6講第1話へ

025


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

数学研究室に戻る