サイトマップ / C言語講座>出入り口>総目次>目次:流れの制御>switch - case文による分岐
[if ( ) - else文(2)]←このソース→[三項演算子(1)]
/* 今日は、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言語講座−それ自体コンパイルできる教材を使った講座です−