第5講 配列の学習

第4話 2次元配列の和・積
Form1例
l
#pragma once
#include<stdlib.h>
namespace 2次元配列 {
       ・
       ・
       ・
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
     //変数の宣言
     int i,j,a[10][10],b[10][10];
     String^ w;
 
     //2次元データの発生
     for(i=0;i<10;i++){
       for(j=0;j<10;j++){
         a[i][j]=rand()%100;
       }
     }
     for(i=0;i<10;i++){
       for(j=0;j<10;j++){
         b[i][j]=rand()%100;
       }
     }

     //2次元データの表示
     w=L"";
     for(i=0;i<10;i++){
       for(j=0;j<10;j++){
         if(a[i][j]<10)
           w=w+L"0"+a[i][j].ToString()+L" ";
         else
           w=w+a[i][j].ToString()+L" ";
         }
         w=w+L"\n";
       }
       label3->Text=w;
       w=L"";
       for(i=0;i<10;i++){
         for(j=0;j<10;j++){
           if(b[i][j]<10)
             w=w+L"0"+b[i][j].ToString()+L" ";
           else
             w=w+b[i][j].ToString()+L" ";
        }
        w=w+L"\n";
      }
      label4->Text=w;

      //和の表示
      w=L"";
      for(i=0;i<10;i++){
        for(j=0;j<10;j++){
          if(a[i][j]+b[i][j]<10)
            w=w+L"00"+(a[i][j]+b[i][j]).ToString()+L" ";
          else
            if(a[i][j]+b[i][j]<100)
               w=w+L"0"+(a[i][j]+b[i][j]).ToString()+L" ";
            else
               w=w+(a[i][j]+b[i][j]).ToString()+L" ";
        }
        w=w+L"\n";
      }
      label7->Text=w;

      //積の表示
      w=L"";
      for(i=0;i<10;i++){
        for(j=0;j<10;j++){
          if(a[i][j]*b[i][j]<10)
            w=w+L"000"+(a[i][j]*b[i][j]).ToString()+L" ";
          else
            if(a[i][j]*b[i][j]<100)
              w=w+L"00"+(a[i][j]*b[i][j]).ToString()+L" ";
            else
              if(a[i][j]*b[i][j]<1000)
                w=w+L"0"+(a[i][j]*b[i][j]).ToString()+L" ";
              else
                w=w+(a[i][j]*b[i][j]).ToString()+L" ";
        }
        w=w+L"\n";
      }
      label8->Text=w;
    
  }
};
}

やはり、
          if(a[i][j]*b[i][j]<10)
            w=w+L"000"+(a[i][j]*b[i][j]).ToString()+L" ";
          else
            if(a[i][j]*b[i][j]<100)
              w=w+L"00"+(a[i][j]*b[i][j]).ToString()+L" ";
            else
              if(a[i][j]*b[i][j]<1000)
                w=w+L"0"+(a[i][j]*b[i][j]).ToString()+L" ";
              else
                w=w+(a[i][j]*b[i][j]).ToString()+L" ";
の部分はわかりにくいですね。
すべて肯定表現にするとどうなりますか。
30行下に模範解答。



























#pragma once
#include<stdlib.h>
namespace 2次元配列 {
       ・
       ・
       ・
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
     //変数の宣言
     int i,j,a[10][10],b[10][10];
     String^ w;
 
     //2次元データの発生
     for(i=0;i<10;i++){
       for(j=0;j<10;j++){
         a[i][j]=rand()%100;
       }
     }
     for(i=0;i<10;i++){
       for(j=0;j<10;j++){
         b[i][j]=rand()%100;
       }
     }

     //2次元データの表示
     w=L"";
     for(i=0;i<10;i++){
       for(j=0;j<10;j++){
         if(a[i][j]<10)
           w=w+L"0"+a[i][j].ToString()+L" ";
         else
           w=w+a[i][j].ToString()+L" ";
         }
         w=w+L"\n";
       }
       label3->Text=w;
       w=L"";
       for(i=0;i<10;i++){
         for(j=0;j<10;j++){
           if(b[i][j]<10)
             w=w+L"0"+b[i][j].ToString()+L" ";
           else
             w=w+b[i][j].ToString()+L" ";
        }
        w=w+L"\n";
      }
      label4->Text=w;

      //和の表示
      w=L"";
      for(i=0;i<10;i++){
        for(j=0;j<10;j++){
         
 if(a[i][j]+b[i][j]<10)w=w+L"00"+(a[i][j]+b[i][j]).ToString()+L" ";
          if(a[i][j]+b[i][j]>=10 && a[i][j]+b[i][j]<100)w=w+L"0"+(a[i][j]+b[i][j]).ToString()+L" ";
          if(a[i][j]+b[i][j]>=100 && a[i][j]+b[i][j]<1000) w=w+(a[i][j]+b[i][j]).ToString()+L" ";

        }
        w=w+L"\n";
      }
      label7->Text=w;

