5回目の授業


3回目の授業の課題について



第4章

プログラムの流れの繰り返しのための制御文



 今回は,C言語の制御文のうち,特にプログラムの流れの繰り返しのための制御文について学びます。


構文その1

 ある条件式が成立している間は,ある命令文を何回も実行したい場合には,以下のような形式でプログラムを書きます。
    while( 条件式 ) 条件式が成立している間に実行すべき命令文 ;

 実行すべき命令文が複数あるような場合には . . .

それら複数の命令文を,{ } で囲んで複合文にする,ということは前回学びましたね。つまり以下のようにすればよいということです。
    while( 条件式 )
    {
        条件式が成立している間に実行すべき命令文その1 ;
        条件式が成立している間に実行すべき命令文その2 ;
           .
           .
           .
    }

構文その2

 上の構文に見た目が似たものとして,以下のような構文があります。
    do
    {
        条件式が成立している間に実行すべき命令文その1 ;
        条件式が成立している間に実行すべき命令文その2 ;
           .
           .
           .
    }while( 条件式 ) ;

 構文その1と構文その2は,どのような違いがあるのでしょうか?

それは,

構文その1 がループの冒頭で条件式の真偽を判断する

のに対して,

構文その2 ではループの最後で条件式の真偽を判断する

という違いになります。すなわち,

構文その2 はループ本体が必ず一度は実行されることになります。

それに対して,

構文その1 では,条件式が最初から偽となった場合には,ループ本体は一度も実行されずに終わることになります。

(注意) do... while文の場合は,最後の while( 条件式 ) の後に,; (セミコロン)が必要であることを忘れないで下さい。


構文その3

 また,while... 文(構文その1)と働きが似ているものとしては,以下のような構文があります。
    for( 初期設定のための式文 ; 条件式 ; 値更新のための式文 )
    {
        条件式が成立している間に実行すべき命令文その1 ;
        条件式が成立している間に実行すべき命令文その2 ;
           .
           .
           .
    }

[解説]  ところで,このfor... 文は,先に示したwhile... 文と等価です。すなわち,for... 文で書けるプログラムは,全て以下のようにしてwhile... 文に書き直すことができます。
    初期設定のための式文 ;
    while( 条件式 )
    {
        条件式が成立している間に実行すべき命令文その1 ;
        条件式が成立している間に実行すべき命令文その2 ;
           .
           .
           .
        値更新のための式文 ; 
    }

例えば,上の例1のコードは,以下のようにwhile... 文に書き直すことができます。
    int i ;
    
    i = 0 ;
    while( i <= 5 )
    {
        ...

        i = i + 1 ; 
    }

(注意) for... 文の場合は,( )の中の,値更新のための式文 の後には,; (セミコロン)は書いてはいけません。


制御変数の値更新のための式文によく使用される演算子



 上述の例1や例2において,制御変数の値更新のための式文として,
    i = i + 1 ;    /* i の値を1増やす */

    x = x * 2.0 ;    /* x の値を2倍する */
といった式文を用いました。C言語では,上のように,

ある一つの変数の値を(何らかの演算をすることによって)変更し,その結果をもとの変数に代入する

のに,便利な演算子が幾つか用意されています。


複合代入演算子(Cf. テキスト80ページTable4-2)

    a += b ;
と書くと,ab の値を足し算した値を,a に代入します。すなわち,
    a = a + b ;
と全く同じ意味となります。例えば,上の例1のコードは,以下のように書き直すことができます。
    int i ;
    
    for( i = 0 ; i <= 5 ; i += 1 )
    {
        ...

    }

+= を使用することによって,変数名を書く回数が減りますからタイプミスなどの間違いが少なくなるのはもちろんのこと,何よりもこのような表現にすることによって,二つの変数の間で何が行われたのかが,一目でわかるようになり,“計算して代入する”命令文がよりシンプルに書ける,という利点が生じるというわけです。

 同様な働きをする演算子としては,-=, *=, /=, %= がありますが,これらは説明の必要はないでしょう。


増分演算子・減分演算子(Cf. テキスト81ページTable4-3)

 上述の複合代入演算子を使った例
    i += 1 ;
を,さらにシンプルに書くための演算子があります。以下のような形式です。
    i++ ;
また,i から1を減じたい場合には,以下のように書きます。
    i-- ;
これらの演算子は,

変数に1を加えたり
変数から1を引いたり

するためだけに用意されているものですが,ループ中のカウンタなどとしてかなり頻繁に使われますので,覚えておいて損のない演算子です。


プログラムが暴走したら(Cf. 参考書1.4)



 今回より,プログラムの流れの繰り返しのための構文を学習します。

そのような繰り返しのための構文をプログラムの中で使いはじめると,ちょっとした間違いが原因で無限ループに陥ることがよくあります。

そうするとプログラムが暴走して止まらなくなったり,ターミナルが反応しなくなったり(フリーズしたり),といったようなトラブルが発生しやすくなってきます。

このようなことは,プログラムを開発する過程ではつきものですので,その場になってあわてることのないように,そのような場合の対処法を覚えておきましょう。

 もし,自分の作成したプログラムを実行させたときに暴走したら(プログラムが止まらなくなったら),以下のことを試してみて下さい。

今日の実習問題と宿題



(重要)  宿題の締切は次の授業が始まる前までとします。きちんと動作をチェックしてから,提出して下さい。


戻る