サイトマップ / C言語講座出入り口総目次目次:流れの制御>switch - case文による分岐

青い直線

switch - case文による分岐

青い直線

[if ( ) - else文(2)]←このソース→[三項演算子(1)]

/* switch - case文 */

/* 今日は、switch - case文について学びます。一般的な形式を下に示します。

    switch (c) {
        case  A: 処理 A;
            break;
        case  B: 処理 B;
            break;
        case  C:処理 C;
            break;
        - - - - - - - - -		
        - - - - - - - - -		
        default:処理 N;
    }

c には、int型の変数が入ります。c の値が A なら、処理Aが行われます。以下同様です。default:は、オプションです。"オプションです" という表現は"なくても良い"と同義です。

もし、c が A か B か C なら、処理 C を行いたいなら、下記のように書きます。

        case  A: 
        case  B: 
        case  C:
           処理 C;
           break;

switch case文を使えば、c の値によって、様々な処理を行うことができます。

switch case文は、if else文に置き換えることができます。どちらの形式を選ぶかは、ソースプログラムの見やすさによります。

ソースプログラムの説明

今日は、switch case文を使って、キーボードからgetchar( )で文字として入力した16進数を、10進数に変換して画面に出力するプログラムを作ります。

キーボードからの入力は、最初に符号が入力されるかも知れません。それから、0から9の数字と、16進数なので 'a' から 'f'、または、'A' から 'F' の文字の並びが来るはずです。数字に変換した結果をlong型の変数、result にしまうことにします。result は1Lに初期化しておきます。また、sign という long型の変数を宣言して、1L に初期化しておきます。マイナスの符号が入力されたら、sign を -1L にして、最後に、result と掛け合わせることにします。

次に文字の並びを、16進数に変換するアルゴリズムを考えます。ループの中で、先頭から1文字ずつ文字を数字に変換します。変換した数字を long型の変数、temp に代入します。それを下記の式に代入します。

   result = result * 16L + temp;

result は1L に初期化しておいたので、ループの中でこの式への最初の代入では、result には一桁の数字が入ります。2度目の代入では、前回の代入の結果が16倍され桁上がりします。ループの中で、順次これを繰り返していけば数字に変換できます。後は文字を数字に変換するルーチンを作れば完成です。switch case文を使います。難しいことをしている訳ではないので、ソースプログラムのコメントを見て下さい。 */

/* ここからソースプログラム */

#include  <stdio.h>
#include  <stdlib.h>      /* exit(  ) で必要 */

void main(void);

void main(void)     /* この部分訂正 */
{
    int c;

    /* long 型整数の初期化には L を付ける */
    long sign = 1L, result = 0L, temp = 0L;

    printf("16 進数を入力して下さい\t");

    while ((c = getchar(  )) != '\n') {
        switch (c) {
            case  ' ':                   /* スペースと */
            case  '\t':                  /* タブは */
                break;                   /* 読み飛ばす */
            case '+' : break;            /* '+' も読み飛ばす */
            case '-' : sign = -1L;       /*  '-' の時の処理 */
                break;
            case '0' :                   /* 0から9なら */
            case '1' :
            case '2' :
            case '3' : 
            case '4' : 
            case '5' : 
            case '6' : 
            case '7' : 
            case '8' : 
            case '9' : temp = c - '0';    /* 数字に変換 */
                break;
            case 'A' :                    /* 'a' から 'f' または、'A' から 'F' なら */
            case 'a' : temp = 10;         /* 以下の処理をする */
                break;
            case 'B' : 
            case 'b' : temp = 11;
                break;
            case 'C' : 
            case 'c' : temp = 12;
            break;
            case 'D' : 
            case 'd' : temp = 13;
                break;
            case 'E' : 
            case 'e' : temp = 14;
                break;
            case 'F' : 
            case 'f' : temp = 15;
                break;
            default  : fprintf(stderr, "不正な文字\n");  /* 不正な文字なら */
            exit(2);                                    /* プログラムを終了 */
        }
        result = result * 16L + temp;                   /* 10進数に変換 */
    }
    result = result * sign;                 /* 符号の処理 */
    printf("\n10 進数では %ld\n", result);
}

/* ここまでソースプログラム */

/* 今回のソースプログラムは、符号は数字より前に来るという前提のもとに作りました。従って、"1-23" というように数字の途中に符号が来てもエラーにならないという欠陥があります。

今回のソースプログラムを if else文で表現するには、c が 'a' から 'f'、または、'A' から 'F' の時は、それぞれ下記のコードを使うと効率が良いと思います。

   temp = c -'a' + 10;
   temp = c -'A' + 10;

*/

[if ( ) - else文(2)]←このソース→[三項演算子(1)]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:流れの制御>switch - case文による分岐