C言語の選択には,
ifと
switchがある.ここでは,それぞれについて説明する.
プログラム中で,「もし○○ならば,△△する」というような処理をしたい場合,
ifという命令を使う.また,「もし,○○ならば△△する,さもなければ□□する」
という場合は,
ifと
elseを使う.ここでは,この
ifや
elseの使い方
を学習する.
最初は一番単純な,「もし○○ならば,△△する」という構文を示す.とくに,△△の部
分が1つの文で表せる場合である.このような場合は,次のように,書く.
条件を表す○○の部分が制御式で,△△の部分を文で表すのである.これは,「制御式が
正しい(真)ならば,文を実行する」となる.もし,制御式が誤り(偽)であれば,この文は
実行されず次の行に移る.図
6にこの構文のフローチャートを示す.
以下のようなプログラムが,この構文の使用例である.
if(a<=10) printf("aは,10以下です\n");
図 6:
制御式が真の場合,1つの処理を実施するif文
|
先ほどの構文では,実行できる文は1個に限られる.「もし○○ならば,△△し,□□し,
」のように複数の文を実行したい場合がある.このようなときは,次に示すよう
に,括弧
{ }でくくり,ブロック化して,複数の文を書く.ブロック内には,任
意の数の文を書くことができる.また,このブロック内には,順次や選択,繰り返しの文
を書くことも可能である.
|
書式
if(制御式){
文1;
文2;
文3;
}
|
これは,「制御式が正しい(真)ならば,文1と文2,文3を実行する」となる.もし,制御式が誤り
(偽)であれば,これら文は実行されず,ブロックの外側に出る.図
7にこの
構文のフローチャートを示す.
以下のようなプログラムが,この構文の使用例である.
if(0<=a && a<=10){
printf("aは,0以上\n");
printf("かつ\n");
printf("aは,10以下です\n");
}
-4pt
- もし,aが0以上,かつ,10以下ならば,
-4pt
- 「aは,0以上」と表示する.
- 「かつ」と表示する.
- 「aは,10以下です」と表示する.
図 7:
制御式が真の場合,ブロックで処理を実施するif文
|
「もし○○ならば△△し,さもなければ□□する」というように,条件により二者択一の
選択処理が必要な場合がある.これは,次のように書く.
|
書式
if(制御式){
文1;
文2;
文3;
}else{
文4;
文5;
文6;
}
|
これは,「制御式が正しい(真)ならば,文1と文2,文3を実行する.さもなければ,文4と
文5,文6を実行する.」となる.実行される文が複数であるので,ブロックになっている
ことに注意.文が1つの場合,ブロック化しなくても良い.図
8にこの構文
のフローチャートを示す.
以下のようなプログラムが,この構文の使用例である.
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以下ならば,
-4pt
- 「aは,0以上」と表示する.
- 「かつ」と表示する.
- 「aは,10以下です」と表示する.
- さもなければ
-4pt
- 「aは,0未満」と表示する.
- 「または」と表示する.
- 「aは,10より大きい」と表示する.
図 8:
elseを使って,二者択一の処理をする構文
|
「もし○○ならば
する.さもなければ,もし□□ならば
する.さもなければ,もし
ならば
する.さもなければ,
する.」というよう構文を書きたい場合がある.条件に合致しなければ,次の条件,次々
の条件と比較を行う場合である.これは,次のように書く.
|
書式
if(制御式1){
文1;
文2;
}else if(制御式2){
文3;
文4;
}else if(制御式3){
文5;
文6;
}else{
文7;
文8;
}
|
これは,「制御式1が正しい(真)ならば,文1と文2を実行する.さもなければ,制御式2が
正しいならば,文3と文4を実行する.さもなければ,制御式3が正しいならば,文5と文6
を実行する.さもなければ,文7と文8を実行する.」となる.
この構文のフローチャートを,図9に示す.このフローチャートを見てわか
るように,最初に真となった制御式に続くブロック内が実行される.それ以降,真になっ
ても,そのブロックは実行されない.どの制御式も真にならない場合,最後の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未満ならば
-4pt
- 「aは,0以上」と表示する.
- 「かつ」と表示する.
- 「aは,1未満」と表示する.
- さもなければ,もし,aが1以上,かつ,10未満ならば
-4pt
- 「aは,1以上」と表示する.
- 「かつ」と表示する.
- 「aは,10未満」と表示する.
- さもなければ
図 9:
if else if elseを使っての多段の選択
|
- [練習2]
- キーボードから二次方程式
の係数を読み込む.
係数の値にしたがい「異なる2つの実数解があります.」あるいは
「重根です.」,「2つのことなる虚数解があります.」--と表示す
るプログラムを作成せよ.
if文は,選択肢が少ない場合,わかりやすい記述ができる.しかし,選択肢が多く
なると,記述は複雑になり,分かりにくいプログラムとなる.そのような場合は,
if文の代わりに
switch文を使うことができる.
この構文のフローチャートを,図10に示す.これは,式の値により,それ
にマッチしたブロック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ならば,以下を実行する.
-4pt
- 「あなたは,1と答えました.」と表示する.
- 「不正解です.」と表示する.
- switchの構文から抜ける.
- aが2ならば,以下を実行する.
-4pt
- 「あなたは,2と答えました.」と表示する.
- 「不正解です.」と表示する.
- switchの構文から抜ける.
- aが5ならば,以下を実行する.
-4pt
- 「あなたは,5と答えました.」と表示する.
- 「正解です.」と表示する.
- switchの構文から抜ける.
- どれにもマッチしなければ,以下を実行する..
図 10:
switch文を使った構文.多くの選択肢がある場合.
|
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成19年5月16日