第7講 for文以外の繰り返し処理
第6話 for文・while文・do...while文の関係
もう一度1+2+3+45+6+7+8+9+10のプログラミングを
for文とwhile文とdo...while文によって、それぞれ考えてみましょう。
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,w;
w=0;
for(i=1;i<11;i++)w+=i;
label1->Text=w.ToString();
i=1;
w=0;
while(i<11){
w+=i;
i++;
}
label2->Text=w.ToString();
i=1;
w=0;
do{
w+=i;
i++;
}while(i<11);
label3->Text=w.ToString();
}
};
}
実行結果例
どのプログラミングでも、合計値の算出に成功しています。
特に、while文とdo...while文に関しては、
i=1;
w=0;
while(i<11){
w+=i;
i++;
}
と
i=1;
w=0;
do{
w+=i;
i++;
}while(i<11);
でまったく同じです。
そして、for文に関しては
w=0;
for(i=1;i<11;i++)w+=i;
と圧倒的に記述が簡単です。
これだけを見ると、残念ながらfor文に軍配があがってしまいそうです。
しかし、1+2+3+・・・の計算を合計値が100を超えない範囲で計算しなさいという命令の場合は、
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,w;
w=0;
for(i=1;i<100;i++){
if(w+i+1<=100)w+=i;else break;
}
label1->Text=w.ToString();
i=1;
w=0;
while(i<100){
if(w+i+1<=100){
w+=i;
i++;
}
else break;
}
label2->Text=w.ToString();
i=1;
w=0;
do{
w+=i;
i++;
}while(w+i+1<=100);
label3->Text=w.ToString();
}
};
}
となります。計算部分だけを取り出すと、
for(i=1;i<100;i++){
if(w+i+1<=100)w+=i;else break;
}
label1->Text=w.ToString();
と
i=1;
w=0;
while(i<100){
if(w+i+1<=100){
w+=i;
i++;
}
else break;
}
と
i=1;
w=0;
do{
w+=i;
i++;
}while(w+i+1<=100);
で明らかに、do...while文に軍配があがります。
理由は、2点です。
for文とwhile文では、終わりの値がわからないので勘で100としています。
プログラミングを
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,w;
w=0;
for(i=1;i<100;i++){
if(w+i<=100)w+=i;else break;
}
label1->Text=i.ToString();
i=1;
w=0;
while(i<100){
if(w+i<=100){
w+=i;
i++;
}
else break;
}
label2->Text=i.ToString();
i=1;
w=0;
do{
w+=i;
i++;
}while(w+i<=100);
label3->Text=i.ToString();
}
};
}
と変更すると、
ですから、最後の値は14ということになります。
今回の問題は簡単ですから、最後の勘で100未満と判断できますが、
複雑な問題なら検討もつかない場合もあります。
この点do...while文の場合は、プログラマが終わりの値を算出したり、勘に頼ったり、しなくて済みます。
もう一つの問題は、for文とwhile文の方はif文を組み合わせないと、プログラムが組めない点です。
以上の2点から、合計値が100を超えない範囲で加算しなさいという命令に関しては、
do...while文に軍配があがります。
つまり、終わりの値がわからない場合は、do...while文を使った方がよいということになります。
さらに、do...while文の方が優れいる場合は
条件を満たしていなくても、1回は処理させたい場合です。
while文の場合は、条件を満たさないと1回も実行されません。
while(条件式){
・
・
・
}
と前にループ継続判定を行うので最初から条件を満たしていない場合は、処理は1回も行われません。
for文でも、条件がif文になりますが、このif文を考えるのが結構やっかいです。
まとめると、最後の値がはっきりしないときと条件を満たさなくても1回は処理させいたい場合は、
for文やwhile文よりdo...while文の方が向いているということです。
以上から、do...while文については存在の意義が認めていただけると思います。
では、for文とwhile文についてはどうでしょうか。
私が今回実験した範囲では、有意な差はありませんでしたが、
サイトによっては、while文の方が実行速度が速いとしているものもあります。
その真偽はわかりませんが、もし実行速度に差がなかったとしても、
while文はわかりやすいので、while文があった方が思考の幅は広がると思います。
実際、私がC言語で最初に作った魔方陣作成ソフトはwhile文によるものでした。
for文でも同様にできると気がついたのはずいぶん後のことですから、
while文の方が発想しやすいことを示しているのではないでしょうか。
いずれにしろプログラミングをするときには、引き出しを多くもっていた方がよいことは間違いないと思います。
以上で、第7講は終了して第8講の関数に進みたいと思います。
第5話へ 第8講第1話へ