2 制御文(9章)

プログラミング言語の制御構造は、次の3通りから成り立っている。
順次
これはプログラムの文を上から下へと実行する構造で、特にこれを表す命令はない。
選択
値により、実行する文が異なる構造である。C言語にはif文と switch文がある。switch文はプログラムの構造が分か り難くるので、if文を使うことが望ましい。
繰り返し
同じ文を繰り返す構造である。C言語には、for文とwhiledo-while文がある。

2.1 if文(p.138)

if文には典型的な3つのパターンがある。if文中の制 御式は、0(ゼロ)の場合のみ偽であり、その他は全て真である。この真偽により、実行さ れる文が3パターンあるのである。

2.1.1 if文のみの場合

制御式(条件)が真の場合には特定の文を実行するが、偽の場合には実行する文がない。 実行する文が一つの場合は。ifの制御式に引き続き書く。一方、複数の実行文があ る場合は、中括弧{文}でくくりブロック化する。そうするとブロック化された部 分が上から下へと実行される。
図 1: ブロックが無い場合
\includegraphics[keepaspectratio,scale=1.0]{figure/if_0.eps}
図 2: if文のみの場合
\includegraphics[keepaspectratio,scale=1.0]{figure/if_1.eps}

2.1.2 ifelseの場合

制御式(条件)が真偽に応じて、実行する文が異なる。
図 3: ifelseの場合
\includegraphics[keepaspectratio,scale=1.0]{figure/if_2.eps}

2.1.3 ifelse ifelseの場合

制御式(条件)が多段階になっている。最初に真にマッチしたブロックを実行する。制 御式が真にならない場合は、elseのブロックを実行する。
図 4: ifelse ifelseの場合
\includegraphics[keepaspectratio,scale=1.0]{figure/if_3.eps}

2.2 switch文(p.147)

式の値により、実行される文が決まる。
図 5: switch文による分岐構造
\includegraphics[keepaspectratio,scale=1.0]{figure/switch.eps}

2.3 指定回数繰り返し

条件に従い同じ文を繰り返し実行する構造をループ(繰り返し)と呼ぶ。繰り返し回数が分かって いる場合は、for文を使う。

2.3.1 for文(p.142)

ループの回数が予め分かっている場合に使う。実行順序は次の通りである。
  1. 初期値設定式が評価(実行)される。
  2. 継続条件式を評価し、それが真ならばブロック化された文が実行される。偽なら ば、for文から抜ける。
  3. 再設定式が実行される。
  4. 継続条件式が偽になるまで、 2 $ \rightarrow$3 $ \rightarrow$2 $ \leftarrow$3 $ \rightarrow$2 $ \rightarrow$3 $ \rightarrow$2 $ \rightarrow\cdots$が繰り返される。
図 6: for文による繰り返し(ループ)構造
\includegraphics[keepaspectratio,scale=1.0]{figure/for.eps}

for文を用いた1〜100までの和を用いたプログラムをリスト1に示 す。

2行
変数宣言。iは加算する数、sumは合計を格納する変数。
6行
合計値の初期化。最初、合計はゼロである。
8-10行
中括弧{}のブロック内をi=1〜100まで変えて100回計算する。
9行
sum=sum+iと同じ
\begin{lstlisting}[caption=1〜100の和の計算,label=prog:sum_for]
...

以下の練習問題を実施せよ。
[練習1]
次の動作をするプログラムを作成せよ。最後の$ c$の値はどの ような値になるか?
  1. 実数$ a, b$の初期値をそれぞれ、1.0と2.0とする。
  2. 実数$ c$ $ c=(a+b)/2.0$とする。
  3. もし、$ c^2$が2より小さければ、$ c$の値を$ a$に代入す る。反対に2よりも大きければ、$ c$の値を$ b$に代入 する。
  4. 操作2〜3を100回繰り返す。
[練習2]
以下の級数展開式を用いてネピア数( $ \mathrm{e}$)を計算せ よ。少し難しいので、余裕のある者のみ実施せよ。

$\displaystyle \mathrm{e}$ $\displaystyle =1+1+\frac{1}{2}%
+\frac{1}{3\times2\times1}%
+\frac{1}{4\times3\times2\times1}+\cdots$    
  $\displaystyle =\sum_{i=0}^{\infty}\frac{1}{i!}$ (1)

2.4 不定回数繰り返し

繰り返し回数が予め分かっていない場合は、do while文かwhile文を用いる。それぞれ の違いは、以下の通りである。

2.4.1 while文(p.143)

入口で継続条件を判断するため、最初から偽の場合、ループは一度も回らない。ループ を抜け出すためには、ループの文中に継続条件に使う値を変更するか、break文を使う。
図 7: while文による繰り返し(ループ)構造
\includegraphics[keepaspectratio,scale=1.0]{figure/while.eps}
[練習1]
while文を使って、1〜100まで加算するプログラムを 作成せよ。

2.4.2 do-while文(p.145)

出口で継続条件を判断するため、必ず1回はループが回る。ループを抜け出すために は、ループの文中に継続条件に使う値を変更するか、break文を使う。
図 8: do-while文による繰り返し(ループ)構造
\includegraphics[keepaspectratio,scale=1.0]{figure/do_while.eps}
[練習1]
do-while文を使って、1〜100まで加算するプログラムを 作成せよ。

2.5 break文(p.149)

ループから強制的に脱出するために、break文がある。単独で使われることは希で、以下 のようにif文と共に使われる。break文を用いると、for文やdo while文、while文のルー プから抜け出せる。
図 9: break文による分岐構造
\includegraphics[keepaspectratio,scale=1.0]{figure/break.eps}

2.6 continue文(p.150)

ループ中の繰り返しを1回強制的にスキップするために使われる。これも単独で使われる ことは希で、以下のようにif文と共に使う。
図 10: continue文による繰り返し(ループ)構造
\includegraphics[keepaspectratio,scale=1.0]{figure/continue.eps}

2.7 goto文とラベル(p.152)

強制的にプログラムの制御を移す。goto文が示すラベルに実行が移る。if文と共 に用いられることも多いが、単独で用いられることもある。

ただし、goto文はプログラムの流れがわかりにくくなりますので、使わないほうが良いと されている。行儀の良いプログラムを書くためにはgoto文は使わないことになって いる。ただし、初心者が書くような短いプログラムであれば使っても良いでろう。簡単だ し、行儀が悪くてもプログラムを書くことになれる方が重要である。上達したら、 goto文を書かないようにすればよい。

ラベル名の後ろには、セミコロンではなく文の前に書いてコロンをつける。

図 11: goto文とラベルによる制御
\includegraphics[keepaspectratio,scale=1.0]{figure/goto.eps}

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


no counter