第7講 for文以外の繰り返し処理

第5話 while文とdo...while文による2次元ループ

while文による2次元ループ例
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           //変数の宣言
           int a[5][5],b[5][5],i,j;
           String^ w=L"";

           //aの自然配列データ作成
           i=0;
           while(i<5){
             j=0;
             while(j<5){
               a[i][j]=5*i+j+1;
               j++;    //これを忘れると永久ループになる。
             }
             i++;    //これを忘れると永久ループになる。
           }

           //データaの表示
           i=0;
           while(i<5){
             j=0;
             while(j<5){
               if(a[i][j]<10)w+=L"0"+(a[i][j]).ToString()+L" ";
               if(a[i][j]>=10)w+=(a[i][j]).ToString()+L" ";
               j++;   //これを忘れると永久ループになる。
             }
             w+=L"\n";
             i++;   //これを忘れると永久ループになる。
           }
           label1->Text=w;

           //bのデータ(aの配置行列)作成
           i=0;
           while(i<5){
             j=0;
             while(j<5){
               b[j][i]=5*i+j+1;
               j++;  //これを忘れると永久ループになる。
             }
             i++;  //これを忘れると永久ループになる。
           }

           //データbの表示
           i=0;
           w=L"";
           while(i<5){
             j=0;
             while(j<5){
               if(b[i][j]<10)w+=L"0"+(b[i][j]).ToString()+L" ";
               if(b[i][j]>=10)w+=(b[i][j]).ToString()+L" ";
               j++;   //これを忘れると永久ループになる。
             }
             w+=L"\n";
             i++;   //これを忘れると永久ループになる。
           }
           label2->Text=w;

           //データaとデータbの合計の表示
           i=0;
           w=L"";
           while(i<5){
             j=0;
             while(j<5){
               if(a[i][j]+b[i][j]<10)w+=L"0"+(a[i][j]+b[i][j]).ToString()+L" ";
               if(a[i][j]+b[i][j]>=10)w+=(a[i][j]+b[i][j]).ToString()+L" ";
               j++;   //これを忘れると永久ループになる。
             }
             w+=L"\n";
             i++;   //これを忘れると永久ループになる。
           }
           label3->Text=w;
         }
};
}

do...while文による2次元ループ例
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           //変数の宣言
           int a[5][5],b[5][5],i,j;
           String^ w=L"";

           //aの自然配列データ作成
           i=0;
           do{
             j=0;
             do{
               a[i][j]=5*i+j+1;
               j++;    //これを忘れると永久ループになる。
             }while(j<5);
             i++;    //これを忘れると永久ループになる。
           }while(i<5);

           //データaの表示
           i=0;
           do{
             j=0;
             do{
               if(a[i][j]<10)w+=L"0"+(a[i][j]).ToString()+L" ";
               if(a[i][j]>=10)w+=(a[i][j]).ToString()+L" ";
               j++;   //これを忘れると永久ループになる。
             }while(j<5);
             w+=L"\n";
             i++;   //これを忘れると永久ループになる。
           }while(i<5);
           label1->Text=w;

           //bのデータ(aの配置行列)作成
           i=0;
           do{
             j=0;
             do{
               b[j][i]=5*i+j+1;
               j++;  //これを忘れると永久ループになる。
             }while(j<5);
             i++;  //これを忘れると永久ループになる。
           }while(i<5);

           //データbの表示
           i=0;
           w=L"";
           do{
             j=0;
             do{
               if(b[i][j]<10)w+=L"0"+(b[i][j]).ToString()+L" ";
               if(b[i][j]>=10)w+=(b[i][j]).ToString()+L" ";
               j++;   //これを忘れると永久ループになる。
             }while(j<5);
             w+=L"\n";
             i++;   //これを忘れると永久ループになる。
           }while(i<5);
           label2->Text=w;

           //データaとデータbの合計の表示
           i=0;
           w=L"";
           do{
             j=0;
             do{
               if(a[i][j]+b[i][j]<10)w+=L"0"+(a[i][j]+b[i][j]).ToString()+L" ";
               if(a[i][j]+b[i][j]>=10)w+=(a[i][j]+b[i][j]).ToString()+L" ";
               j++;   //これを忘れると永久ループになる。
             }while(j<5);
             w+=L"\n";
             i++;   //これを忘れると永久ループになる。
           }while(i<5);
           label3->Text=w;
         }
};
}

今回の例では、while文とdo...while文ではまったく差がありませんでした。
結局、問題の種類よっては、どちらでもよいもの、前判定のwhile文と方が向いているもの、do...while文の方が向いているもの
があることになります。

また、2次元ループはfor文を用いなくても作れることがわかりました。
本質的には、while文とdo...while文はfor文と同じです。
では、今回作ったwhile文とdo...while文の2次元ループをfor文に書き換えてみましょう。
解答例は、30行下。









































解答例
#pragma endregion
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           //変数の宣言
           int a[5][5],b[5][5],i,j;
           String^ w=L"";

           //aの自然配列データ作成
           for(i=0;i<5;i++){
             for(j=0;j<5;j++){
               a[i][j]=5*i+j+1;
             }
           }

           //データaの表示
           for(i=0;i<5;i++){
             for(j=0;j<5;j++){
               if(a[i][j]<10)w+=L"0"+(a[i][j]).ToString()+L" ";
               if(a[i][j]>=10)w+=(a[i][j]).ToString()+L" ";
             }
             w+=L"\n";
           }
           label1->Text=w;

           //bのデータ(aの配置行列)作成
           for(i=0;i<5;i++){
             for(j=0;j<5;j++){
               b[j][i]=5*i+j+1;
             }
           }

           //データbの表示
           w=L"";
           for(i=0;i<5;i++){
             for(j=0;j<5;j++){
               if(b[i][j]<10)w+=L"0"+(b[i][j]).ToString()+L" ";
               if(b[i][j]>=10)w+=(b[i][j]).ToString()+L" ";
             }
             w+=L"\n";
             }
             label2->Text=w;

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

結局、for文、while文、do...while文は対して違いがないんじゃないの?
それだったら、記述が簡単なfor文オンリーに絞った方がいいじゃないの?
こうした疑問があると思います。
for文・while文・do...while文の関係について、次話で考えてみたいと思います。

尚、第7講は第6話で終了の予定です。
ですから、次話が終われば卒業までは後3講ということになります。
ここまでついてこられた初心者の皆さんに敬意を表するともに、是非最後までのおつきあいをお願いいたします。
がんばりましょう!


第4話へ 第6話へ


025


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



数学研究室に戻る