第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++入門基礎講座へ