      //積の表示
      w=L"";
      for(i=0;i<10;i++){
        for(j=0;j<10;j++){
          
if(a[i][j]*b[i][j]<10)w=w+L"000"+(a[i][j]*b[i][j]).ToString()+L" ";
          if(a[i][j]*b[i][j]>=10 && a[i][j]*b[i][j]<100)w=w+L"00"+(a[i][j]*b[i][j]).ToString()+L" ";
          if(a[i][j]*b[i][j]>=100 && a[i][j]*b[i][j]<1000) w=w+L"0"+(a[i][j]*b[i][j]).ToString()+L" ";
          if(a[i][j]*b[i][j]>=1000 && a[i][j]*b[i][j]<10000) w=w+(a[i][j]*b[i][j]).ToString()+L" ";

        }
        w=w+L"\n";
      }
      label8->Text=w;
    
  }
};
}

課題を出してこの話を閉めます。
第4講で作った成績一覧表の合計値・平均値・最大値・最小値・並び替えを
dataGridView1[*,*]を使わないで実現してみましょう。
もちろん表示させるときにはdataGridView1[*,*]を使うという条件ですよ。
つまり、
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           int i,j,max,min,w;

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

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

           //出席番号とランダムデータの発生
           for(i=1;i<=40;i++){
             dataGridView1[0,i]->Value =i+L" ";
             for(j=1;j<=5;j++){
               dataGridView1[j,i]->Value =rand()%101;
             }
           }

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

           
//行(横)合計・平均・合否・講評の算出と表示
           for(i=1;i<=40;i++){
             //合計・平均の算出
             w=0;
             for(j=1;j<=5;j++){
               w=w+(int)(dataGridView1[j,i]->Value);
             }
             //合計・平均の表示
             dataGridView1[6,i]->Value=w;
             dataGridView1[7,i]->Value=((double)w)/5;

            //合否の表示
            if(w>=250) dataGridView1[10,i]->Value=L"合格";
            if(w<250) dataGridView1[10,i]->Value=L"不合格";

            //講評の表示
            if(w>=350){
              dataGridView1[12,i]->Value=L"上位合格です。";
            }
            else{
              if(w>=280){
                dataGridView1[12,i]->Value=L"余裕で合格です。";
              }
              else{
                if(w>=250){
                   dataGridView1[12,i]->Value=L"ぎりぎり合格です。";
                }
                else{
                   if(w>=230){
                      dataGridView1[12,i]->Value=L"合格まで後一歩。";
                   }
                   else{
                      dataGridView1[12,i]->Value=L"よく勉強して再挑戦!";
                   }
                 }
               }
             }
           }

           //教科合計・平均の算出と表示
           for(i=1;i<=6;i++){
             //合計・平均の算出
             w=0;
             for(j=1;j<=40;j++){
               w=w+(int)(dataGridView1[i,j]->Value);
             }
             //合計・平均の表示
             dataGridView1[i,41]->Value=w;
             dataGridView1[i,42]->Value=w/40;
           }

           //各個人の最高点・最低点の算出と表示
           for(i=1;i<=40;i++){
             //各個人の最高点・最低点の算出
             max=0; min=100;
             for(j=1;j<=5;j++){
               if((int)(dataGridView1[j,i]->Value)>max)max=(int)(dataGridView1[j,i]->Value);
               if((int)(dataGridView1[j,i]->Value)<min)min=(int)(dataGridView1[j,i]->Value);
             }
             //各個人の最高点・最低点の表示
             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((int)(dataGridView1[i,j]->Value)>max)max=(int)(dataGridView1[i,j]->Value);
               if((int)(dataGridView1[i,j]->Value)<min)min=(int)(dataGridView1[i,j]->Value);
             }
             //各教科の最高点・最低点の表示
             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((int)(dataGridView1[6,j]->Value)<=min){
                 min=(int)(dataGridView1[6,j]->Value);
                 bn=j;
               }
             }
             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[11,i]->Value=i;
           }
           for(i=2;i<=40;i++){
             if((int)(dataGridView1[6,i-1]->Value)==(int)(dataGridView1[6,i]->Value))dataGridView1[11,i]->Value=dataGridView1[11,i-1]->Value;
           }


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


    }
};
}
青色部分のデータ処理部分(合計や順付けなど)を配列で処理し、それをDataGridViewに表示するように変更してください。
用意する配列は、int a[40][7]; とし、列ではAからFまで(すなわち出席番号から合計値まで)、行では2行目から41行目まで(つまり出席番号1から40まで)
を配列にコピーして処理して下さい。




第3話へ 第5話へ

025


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

数学研究室に戻る