第9講 4次魔方陣と6次魔方陣の作成
第5話 for文による書き直しの解説その2


解答例
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
          char i;
          char j;
          String^ w="";

          for(i=0;i<4;i++){
            for(j=0;j<4;j++){
              a[i][j]=4*i+j+1;
              if(a[i][j]<10)w=w+L"0"+(a[i][j]).ToString()+L" ";
              if(a[i][j]>=10)w=w+(a[i][j]).ToString()+L" ";
            }
            w=w+L"\n";
          }
          label1->Text=w;
          w=L"";
          char v;
          for(i=0;i<2;i++){
            for(j=0;j<2;j++){
              if(i==0){
                v=a[0][1+j];
                a[0][1+j]=a[3][2-j];
                a[3][2-j]=v;
              }
              if(i==1){
                v=a[1+j][0];
                a[1+j][0]=a[2-j][3];
                a[2-j][3]=v;
              }

            }
          }
          for(i=0;i<4;i++){
            for(j=0;j<4;j++){
              if(a[i][j]<10)w=w+L"0"+(a[i][j]).ToString()+L" ";
              if(a[i][j]>=10)w=w+(a[i][j]).ToString()+L" ";
            }
            w=w+L"\n";
          }
          label2->Text=w;
        }
  };
}

(コピーペースト用
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
char i;
char j;
String^ w="";

for(i=0;i<4;i++){
for(j=0;j<4;j++){
a[i][j]=4*i+j+1;
if(a[i][j]<10)w=w+L"0"+(a[i][j]).ToString()+L" ";
if(a[i][j]>=10)w=w+(a[i][j]).ToString()+L" ";
}
w=w+L"\n";
}
label1->Text=w;
w=L"";
char v;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
if(i==0){
v=a[0][1+j];
a[0][1+j]=a[3][2-j];
a[3][2-j]=v;
}
if(i==1){
v=a[1+j][0];
a[1+j][0]=a[2-j][3];
a[2-j][3]=v;
}
}
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(a[i][j]<10)w=w+L"0"+(a[i][j]).ToString()+L" ";
if(a[i][j]>=10)w=w+(a[i][j]).ToString()+L" ";
}
w=w+L"\n";
}
label2->Text=w;
}
};
}


解説
for(i=0;i<2;i++){
  for(j=0;j<2;j++){
    if(i==0){
      v=a[0][1+j];
      a[0][1+j]=a[3][2-j];
      a[3][2-j]=v;
    }
    if(i==1){
      v=a[1+j][0];
      a[1+j][0]=a[2-j][3];
      a[2-j][3]=v;
    }

  }
}

の部分をトレースしてみましょう。

T i=0の場合
  if(i==0){
    v=a[0][1+j];
    a[0][1+j]=a[3][2-j];
    a[3][2-j]=v;
  }
  
 が実行される。
  @ j=0のとき、
    v=a[0][1+0]からv=a[0][1]
    右辺はa[3][2-0]からa[3][2]なので、2行目はa[0][1]=a[3][2]
    また、3行目はa[3][2]=v
    結局は、a[0][1]とa[3][2]の交換

  A j=1のとき、
    v=a[0][1+1]からv=a[0][2]
    右辺はa[3][2-1]からa[3][1]なので、2行目はa[0][2]=a[3][1]
    また、3行目はa[3][1]=v
    結局は、a[0][2]とa[3][1]の交換

U i=1の場合
  if(i==1){
    v=a[1+j][0];
    a[1+j][0]=a[2-j][3];
    a[2-j][3]=v;
  }

 が実行される。
  @ j=0のとき、
    v=a[1+0][0]からv=a[1][0]
    右辺はa[2-0][3]からa[2][3]なので、2行目はa[1][0]=a[2][3]
    また、3行目はa[2][3]=v
    結局は、a[1][0]とa[2][3]の交換

  A j=1のとき、
    v=a[1+1][0]からv=a[2][0]
    右辺はa[2-1][3]からa[1][3]なので、2行目はa[2][0]=a[1][3]
    また、3行目はa[1][3]=v
    結局は、a[2][0]とa[1][3]の交換

というわけでうまく

 1  2  3  4
 5  6  7  8
 9 10 11 12
13 14 15 16

    

 1 15 14  4
12  6  7  9
 8 10 11  5
13  3  2 16

が実現していることがわかります。

また、第9講の3話で

 1  2  3  4
 5  6  7  8
 9 10 11 12
13 14 15 16

    

16  2  3 13
 5 11 10  8
 9  7  6 12
 4 14 15  1


for(i=0;i<2;i++){
  for(j=0;j<4;j++){
    if((i==j) || (i==3-j) ){
      v=a[i][j];
      a[i][j]=a[3-i][3-j];
      a[3-i][3-j]=v;
    }
  }
}
でもできることを学習しました。
条件(i==j) || (i==3-j)

i==jが赤に,i==3-jが水色に対応していました。

これを参考にして、

 1  2  3  4
 5  6  7  8
 9 10 11 12
13 14 15 16

    

 1 15 14  4
12  6  7  9
 8 10 11  5
13  3  2 16

を実現するプログラムを考えましょう。

ただし、次に学習しますが、
(i==j) || (i==3-j)の否定は、
(i!=j) && (i!=3-j) 
であることに注意してください。
&&はandを意味します。
!=はイコールの否定で等しくないです。
また、||(or)の否定は&&(and)です。




第4話へ
 第6話へ



初心者のためのjava 入門 基礎から応用まで
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部

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