第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();

         }
};
}
と変更すると、
vc++
ですから、最後の値は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話へ


025


vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ



数学研究室に戻る