『楽しく!』『できる!!』C講座のページ


第5回:もうちょっと賢そうな(?)ソースにしよう!

・条件分岐 その2
さて、前回は 条件分岐(if文) をつかって簡単なゲームを作ってみました。
 今回は前回の最後にも述べたように前回のソースの改良です。

・条件分岐 その2

条件分岐とは、その名のとおり、「〜 ならば …」というように条件によって分岐するもので、前回紹介したのは 『if文』 と呼ばれる構文でした。
しかし、前回のソースでは「入力されたのは○○? そうでなければ△△? それじゃ□□?」というように else if の続くソースでした。
これではまるで頭の悪い子供のようです。
今回はこれをもっとスマートな形にしたいと思います。

・ switch 文
今回使うのは 『switch文(スイッチぶん)』 と呼ばれる構文です。
書式は

 switch(a){
 case 条件 1:  実行文1;
           break;
 case 条件 2:  実行文2; 
           実行文3;
           break;
        :
        :
 default:    実行文n;
           break;
 }

となり、この場合 switch の後ろの()のなかの変数について判定 します。
 条件1のところに、判定のラベルを記入し、:(コロン)で区切り、その後ろに実行文を書きます。
それぞれの条件が成立したのときにコロン以降の実行文が実行されます。
ここで、「条件式」と書いていないことに注目してください!
switch()の中の変数が条件の値と同じ時、
後ろの実行分が実行されます。
条件式ではないため、そこに式を書くことはできず、一文字との判定を行うときはシングルコーテーション ' で囲む必要があります。
また、 実行文は複数行にわたることも可能で、次の break(ブレイク)までを実行します。
また、 else if 同様、いくつもの条件、実行文を書くことができます。

最後に、いままでに挙げた条件すべてにあてはまらないときに実行される default(デフォルト)があります。これは、if文のときの最後の else 同様省略できますが、予期せぬエラーを避けるため、不要なときにもつけておいた方が無難です。
<例1>
 /* 入力された値 c が 1 又は 2 であればその値であることを示し、q なら終了 
  それ以外の値が選択されていればエラー */

 switch(c){
 case 1 : printf("入力された値は1です。\n");
       break;
 case 2 : printf("入力された値は2です。\n");
       break;
 case q : printf("終了が選択されました。\n");
       printf("プログラムを終了します\n");
       break;
 default: printf("エラー!予期せぬ値が選択されました。\n");
       printf("プログラムを終了します。\n");
       break;
 }

こうすれば、変数 c の中身が 1 のとき、 2 のとき、 q のとき、それ以外のときにそれぞれに応じた実行文が実行されます。

また、break; がくるまで、実行文が続いていると認識する。という点を利用して以下のようなプログラムを作ることも可能です。

<例2>
/* cの取りうる値は、1,2,3,q とする。
  また、c が1,2,3のときは数字であることを。qのときはプログラムを終了する*/ 

 switch(c){
 case 1 :
 case 2 :
 case 3 : printf("選択された値は数字です。\n");
       break;
 case q : printf("プログラムを終了します。\n");
       break;
 default: printf("エラー!予期せぬ値が選択されました。\n");
       printf("プログラムを終了します。\n");
       break;
 }

こうすることで、c == 1 , c == 2 ,c == 3 のときは、いずれも 選択された値は数字です。 と出力されることになります。
しかし、この書式は多用すると、煩雑なプログラムになりがちなため、多用は控えるほうが無難です。

前回のソースでは、「そうでなければ、そうでなければ…」と稚拙なソース(とは言っても実際には使用されるレベル)にみえましたが、これで少しは大人なソース(?)になりました。




今回のソースは


 /*Zjanken_S */
 #include <stdio.h>
 void main(void)
 {
    char selected; /* プレイヤーが選択したものを入れておく */

    printf("************************************** \n"); 
    printf("* じゃんけんゲーム * \n");
    printf("************************************** \n");
    printf("\n");
    printf("#### 説明 #######\n");
    printf("# g : グー  #\n");
    printf("# t : チョキ #\n");
    printf("# p : パー  #\n");
    printf("#################\n");
    printf("\n");
    printf("\n");
    printf("ジャンケンしよう!\n");
    printf("ジャンケン……\n");
    scanf("%c",&selected); /* プレイヤーが選択したキャラを
                      selected に格納 */
    printf("ほいっ!!\n");

    switch(selected){
    case 'g':
        printf("++++++++++++++\n");
        printf(" あなた:グー\n");
        printf(" わたし:パー \n");
        printf("++++++++++++++\n");
        printf("\n");
        printf("# わたしの勝ち!! #\n");
        printf("\n");

        break;

    case 't':
        printf("++++++++++++++\n");
        printf(" あなた:チョキ\n");
        printf(" わたし:グー \n");
        printf("++++++++++++++\n");
        printf("\n");
        printf("# わたしの勝ち!! #\n");
        printf("\n");

        break;

    case 'p':
        printf("++++++++++++++\n");
        printf(" あなた:パー \n");
        printf(" わたし:チョキ\n");
        printf("++++++++++++++\n");
        printf("\n");
        printf("# わたしの勝ち!! #\n");
        printf("\n");

        break;

    default:
        printf("エラー!! g,t,p の中から選択してください!!\n"); 

        break;
    }
 }

です。
今回は、ジャンケンゲームを改良してみましたがどうだったでしょうか?
改良といっても、実際にゲームをする側から見れば何も変更された点がないのですがら、改良した気分にはならないことでしょう。
次回は、 乱数を使い本当のじゃんけんゲームを作りたい と思います。


 自分で考え、新しいプログラムを作ることは何よりも良い上達への近道です。
自分で考えることで、おのずと自分がどの程度理解しているかが分かるでしょう。


・今回の課題
今回のソースを参考にし、前回の課題として自分で作ったプログラムを switch文 を用いて書き換えよ。