内 容
- switch文
- 乱数
switch文
switch文
if else文はその条件式が真か偽かのいずれかに評価されることによって、2つの処理のうちのどちらかを一つだけを処理する構文でした。
switch文は、式が整数値として評価され、その値によって処理を選択する構文です。
以下は、switch文を使って、整数0が入力されると「0です。」、整数1が入力されると「1です。」、整数2が入力されると「2です。」、それ以外の値なら「0,1、2以外の数です。」と表示するプログラム例です。
例 switchNum.c
#include <stdio.h>
int main(void)
{
int n;
printf("整数>> ");
scanf("%d", &n);
switch (n) {
case 0:
printf("0です。\n");
break;
case 1:
printf("1です。\n");
break;
case 2:
printf("2です。\n");
break;
default:
printf("0,1,2以外の数です。\n");
}
return 0;
}
switch文の構文を見ていきましょう。キーワードswitchの直後のカッコ内に処理を選択するための式を記述します。この式の評価結果(値)によってそれ以降に記述された処理の分岐先が決定します。各分岐先はキーワードcaseではじまり、その直後に評価結果の値に対応する
定数が表記されます。式の評価結果に一致する定数のcase文に分岐して処理が行われます。通常、処理の最後にはbreak文を記述して、switch文のコードブロックを抜け出すようにします。また、いずれのcase文の定数とも一致しない場合は、default文が処理されます。
構文:
switch (式) {
case 定数1:
式の評価結果が定数1の場合の処理;
break;
case 定数2:
式の評価結果が定数2の場合の処理;
break;
・・・
・・・
case 定数n:
式の評価結果が定数nの場合の処理;
break;
default:
上記のどの場合にも当て間らなかった場合の処理;
}
式の評価結果の値は整数でなければなりません。また、case文に設定できる値は一つの定数であって、複数の値や値の範囲を示す式を使うことはできません。
break文無しで複数の条件を満たす
月を入力してその季節を表示するプログラムを考えます。3〜5月は春、6〜8月は夏、9〜11月は秋、12〜2月は冬だとします。switch文を使って次のようなプログラムを書いてみました。
例 season.c
#include <stdio.h>
int main(void)
{
int n;
printf("何月>> ");
scanf("%d", &n);
switch (n) {
case 3:
printf("春です。\n");
break;
case 4:
printf("春です。\n");
break;
case 5:
printf("春です。\n");
break;
case 6:
printf("夏です。\n");
break;
case 7:
printf("夏です。\n");
break;
case 8:
printf("夏です。\n");
break;
case 9:
printf("秋です。\n");
break;
case 10:
printf("秋です。\n");
break;
case 11:
printf("秋です。\n");
break;
case 12:
printf("冬です。\n");
break;
case 1:
printf("冬です。\n");
break;
case 2:
printf("冬です。\n");
break;
default:
printf("そんな月はありません。\n");
}
return 0;
}
正しい結果が得られるプログラムですが、同じ処理がいくつもあり無駄な感じがします。どうにかならないものでしょうか。switch文はbreak文を使ってそのブロックを抜け出すのでした。もし、break文がなかったらどうなるのでしょう。例えば、定数3のcase文にあるbreak文を削除してみます。「春です。」と表示した後にbreak文がないので、その直下の定数4のcase文に処理が以降します。その結果、また、「春です」と表示するのです。つまり、switch文ではbreak文が登場するまで、case文に関わらず処理が継続されることになるのです。これを利用して無駄な処理をなくしたのが、次のプログラム例です。
例 season.c
#include <stdio.h>
int main(void)
{
int n;
printf("何月>> ");
scanf("%d", &n);
switch (n) {
case 3:
case 4:
case 5:
printf("春です。\n");
break;
case 6:
case 7:
case 8:
printf("夏です。\n");
break;
case 9:
case 10:
case 11:
printf("秋です。\n");
break;
case 12:
case 1:
case 2:
printf("冬です。\n");
break;
default:
printf("そんな月はありません。\n");
}
return 0;
}
char型を式に使ったswitch文
文字を扱うchar型は、基本的にデータ幅が1バイトの整数型です。文字を扱うために利用される型ではありますが、文字専用の型というわけでもありません。つまり、整数値の値で分岐先を決定するswitch文の式として利用することもできます。次のプログラム例は半角アルファベットを入力して、母音(a,i,u,e,o)ならばそのひらがなを表示するプログラムです。
例 hiragana.c
#include <stdio.h>
int main(void)
{
char c;
printf("> ");
c = getchar(); //文字の読み込み
switch(c){
case 'a':
printf("あ\n");
break;
case 'i':
printf("い\n");
break;
case 'u':
printf("う\n");
break;
case 'e':
printf("え\n");
break;
case 'o':
printf("お\n");
break;
default:
printf("変換できません。\n");
break;
}
return 0;
}
乱数
乱数
乱数とは、サイコロを振って出る目のように予測不可能な値、ランダムな値のことを言います。乱数はゲームやシミュレーションなどで予測できない状況を再現するために利用されます。乱数をC言語で生成するためには、標準ライブラリstdlib.hで定義されている関数rand()がよく利用されます。次のプログラムは関数rand()を使って乱数を生成する例です。
randnum.c
#include <stdio.h> // 入出力関連の関数が定義されているヘッダファイル
#include <stdlib.h> // 乱数関連の関数が定義されているヘッダファイル
#include <time.h> // 時間関連の関数が定義されているヘッダファイル
int main(void)
{
int rand_num;
srand((unsigned)time(NULL)); //時刻の種を植える
rand_num = rand(); //乱数の生成
printf("乱数: %d\n", rand_num);
return 0;
}
関数rand()によって生成される乱数は本当の意味での乱数とは異なり、ランダムに見えるようにコンピュータによって確定的に計算された値です。これを擬似乱数と言います。毎回異なる値を生成するためには、乱数の元となる"種"の値も変える必要があります。この種の値を設定するための関数がsrand()です。実行毎に異なる乱数を得るために、ここでは刻々と変わる”時刻”を関数srand()を使って植え込んでいるのです。試しに関数srand()をコメント化して無効にしてみてください。すると、関数rand()がいつも同じ値を生成することがわかります。
特定の範囲の乱数を生成する
関数rand()が生成する値は、0から定数RAND_MAX(環境によって異なる)までの広い範囲の値です。例えば、サイコロの目と同じ1〜6までの値が欲しい時には、以下の例のように剰余演算を使って6で割った余り0〜5を求めてから、これに1を加えます。
dicenum.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int dice;
srand((unsigned)time(NULL)); //時刻の種を植える
dice = rand()%6+1;
printf("1〜6: %d\n", dice);
return 0;
}
expand_lessBack to TOP