C言語の選択には、
ifと
switchがある。ここでは、それぞれについて説明する。
プログラム中で、「もし○○ならば、△△する」というような処理をしたい場合、
ifという命令を使う。また、「もし、○○ならば△△する、さもなければ□□する」
という場合は、
ifと
elseを使う。ここでは、この
ifや
elseの使い方
を学習する。
分かっていると思うが、念のため、これらの意味を書いておく。
最初は一番単純な、「もし○○ならば、△△する」という構文を示す。とくに、△△の部
分が1つの文で表せる場合である。このような場合は、次のように、書く。
条件を表す○○の部分が制御式で、△△の部分を文で表すのである。これは、「制御式が
正しい(真)ならば、文を実行する」となる。もし、制御式が誤り(偽)であれば、この文は
実行されず次の行に移る。図
5にこの構文のフローチャート(flow chart:流
れ図)を示す。
以下のようなプログラムが、この構文の使用例である。
if(a<=10) printf("aは、10以下です\n");
図 5:
制御式が真の場合、1つの処理を実施するif文
|
先ほどの構文では、実行できる文は1個に限られる。「もし○○ならば、△△し、□□し、
」のように複数の文を実行したい場合がある。このようなときは、次に示すよう
に、
{と
}でくくり、ブロック化して、複数の文を書く。ブロック内には、任
意の数の文を書くことができる。また、このブロック内には、順次や選択、繰り返しの文
を書くことも可能である。
書式 |
---|
if(制御式){
文1;
文2;
文3;
}
|
これは、「制御式が正しい(真)ならば、文1と文2、文3を実行する」となる。もし、制御式が誤り
(偽)であれば、これら文は実行されず、ブロックの外側に出る。図
6にこの
構文のフローチャートを示す。
以下のようなプログラムが、この構文の使用例である。
if(0<=a && a<=10){
printf("aは、0以上\n");
printf("かつ\n");
printf("aは、10以下です\n");
}
- もし、aが0以上、かつ、10以下ならば、
- 「aは、0以上」と表示する。
- 「かつ」と表示する。
- 「aは、10以下です」と表示する。
図 6:
制御式が真の場合、ブロックで処理を実施するif文
|
「もし○○ならば△△し、さもなければ□□する」というように、条件により二者択一の
選択処理が必要な場合がある。これは、次のように書く。
書式 |
---|
if(制御式){
文1;
文2;
文3;
}else{
文4;
文5;
文6;
}
|
これは、「制御式が正しい(真)ならば、文1と文2、文3を実行する。さもなければ、文4と
文5、文6を実行する。」となる。実行される文が複数であるので、ブロックになっている
ことに注意。文が1つの場合、、
{と
}でくくり、ブロック化しなくても良い。
図
7にこの構文のフローチャートを示す。
以下のようなプログラムが、この構文の使用例である。
if(0<=a && a<=10){
printf("aは、0以上\n");
printf("かつ\n");
printf("aは、10以下です\n");
}else{
printf("aは、0未満\n");
printf("または\n");
printf("aは、10より大きい\n");
}
- もし、aが0以上、かつ、10以下ならば、
- 「aは、0以上」と表示する。
- 「かつ」と表示する。
- 「aは、10以下です」と表示する。
- さもなければ
- 「aは、0未満」と表示する。
- 「または」と表示する。
- 「aは、10より大きい」と表示する。
図 7:
elseを使って、二者択一の処理をする構文
|
「もし○○ならば
する。さもなければ、もし□□ならば
する。さもなければ、もし
ならば
する。さもなければ、
する。」というよう構文を書きたい場合がある。条件に合致しなければ、次の条件と、次々
に条件を変ている。これは、次のように書く。
書式 |
---|
if(制御式1){
文1;
文2;
}else if(制御式2){
文3;
文4;
}else if(制御式3){
文5;
文6;
}else{
文7;
文8;
}
|
これは、「制御式1が正しい(真)ならば、文1と文2を実行する。さもなければ、制御式1が
正しいならば、文3と文4を実行する。さもなければ、制御式3が正しいならば、文5と文6
を実行する。さもなければ、文7と文8を実行する。」となる。
この構文のフローチャートを、図8に示す。このフローチャートを見てわか
るように、最初に真となった制御式に続くブロック内が実行されのみである。それ以降、
真になっても、そのブロックは実行されない。どの制御式も真にならない場合、最後の
elseのブロックが実行される。即ち、実行されるブロックは1個のみである。
else ifの段数をいくらでも増やせることは、言うまでもない。
また、elseが無い構文も許される。この場合、真となる制御式がない場合、どの
ブロックも実行されず、この構文から抜ける。
つぎのプログラムが、この構文の使用例である。
if(a < 0){
printf("aは、0以下\n");
}else if (0 <= a && a < 1){
printf("aは、0以上\n");
printf("かつ\n");
printf("aは、1未満\n");
}else if (1 <= a && a < 10){
printf("aは、1以上\n");
printf("かつ\n");
printf("aは、10未満\n");
}else{
printf("aは、10以上\n");
}
- もし、aが0未満ならば、
- さもなければ、もし、aが0以上、かつ、1未満ならば
- 「aは、0以上」と表示する。
- 「かつ」と表示する。
- 「aは、1未満」と表示する。
- さもなければ、もし、aが1以上、かつ、10未満ならば
- 「aは、1以上」と表示する。
- 「かつ」と表示する。
- 「aは、10未満」と表示する。
- さもなければ
図 8:
if else if elseを使っての多段の選択
|
if文は、選択肢が少ない場合、わかりやすい記述ができる。しかし、選択肢が多く
なると、記述は複雑になり、分かりにくいプログラムとなる。そのような場合は、
if文の代わりに
switch文を使うことができる。
この構文のフローチャートを、図9に示す。これは、式の値により、それ
にマッチしたブロック4が実行される。もし、どれもマッチしなければ、defaultが実行される。
default文は無くてもよいが、その場合はどのブロックも実行されない場合がある。
文の集まりのブロックの最後には、bread文を書く。この
break 文が無いと、マッチしたブロック以降の他のブロックも実行される。コード
ブロックを表す中括弧{}が無いので、こうすることになっている。この
break文でswitch文の終わりを示す中括弧(})から
式や定数式の値の型は、intまたはcharでなくてはならない。定数式の方は、
コンパイル時に、評価できなくてはならない。
caseの後の定数式は、ラベルである。ラベルの後は、コロン(:)をつける。文
の終わりを示すセミコロン(;)ではない。
つぎのプログラムが、この構文の使用例である。
switch(a){
case 1:
printf("あなたは、1と答えました。\n");
printf("不正解です。\n");
break;
case 2:
printf("あなたは、2と答えました。\n");
printf("不正解です。\n");
break;
case 5:
printf("あなたは、5と答えました。\n");
printf("正解です\n");
break;
default:
printf("質問にまじめに答えろ。\n");
}
- aが1ならば、以下を実行する。
- 「あなたは、1と答えました。」と表示する。
- 「不正解です。」と表示する。
- switchの構文から抜ける。
- aが2ならば、以下を実行する。
- 「あなたは、2と答えました。」と表示する。
- 「不正解です。」と表示する。
- switchの構文から抜ける。
- aが5ならば、以下を実行する。
- 「あなたは、5と答えました。」と表示する。
- 「正解です。」と表示する。
- switchの構文から抜ける。
- どれにもマッチしなければ、以下を実行する。。
図 9:
switch文を使った構文。多くの選択肢がある場合。
|
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成16年9月7日