第9講 4次魔方陣と6次魔方陣の作成
第2話 交換

#pragma once
char a[4][4];
    ・
    ・
    ・
#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;
        }
  };
}

(コピーペースト用
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;
}


この後の課題は、
の1と16、6と11、4と13、7と10をいかに交換するかです。
例えば、Form1にlabal2を追加して次のようにプログラミングをしたらどうでしょうか。
#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"";
          a[0][0]=a[3][3];
          a[3][3]=a[0][0];
          a[1][1]=a[2][2];
          a[2][2]=a[1][1];
          a[0][3]=a[3][0];
          a[3][0]=a[0][3];
          a[2][1]=a[1][2];
          a[1][2]=a[2][1];
          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;

        }
  };
}

つまり、
a[0][0]=a[3][3];
a[3][3]=a[0][0];

で01と16を交換できるでしょうか。
ところがビルドして作成ボタンを押すと
となってうまくいきません。
どうしてでしょうか。
a[0][0]=a[3][3];
a[3][3]=a[0][0];

をトレースしてみましょう。
まず、
          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";
          }

によって、となっていました。
a[0][0]=a[3][3];により

からとなってしまい、
01は消えてしまうのです。
したがって、
a[3][3]=a[0][0];はまったく意味がないことがわかります。実は、1を消さないためには、もう一つ箱を用意しておく必要があります。

w=L"";
char v;
v=a[0][0];
a[0][0]=a[3][3];
a[3][3]=v;
v=a[1][1];
a[1][1]=a[2][2];
a[2][2]=v;
v=a[0][3];
a[0][3]=a[3][0];
a[3][0]=v;
v=a[1][2];
a[1][2]=a[2][1];
a[2][1]=v;
このようにプログラミングを変更してビルドすると、
となって、4次魔方陣が完成します。
交換の手法
w=a;
a=b;
b=w;
を是非とも覚えてください。

次の課題を出してこの話を閉じましょう。

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

 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


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

4次魔方陣が完成します。今回はこのプログラムに挑戦しましょう。


第1話へ 第3話へ



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