5 基本制御構造(選択)

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

5.1 if else文(p.138)

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

5.1.1 処理が1つの場合

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

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

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

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

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

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

	if(0<=a && a<=10){
	  printf("aは,0以上\n");
	  printf("かつ\n");
	  printf("aは,10以下です\n");
	}
-4pt
図 7: 制御式が真の場合,ブロックで処理を実施する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つの場合,ブロック化しなくても良い.図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");	  
	}
図 8: 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を実行する.さもなければ,制御式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");
	}
図 9: if else if elseを使っての多段の選択
\includegraphics[keepaspectratio, scale=1.0]{figure/if_3.eps}
[練習2]
キーボードから二次方程式 $ ax^2+bx+c=0$の係数$ a,b,c$を読み込む. 係数の値にしたがい「異なる2つの実数解があります.」あるいは 「重根です.」,「2つのことなる虚数解があります.」--と表示す るプログラムを作成せよ.

5.2 switch文(p.147)

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

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


no counter