繰り返し構文(while文)

    2012/05/19

    本章では下記の内容を学習します。

    • 繰り返し処理: while
    • 繰り返しを抜ける: break;
    • 無限ループ: while( 1 )
    • 判定位置の変更: do { ... } while ( );

    while 文による繰り返し

    while 文

    例1-while文による繰り返し
    #include <stdio.h>
    
    int main()
    {
      int     scan = 0;
      int     sum = 0;
    
      // 合計が100未満の場合は繰り返す
      // 100以上になったら、ループを抜ける
      while( sum < 100 )
      {
        printf( "整数値を入力=>" );
        scanf_s( "%d", &scan );
    
        sum += scan;
        printf( "現在の合計は%d\n", sum );
      }
    
      return  0;
    }
    

    プログラムの中で、ある一定の処理を繰り返し行わせたいという要求は必ず生まれます。単純作業の繰り返しこそが、プログラムの最も得意とする分野の一つです。

    while 文は、( ) 内の条件が満たされている間、{ } ブロック内の処理を繰り返し行うという構文です。今までのプログラムと大きく異なるのは、上から下へと流れていたプログラム実行が、while ブロックによって変わるという点にあります。

    while ブロックでは、{ } の最後に到達したら、while 文の ( ) 内のチェックに戻ります。このチェックに成功した場合は、ふたたび { } ブロックの頭から処理が繰り返されるのです。チェックに失敗した場合は、 { } ブロックを抜けて、そのまま次の処理が実行されます。

    while 文の ( ) 内のチェックは、最初に while 文へ入るときも行われます。もし初回からチェックに失敗するような場合は、while ブロックは一度も実行されません。最低限一度だけでも実行したいという場合は、後述の do-while 文を使ってください。

    例では、ユーザが入力した値を、変数 sum を使って加算し続けています。その合計が 100 を下回っている場合は、while ( ) のチェックが成功しますから、繰り返し処理が続行されます。100 以上になった時に、while ( ) のチェックが失敗して、while { } ブロックを抜けます。こうしてこのプログラムは、ユーザが合計 100 以上の値を入れるまで、繰り返し実行されるのです。

    練習問題: 条件の変更

    例題のチェック式を、500 未満に変更してください

    break 文

    例2-break文による抜け出し
    #include <stdio.h>
    
    int main()
    {
      int     scan = 0;
      int     sum = 0;
    
      // 合計が100未満の場合は繰り返す
      while( sum < 100 )
      {
        printf( "整数値を入力=>" );
        scanf_s( "%d", &scan );
    
        // 入力された値が0以下の場合は、処理を終了する
        if( scan <= 0 )
        {
            break;
        }
    
        sum += scan;
        printf( "現在の合計は%d\n", sum );
      }
    
      return  0;
    }
    

    while 文は、条件が満たす限り、ずっと処理を続けます。しかしながら、十分満足するだけの処理が行えたり、あるいは異常事態が発生したりなどの原因で、途中で処理をやめたくなる時もあるでしょう。

    break 文は、while ループの中にあらわれた場合、その段階で即座に while ループを抜け出す命令文です。switch 文での break 文が switch の抜け出しを意味していたのと似ています。

    break 文は、むき出しのまま while ループ内に配置していると、すぐに実行されてしまってループの意味をなさなくなります。ですから通常はif 文などと組み合わせて、ある条件になったら break する、といった使い方をします

    例ではユーザが入力した値が 0 以下の場合は、無効な数値とみなして、処理を強制的に抜け出す、という異常処理系のプログラムがなされています。

    無限ループ

    例3-無限ループ
    #include <stdio.h>
    
    int main()
    {
      int     scan = 0;
      int     sum = 0;
    
      // 条件式に「1」だけ書くと無限ループになる
      while( 1 )
      {
        printf( "整数値を入力=>" );
        scanf_s( "%d", &scan );
    
        // 入力された値が0以下の場合は、処理を終了する
        if( scan <= 0 )
        {
            break;
        }
    
        sum += scan;
        printf( "現在の合計は%d\n", sum );
      }
    
      return  0;
    }
    

    while のチェック部には、ふつう条件式を書くことになります。条件式は、成立していれば 1 を、成立していなければ 0 を返す演算でした。それではここに、条件式ではなく、変数や数値を直接書いた場合はどのようになるでしょうか?

    ( ) のチェック部に、1 という数値を直接書くと、そのループは無限ループになります。無限ループはその名の通り、ループを抜け出すことなく、永久に処理を繰り返すループです。このままだとプログラムは永遠に終了しないことになります。

    無限ループを抜け出すには、break 文を利用します。無限ループは break 文を使うことを前提としたループであるといえます。例では sum がいくつになっても抜け出すことはなくなりましたが、scan が 0 以下になれば break 文が働くことになりますので、このループがユーザの意思に関係なく永遠に繰り返すことはないようになっています。

    実践問題: 最大値を記憶する

    与えられた数値の中から、最大のものを記憶するプログラムを作成します。

    1. int max = 0; と初期化した変数を利用して、ユーザが max より大きな値を入れたら、それを記憶しなおすことで、常に最大値を覚えておくようなプログラムを作成してください。
    2. 上記のプログラムで、ユーザがマイナスの値を入れたら、終了するようにしてください

    do-while 文による後置判定

    #include <stdio.h>
    
    int main()
    {
      // 例4: do-while文による後置判定
      int     scan = 0;
      int     sum = 0;
    
      // 入力値が0を上回っている間は繰り返す
      do
      {
        sum += scan;
        printf( "現在の合計は%d\n", sum );
    
        printf( "整数値を入力=>" );
        scanf_s( "%d", &scan );
      }
      while( scan > 0 );
    
      return  0;
    }
    

    while 文では、最初のチェックに失敗すると、 { } ブロック内の処理は一度も実行されないまま終了すると説明しました。しかしながら、ブロック内の処理を最低一度だけは実行してほしいというシチュエーションも、少なからず存在します。

    do-while 文は、while 文でのチェックが { } ブロックの最後で行われるという構文です。例では scan の初期値は 0 にもかかわらず、while 文は実行されています。これは do-while ではチェックが { } ブロックの後ろであるため、最初に { } ブロックに入った段階ではチェックされないためです。

    do-while 文では、while ( ) チェックの部分の末尾に、セミコロンが必要になります。while 文では必要なかったものですから、注意が必要になります。よく間違います。