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