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

まず、
for(i=0;i<2;i++){
  for(j=0;j<2;j++){
    if(i==0){
      v=a[j][j];
      a[j][j]=a[3-j][3-j];
      a[3-j][3-j]=v;
    }
    if(i==1){
      v=a[j][3-j];
      a[j][3-j]=a[3-j][j];
      a[3-j][j]=v;
    }
  }
}
からトレースしてみましょう。
T i=0の場合
 @ j=0のとき
   i=0なので
    if(i==0){
      v=a[j][j];
      a[j][j]=a[3-j][3-j];
      a[3-j][3-j]=v;
    }
   が実行される。
   j=0なので、
      v=a[0][0];
      a[0][0]=a[3][3];
      a[3][3]=v;      
    によって、a[0][0]とa[3][3]が交換されます。

 A j=1のとき
      v=a[1][1];
      a[1][1]=a[2][2];
      a[2][2]=v;      
    によって、a[1][1]とa[2][2]が交換されます。

U i=1の場合

    if(i==1){
      v=a[j][3-j];
      a[j][3-j]=a[3-j][j];
      a[3-j][j]=v;
    }
    が実行される。
    @ j=0のとき
      v=a[0][3];
      a[0][3]=a[3][0];
      a[3][0]=v;
    によって、a[0][3]とa[3][0]が交換される。

    @ j=1のとき
      v=a[1][2];
      a[1][2]=a[2][1];
      a[2][1]=v;
    によって、a[1][2]とa[2][1]が交換される。

以上によって、対角線のところがうまく交換されることがわかります。

a[i][3-i]
は、iが0から3間で動いていくとき、

逆対角線を動くことを頭に入れましょう。
もちろん
a[i][3-i]
のときは、iが0から3間で動いていけば、

と対角線上を動いていくことになります。

それでは

のように動かすには、
for文をどうしたらよいでしょうか。

のように数字とアスタリスクを入れるプログラミングを考えましょう。
解答は例によって20行下に示しましょう。























解答例
String^ w=L"";
char i;
char j;
for(i=0;i<4;i++){
  for(j=0;j<4;j++){
    a[i][j]=0;
  }
}
char x;
for(i=0;i<4;i++){
  x=(i+1) % 4;
  a[i][x]=i+1;
}
for(i=0;i<4;i++){
  for(j=0;j<4;j++){
    if(a[i][j]==0)w=w+L"* ";
    if(a[i][j]!=0)w=w+(a[i][j]).ToString()+L" ";
  }
  w=w+L"\n";
}
label1->Text=w;

解説
x=(i+1) % 4;
は(i+1)を4で割ったあまりを計算する式です。
トレースしてみましょう。

i=0のとき、
x=(0+1) % 4=1
からa[i][x]はa[0][1]=0+1=1
i=1のとき
x=(1+1) % 4=2
からa[1][2]=1+1=2
i=2のとき
x=(2+1) % 4=3
からa[2][3]=2+1=3
i=3のとき
x=(3+1) % 4=0
からa[3][0]=3+1=4




ならどうでしょうか。解答例は20行下に。

























解答例
for(i=0;i<4;i++){
  x=(i+1) % 4;
  a[i][x]=i+1;
}
の部分を
for(i=0;i<4;i++){
  x=(6-i) % 4;
  a[i][x]=i+1;
}

と変更する。
再びトレースしてみましょう。

i=0のとき、
x=(6-0) % 4=2
からa[0][2]=0+1=1
i=1のとき
x=(6-1) % 4=1
からa[1][1]=1+1=2
i=2のとき
x=(6-2) % 4=0
からa[2][0]=2+1=3
i=3のとき
x=(6-3) % 4=3
からa[3][3]=3+1=4



この話最終課題です。、

 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

の部分を2次元for文で実現するにはどうしたらよいでしょうか。
今回はかなり複雑です。
でもこれをfor文でできれば、あなたのプログラミングの腕は相当のものです。



第3話へ 第5話へ



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