1.5 Switch & While Menuへ戻る

      さて、今回SWITCHとWHILEを終わった所で基本関数の解説は
    終わりとします。まだ、いくらかあるでしょうが、そんなものは今まで出
    てきた関数の組み合わせで実現できます。ちなみに今回出てくるSWITCH
    とWHILEも実は if と for だけで、その機能は実現できるので、絶対
    に必要な関数ではありません。プログラムの見栄えが良くなる事が利点と
    してあげられるでしょう。

      まず、switch ですが、一緒に case , default , break というのも使い
    ます。使い方は、変数Aが、1の時→〜命令〜、3の時→〜命令〜、7→の
    時〜命令〜・・・という風な場合分けをするときに便利です。基本的な形は

    switch (評価される変数)
    {
    case 1:             /* 1の時 */
        〜命令〜;
        break;          /* 命令はここまでですよ、という意味 */
    case 3:              /* 3の時 */
        〜命令〜;
        break;
    case 7:             /* 7の時 */
        〜命令〜;
        break;
    dafault:            /* dafault は その他 */
        〜命令〜;
        break;
    }

      ここで注目したいのは break という命令です。switch 文は break を見つ
    けると switch 処理を終了します。つまり break 処理が無いと次の命令文を
    実行します。説明では分かりづらいと思いますので例をあげます。次のプログ
    ラムを実行してみましょう。

    /*  プログラム開始  */

    #include <stdio.h>

    void main()
    {
        int iHyoka;
        iHyoka = 10;

        switch (iHyoka)
        {
            case 10:
                printf("数値は 10 です\n");
            case 20:
                printf("数値は 20 です\n");
        }
    }

    /*  プログラム終了  */

      見ただけでは、数値は 10 です、と表示されるだけと思うでしょう。しかし
    このプログラムには break がありません。ですから
    printf("数値は 10 です\n");の部分を実行した後に次の実行文である
    printf("数値は 20 です\n");を実行してしまいます。わかったでしょうか?こ
    の事より最後の case 文には break を書く必要が無いことも分かったでしょう。
    なぜなら次の実行文はもう無いのですから。また、default: はその他という事で、
    必ず書く必要はありません。

      この break に関する事で面白い使い方があります。変数 iHyoka が
    2 か 5 か 9 か 11 か 13 の時に「ガビーン」と表示し、それ以外の時は
    「ウフーン」と表示したい時は次の様に書くことができます。

    switch(iHyoka)
    {
        case 2:
        case 5:
        case 9:
        case 11:
        case 13:
            printf ("ガビーン\n");
            break;
        default:
            printf ("ウフーン\n");
    }

      なかなか便利でしょう。また、勘のいい人は if で同じ事が出来るという事に
    気づいているでしょう。今の文は

if (iHyoka == 2 || iHyoka == 5 || iHyoka == 9 || iHyoka == 11 || iHyoka == 13)
    printf ("ガビーン\n");
else
        printf ("ウフーン\n");

      これで同じ事です。しかし見栄えが全然違います。バグを探している時など、
    とても有効です。これは全体的に言える事ですが、ある命令を他の命令の組み
    合わせで実現すると、(今の場合では switch を if 文で作っている)ほんの数
    ミリ秒の違いですが、遅くなります。

      ちなみにバグという意味はみなさん知っているでしょうが、語源は何でしょう?
    一説には遙か昔、大型コンピュータの時代にどう見ても回路は正しく接続されてい
    るがどうしてもうまく動かない、どういう事かと隅々まで調べていたら、真空管の
    中に小さな虫が紛れ込んでいたという話からプログラムミスをバグと呼ぶようにな
    ったと言われています。

      次は while 文です。これはループ文の一種で for に良くにているのでわかりや
    すいでしょう。基本的な形は以下の通りです。

    while(評価式)
    {
        繰り返される実行文;
    }

      早く言えばカウンタを用いないループという事になります。何回繰り返せば
    終わりであるのか場合によって異なるとか分からないといった場合の重宝します。
    以下の使用サンプルを書きます。100万という数をどんどん半分にしていって
    1になったら終了するというプログラムです。整数型の変数ですから割り切れない
    時は切り捨てて半分になっていきます。このような場合は for は使いにくいですね。

    /*  プログラム開始  */

    #include <stdio.h>

    void main()
    {
        int iValue;
        iValue = 1000000;

        while (iValue != 1)  /* 1でない間ループする */
        {
            printf("Value is %d\n",iValue);
            iValue /= 2;
        }

        printf ("Exit While\n");
    }

    /*  プログラム終了  */

      もう while はわかったでしょうか?ま、使いこなすのはまだまだ先の事ですから
    こんな命令があり、大体どう使えば良いのか分かった。という程度で構いません。

      また、もう一つの書き方というのがありまして、私なんかもっぱらこちらの
    使い方の方が多いです。プログラムを書くときに while に関しては 一番最初
    に条件を書いてやらないといけません。どんなループにするかをハッキリ設計
    されていれば良いのですが、そうでなく繰り返し条件がまだハッキリしていな
    い場合には次の様に書くといいです。

    while (1)
    {
    }

      条件式の所に 1 と書いてやると、これは無限ループになります。このままでは
    ただの暴走プログラムなので、先程にも出てきた break で命令終了をします。

    while(1)
    {
        繰り返しされる命令
        if (条件)
            break; /* 条件が成立すればループを抜ける */
    }

      この書き方をすると条件の位置を色々と後で変更出来ることも利点の一つです。
    先程の数値が半分になっていくプログラムを使って例を書きます。さっきは100万
    から始めましたが、1から始めますと

        while (iValue != 1)
        {
            〜命令〜
        }

      この場合 while の中は実行されない。

       while(1)
       {
            if (iValue==1)
                break;
            〜命令〜
       }

       これも上と同じで while の中には入ってこない。

       while(1)
       {
            〜命令〜
            if (iValue==1)
                break;
       }

       これだと一回だけ命令が実行される。

      このように後からの仕様変更に柔軟に対応できるので私は良く使います。だいたい
    わかっていただけたでしょうか? ちなみに break は for の中でも同じようにループ
    を抜けるために使えます。これは知っておいてもいいでしょう。

      では今回はこれまで。