第7講 for文以外の繰り返し処理
第5話 while文とdo...while文による2次元ループ
while文による2次元ループ例
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
//変数の宣言
int a[5][5],b[5][5],i,j;
String^ w=L"";
//aの自然配列データ作成
i=0;
while(i<5){
j=0;
while(j<5){
a[i][j]=5*i+j+1;
j++; //これを忘れると永久ループになる。
}
i++; //これを忘れると永久ループになる。
}
//データaの表示
i=0;
while(i<5){
j=0;
while(j<5){
if(a[i][j]<10)w+=L"0"+(a[i][j]).ToString()+L"
";
if(a[i][j]>=10)w+=(a[i][j]).ToString()+L" ";
j++; //これを忘れると永久ループになる。
}
w+=L"\n";
i++; //これを忘れると永久ループになる。
}
label1->Text=w;
//bのデータ(aの配置行列)作成
i=0;
while(i<5){
j=0;
while(j<5){
b[j][i]=5*i+j+1;
j++; //これを忘れると永久ループになる。
}
i++; //これを忘れると永久ループになる。
}
//データbの表示
i=0;
w=L"";
while(i<5){
j=0;
while(j<5){
if(b[i][j]<10)w+=L"0"+(b[i][j]).ToString()+L"
";
if(b[i][j]>=10)w+=(b[i][j]).ToString()+L" ";
j++; //これを忘れると永久ループになる。
}
w+=L"\n";
i++; //これを忘れると永久ループになる。
}
label2->Text=w;
//データaとデータbの合計の表示
i=0;
w=L"";
while(i<5){
j=0;
while(j<5){
if(a[i][j]+b[i][j]<10)w+=L"0"+(a[i][j]+b[i][j]).ToString()+L"
";
if(a[i][j]+b[i][j]>=10)w+=(a[i][j]+b[i][j]).ToString()+L"
";
j++; //これを忘れると永久ループになる。
}
w+=L"\n";
i++; //これを忘れると永久ループになる。
}
label3->Text=w;
}
};
}
do...while文による2次元ループ例
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
//変数の宣言
int a[5][5],b[5][5],i,j;
String^ w=L"";
//aの自然配列データ作成
i=0;
do{
j=0;
do{
a[i][j]=5*i+j+1;
j++; //これを忘れると永久ループになる。
}while(j<5);
i++; //これを忘れると永久ループになる。
}while(i<5);
//データaの表示
i=0;
do{
j=0;
do{
if(a[i][j]<10)w+=L"0"+(a[i][j]).ToString()+L"
";
if(a[i][j]>=10)w+=(a[i][j]).ToString()+L" ";
j++; //これを忘れると永久ループになる。
}while(j<5);
w+=L"\n";
i++; //これを忘れると永久ループになる。
}while(i<5);
label1->Text=w;
//bのデータ(aの配置行列)作成
i=0;
do{
j=0;
do{
b[j][i]=5*i+j+1;
j++; //これを忘れると永久ループになる。
}while(j<5);
i++; //これを忘れると永久ループになる。
}while(i<5);
//データbの表示
i=0;
w=L"";
do{
j=0;
do{
if(b[i][j]<10)w+=L"0"+(b[i][j]).ToString()+L"
";
if(b[i][j]>=10)w+=(b[i][j]).ToString()+L" ";
j++; //これを忘れると永久ループになる。
}while(j<5);
w+=L"\n";
i++; //これを忘れると永久ループになる。
}while(i<5);
label2->Text=w;
//データaとデータbの合計の表示
i=0;
w=L"";
do{
j=0;
do{
if(a[i][j]+b[i][j]<10)w+=L"0"+(a[i][j]+b[i][j]).ToString()+L"
";
if(a[i][j]+b[i][j]>=10)w+=(a[i][j]+b[i][j]).ToString()+L"
";
j++; //これを忘れると永久ループになる。
}while(j<5);
w+=L"\n";
i++; //これを忘れると永久ループになる。
}while(i<5);
label3->Text=w;
}
};
}
今回の例では、while文とdo...while文ではまったく差がありませんでした。
結局、問題の種類よっては、どちらでもよいもの、前判定のwhile文と方が向いているもの、do...while文の方が向いているもの
があることになります。
また、2次元ループはfor文を用いなくても作れることがわかりました。
本質的には、while文とdo...while文はfor文と同じです。
では、今回作ったwhile文とdo...while文の2次元ループをfor文に書き換えてみましょう。
解答例は、30行下。
解答例
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
//変数の宣言
int a[5][5],b[5][5],i,j;
String^ w=L"";
//aの自然配列データ作成
for(i=0;i<5;i++){
for(j=0;j<5;j++){
a[i][j]=5*i+j+1;
}
}
//データaの表示
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(a[i][j]<10)w+=L"0"+(a[i][j]).ToString()+L"
";
if(a[i][j]>=10)w+=(a[i][j]).ToString()+L" ";
}
w+=L"\n";
}
label1->Text=w;
//bのデータ(aの配置行列)作成
for(i=0;i<5;i++){
for(j=0;j<5;j++){
b[j][i]=5*i+j+1;
}
}
//データbの表示
w=L"";
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(b[i][j]<10)w+=L"0"+(b[i][j]).ToString()+L"
";
if(b[i][j]>=10)w+=(b[i][j]).ToString()+L" ";
}
w+=L"\n";
}
label2->Text=w;
//データaとデータbの合計の表示
w=L"";
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(a[i][j]+b[i][j]<10)w+=L"0"+(a[i][j]+b[i][j]).ToString()+L"
";
if(a[i][j]+b[i][j]>=10)w+=(a[i][j]+b[i][j]).ToString()+L"
";
}
w+=L"\n";
}
label3->Text=w;
}
};
}
結局、for文、while文、do...while文は対して違いがないんじゃないの?
それだったら、記述が簡単なfor文オンリーに絞った方がいいじゃないの?
こうした疑問があると思います。
for文・while文・do...while文の関係について、次話で考えてみたいと思います。
尚、第7講は第6話で終了の予定です。
ですから、次話が終われば卒業までは後3講ということになります。
ここまでついてこられた初心者の皆さんに敬意を表するともに、是非最後までのおつきあいをお願いいたします。
がんばりましょう!
第4話へ 第6話へ