while文「〜の間は繰り返す」 | 技術者が教える初心者さんのためのC言語

技術者が教える初心者さんのためのC言語

〜最小限の知識でプログラム〜

いつも感謝しています。Nです。

前回までの3つの記事
if文「もし~だったら・・・」
else「そうでなくて!」
switch文「~の時はこう!」
で条件分岐をお話してきました。

今日から、繰り返し処理(ループ処理)についてお話したいと思います。

「構造化定理」と呼ばれる定理があって、その定理によるとプログラムのアルゴリズムは以下の3つの基本的ロジックを組み合わせることで、全て書けてしまうと述べられています。

その3つの基本的ロジックとは、
順次
選択
繰り返し
です。

「順次」とは、「上から下に順番に実行文を書く」
「選択」とは、「条件分岐させて実行文を書く」
この2つは、すでに皆さんにこのブログを通してお話ししてきました。

実際、私も長年プログラムをしていて、細かいテクニックとかは、もちろんあるが、
この「順次」「選択」「繰り返し」の3つのロジックを基本的に組み合わせてプログラムをしているし、実際書けてしまうなぁと実感しています。

ですから、
今回からのテーマ「繰り返し」をマスターすることで、皆さんもこの3つを手に入れることができます。是非、「繰り返し」もマスターしこの3つの能力を手にいれてくださいね。

では、具体的に今日のテーマ「while文:~の間は繰り返す」についてお話していきます。

while文とは、同じことをある条件が成立している間は何度も行うという処理のことです。
while文の基本形としては、

while( 条件 )
{
 実行文;
}

while( 条件 )の部分では、「この条件が成立している間は」という意味になります。
{  }の中の部分が、「その間は、この処理を繰り返しなさい」という意味になります。

たとえば、「体力がある間は、働く」というのを考えてみましょう。

日本語を介したイメージ的なプログラムを書くならば、

while( 体力がある)
{
    働く
}

のような感じになります。

実際のプログラムの一例として書くならば

int  main( void )
{
    int   hp;   /* 体力 */

 hp = 10;  /* 体力の初期値 */

    while(  hp > 3 )
    {
        /*  体力が3より大きい間は */
  printf(" HP=%d ¥t", hp);
  printf("I work !!¥n");
       /*  体力1ずつ減少 */
     hp--;
    }
    return( 0 );
}

実行結果:
HP=10   I work !!
HP=9     I work !!
HP=8     I work !!
HP=7     I work !!
HP=6     I work !!
HP=5     I work !!
HP=4     I work !!

のようになります。実際にプログラムを書いて実行して確認してみましょうね。

さて、while文のもう一つの形として、

do
{
   実行文;
} while( 条件 );

というのもあります。

do{  }の部分では、「まずは有無を言わさず、{  }する」という意味になります。
while( 条件 );の部分で、「条件が成立しているなら、また繰り返す」という意味になります

先ほどの体力の例でプログラムを書くと

int  main( void )
{
    int   hp;   /* 体力 */

 hp = 10;  /* 体力の初期値 */

    do
    {
        /*  以下を実行する! */
  printf(" HP=%d ¥t", hp);
  printf("I work !!¥n");
       /*  体力1ずつ減少 */
     hp--;
    } while( hp > 3 );

    return( 0 );
}

実行結果:
HP=10   I work !!
HP=9     I work !!
HP=8     I work !!
HP=7     I work !!
HP=6     I work !!
HP=5     I work !!
HP=4     I work !!

のようになります。

ここで、「あれ?、while文とdo~while文の実行結果一緒だなぁ?」と思われた方がいると思います。「すごく、良いセンスをしている」と思います。

では、上記のwhile文の例、do~while文の例の中の、

hp = 10;  /* 体力の初期値 */ → hp = 2;  /* 体力の初期値 */

にして、実行しなおしてみてください。

どうなりましたか?
次の実行結果は、出来れば実際に実行してからみてくださいね。


whileの例の実行結果:
何も表示されない
do~whileの例の実行結果:
HP=2     I work !!

そう、
while文の場合は、最初に条件をみて繰り返しを実行するかどうかを決定します。
一方、
do~while文の場合は、ともかく”do”、する、そして条件を見て次繰り返すかどうかを決定する

という違いがあります。

今回の体力のプログラムの例をイメージ的に例えると、

while文の例は、
「会社に行く前に、今日は体力ないなぁ」と自己判断し、会社を休んだ。
do~while文の例は、
「ともかく会社に行って働いた、でも今日体力ない」と分かり、会社を早退した。

みたいなイメージですかね(笑)。

以上のことを、while文では押さえておけば良いかと思います。
また、while文とdo~while文の違いが、まだいまいち掴めないなぁという方は、まずは、while文だけでもマスターしましょうね。
(私の経験則では、do~while文はあまり使わないかなぁという感じがしています)