Previous: 真でない場合の判断
Up: 制御構造1 判断
Next: 復習
Previous Page: 真でない場合の判断
Next Page: 復習

更に複雑な判断

前のセクションで習ったものよりも更に複雑な判断をすることも出来る。

if ( 条件1 ){
                文1
        }else if ( 条件2 ){
                文2
        }else if ( 条件3 ){
                文3
        }else if ( 条件4 ){
                .
                .
                .
        }else{
                文n
        }
これは、条件1が真の場合は、文1が実行され、条件1が偽で条件2が真の場合、 文2が実行され、更にそれらが偽である場合は条件3が判断され、という具合に 最初の条件から順番に判断がされていき、それら全部が偽である場合には、 文 n が実行される。注意すべきは、条件1で真ならば、文1のみが実行され、 以下の条件 x は、すべて無視されると言う点である。これは、どの部分でも 同じで、条件3が真ならば文3が実行され、その後の条件は全て無視して、 if 文の実行から抜ける。(最後の行の } の後の文の実行に移る。)

また、最後の else{...} はなくても良い。

  

if ( x > 0 ){
                z = 1;
        }else if ( x == 0 ){
                z = 0;
        }else{
                z = -1;
        }
この例の場合、x が正の場合、z に1を代入し、x が 0に等しい場合、z に0を代入し、以上のどれでもない場合(即ち、 負の場合)、z にー1を代入することになる。

 

例 

1:        if ( x > 7 ){
2:                y = 7;
3:        }else if ( x > 6 ){
4:                y = 6;
5:        }else if ( x > 5 ){
6:                y = 5;
7:        }else if ( x > 8 ){
8:                y = 8;
9:        }
この例では、1行目で x が7より大きい場合は全て y に7を 代入し、もし、x が7以下である場合で、x が6より大きいならば y に6を代入しているが、注意すべきは、例えば x = 8 の場合、 最初の1行目で既に真になっているので、以降の if 文の判断はされないという ことである。従って、3行目は実際には、 7 >= x > 6 という条件になって しまう点に注意しよう。更に、そのために、7行目で行なっている判断は常に 偽になってしまうので、8行目の文はどんな場合でも絶対に実行されることはない。 また、この例では、else 文がないので、x が5以下の場合は、y には何も代入されない。

課題

cd c を実行した後で( /c に移動した後で)、以下の課題を やってみよ。

課題 3.1
もっとも簡単な if 文

以下のプログラムを実行してみよ。

/* kadai 3.1 */
#include <stdio.h>

main() { int a; a = 3; if ( a > 0 ){ printf("a > 0 \n"); } }

課題 3.2
偽の場合は

課題 3.1 のプログラムで、a = 3; を a = -1 に変更して 実行してみよ。

課題 3.3
真偽それぞれについて実行されるようにしよう。

課題 3.2 のプログラムを改良し、a が正又は0の場合は、a >= 0 を 負の場合は、a < 0 を表示するように改良し、実行してみよ。 また、a に 10 を代入するように変更してみて実行してみよ。 それぞれ、きちんと表示されましたか?

課題 3.4
3つの場合分け

課題 3.3 のプログラムを改良し、a が、正か0か負のどれであるかを 表示するようにせよ。

課題 3.5
割り切れるや否や?

前回、整数同志の割り算の結果は整数であるので、小数以下は切り捨てられることを 学んだが、これを応用して割り算の余りを求め、割り切れるかどうか を調べるプログラムを作ってみよう。

整数 a を整数 b で割った商が p で、余りが q であるとき、 と書けるので、分母の b を払うと、 と変形できる。従って、余り q は、 となる。そこで、整数 a, b が与えられていれば、p を求めれば余りは求まる事になる。 前回学んだように、c 言語では、整数同志の割り算をすれば、必ず商が求まるので、 p = a / b; とすればよい。 最後に、余り q を求めて、0ならば、割り切れたことを、0でないならば、 割り切れなかったことを表示するようにせよ。 但し、プログラムはなるべく一般的に作り、プログラムの最初の方で、整数 a,b に値を代入し、以降は変数 a, b を使うようにしなさい。(具体的な数値を 使って計算してはならない。)

整数 a に54355を代入し、整数 b に7を代入して実行してみよ。

 

作成したプログラムをメイルで、金山まで送ること。但し、題は「課題3」と すること。

参考問題
時間が余った人はやってみよう。(やらなくてもいいですよ。)

課題 3.5 のプログラムで、a = と b= の行を削除し、 以下の行を挿入せよ。

printf("Input a = ");
        scanf("%d",&a);
        printf("\nInput b = ");
        scanf("%d",&b);
        printf("\n");
これを実行すると、まず、 Input a = と表示されるので、適当な値を キーボードから入力し(整数)、リターンキーを押すと、今度は、 Input b = と表示するので、先の値とは違う値を入れてみよ。

どうです? これは、何度でも値を変えて割り切れるかどうか調べることが出来るようになっていますね。 実は、scanf("%d",&a); は、整数をキーボードから読み取って、変数 a に 代入する命令なのです。(今の所は、正式には講義してませんので、そういうおまじない と思って構いません。)

maruyama@wakhok.ac.jp
1995年02月08日 (水) 18時57分57秒 JST