5 基本制御構造(選択)

C言語の選択には、ifswitchがある。ここでは、それぞれについて説明する。

5.1 if else文

プログラム中で、「もし○○ならば、△△する」というような処理をしたい場合、 ifという命令を使う。また、「もし、○○ならば△△する、さもなければ□□する」 という場合は、ifelseを使う。ここでは、このifelseの使い方 を学習する。

分かっていると思うが、念のため、これらの意味を書いておく。

if もしも〜ならば
else さもなければ

5.1.1 処理が1つの場合

最初は一番単純な、「もし○○ならば、△△する」という構文を示す。とくに、△△の部 分が1つの文で表せる場合である。このような場合は、次のように、書く。
書式
	if(制御式)文;
条件を表す○○の部分が制御式で、△△の部分を文で表すのである。これは、「制御式が 正しい(真)ならば、文を実行する」となる。もし、制御式が誤り(偽)であれば、この文は 実行されず次の行に移る。図5にこの構文のフローチャート(flow chart:流 れ図)を示す。

以下のようなプログラムが、この構文の使用例である。

	if(a<=10) printf("aは、10以下です\n");
図 5: 制御式が真の場合、1つの処理を実施するif文
\includegraphics[keepaspectratio, scale=1.0]{figure/if_0.eps}

5.1.2 ブロックで処理する場合

先ほどの構文では、実行できる文は1個に限られる。「もし○○ならば、△△し、□□し、 $ \cdots$」のように複数の文を実行したい場合がある。このようなときは、次に示すよう に、{}でくくり、ブロック化して、複数の文を書く。ブロック内には、任 意の数の文を書くことができる。また、このブロック内には、順次や選択、繰り返しの文 を書くことも可能である。
書式
	if(制御式){
	   文1;
	   文2;
	   文3;
	}
これは、「制御式が正しい(真)ならば、文1と文2、文3を実行する」となる。もし、制御式が誤り (偽)であれば、これら文は実行されず、ブロックの外側に出る。図6にこの 構文のフローチャートを示す。

以下のようなプログラムが、この構文の使用例である。

	if(0<=a && a<=10){
	  printf("aは、0以上\n");
	  printf("かつ\n");
	  printf("aは、10以下です\n");
	}
図 6: 制御式が真の場合、ブロックで処理を実施するif文
\includegraphics[keepaspectratio, scale=1.0]{figure/if_1.eps}

5.1.3 2分岐の場合

「もし○○ならば△△し、さもなければ□□する」というように、条件により二者択一の 選択処理が必要な場合がある。これは、次のように書く。
書式
	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");	  
	}
図 7: elseを使って、二者択一の処理をする構文
\includegraphics[keepaspectratio, scale=1.0]{figure/if_2.eps}

5.1.4 連続制御の分岐

「もし○○ならば $ \circledast\circledast$する。さもなければ、もし□□ならば $ \boxtimes\boxtimes$する。さもなければ、もし $ \bigtriangleup\bigtriangleup$ならば $ \bigtriangledown\bigtriangledown$する。さもなければ、 $ \circledcirc\circledcirc$ する。」というよう構文を書きたい場合がある。条件に合致しなければ、次の条件と、次々 に条件を変ている。これは、次のように書く。
書式
	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");
	}
図 8: if else if elseを使っての多段の選択
\includegraphics[keepaspectratio, scale=1.0]{figure/if_3.eps}

5.2 switch

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");
	}
図 9: switch文を使った構文。多くの選択肢がある場合。
\includegraphics[keepaspectratio, scale=1.0]{figure/switch.eps}

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成16年9月7日


no counter