• 検索結果がありません。

条件判断による処理の選択

ドキュメント内 新潟大学学術リポジトリ (ページ 62-69)

54 3. 復習 処理の選択と繰り返し

3 復習 処理の選択と繰り返し

3つの数の最大値(if文,if-else構文,論理演算, 条件演算子),

階乗 (for文), どうやって繰り返し構造を見出 すか?,

自習 素数(break文),最大公約数(ユークリッ ドの互除法),

自習 不定個の入力データの合計(while文),

自習 元号表記→西暦表記(switch文),

自習 プログラムを組み立てられない時は...

この節では、下図の形の処理の流れがC言語でどの様に記述されるのかを見る。

True

False

True False

True

False False

False True

True ・・・

・・・ ・・・

True False

True False

True False

入力

True False 入力失敗

3.1. 条件判断による処理の選択 55

(プログラミング) そこで、読み込んだ整数データ

を格納するために a, b, c という名前の変数を、

「それまでに見た中での最大値」を保持するために max という名前の変数を用意し、a, b, c の順に 中のデータを眺めることにすれば、行うべき処理 は右図の様に書き表すことができる。

この処理を行うCプログラムと、これをコンパイ ル/実行している様子を次に示す。(下線部はキー ボードからの入力を表す。)

開始 入力

a, b, c a, b, c は整数 a

max

終了 出力

"max =", max True False

b > max

b max

True False

c > max

c max

[motoki@x205a]$ nl max-among-3-elem-no1.c Enter 1 /* 3つの入力データの最大値(その1) */

2 #include <stdio.h>

3 int main(void) 4 {

5 int a, b, c, max;

6 scanf("%d%d%d", &a, &b, &c);

7

8 max = a;

9 if (max < b)

10 max = b;

11 if (max < c)

12 max = c;

13 printf("max = %d\n", max);

14 return 0;

15 }

[motoki@x205a]$ gcc max-among-3-elem-no1.c Enter [motoki@x205a]$ ./a.out Enter

1 2 3 Enter max = 3

[motoki@x205a]$

ここで、

• プログラムの9∼10行目,および11∼12行目 は if文と呼ばれる、条件分岐のための 構文である。例えば9∼10行目は、括弧の中の条件「max < b」が成立すれば代入文

「max = b」を実行し、成立しなければ何もしない、ということを表す。

56 3. 復習 処理の選択と繰り返し

'

&

$

% 補足:

C言語においては、max < bといった条件を表す式の評価結果は true, false どの論理値ではなく整数値である。従って、例えば910行目においては、実際 には、条件max < bが成立すればこの関係式の値は1と計算され、成立しなけ れば0 と計算される。そして、この関係式の値が1の時だけ10行目の代入文が 実行される。

例題3.1に対するアルゴリズム(2):

(考え方) 整数3つを読み込んだあとで、最大要素が特定できるまで、読み込んだ整数

a, b, c 間の大小関係についての場合分けを重ねる。 例えば、まず a < b かどうかで場合

分けする。そして、もし a < b なら b < c かどうかで場合分けし、もし a≥b ならa < c かどうかで場合分けする。 これで、4つの場合に分かれ、各々の場合に最大要素が特定で きるので、どの場合でもあとはその値を出力するだけである。

(プログラミング) 読み込んだ整数データを格納するために a, b, cという名前の変数

を用意することにすれば、行うべき処理は次の図の様に書き表すことができる。

開始 入力

a, b, c a, b, c は整数

終了 出力

"max =", b True False

a < b True

False

終了 出力

"max =", c

終了 出力

"max =", c

終了 出力

"max =", a

b < c True a < c False

あるいは、

開始 入力

a, b, c a, b, c は整数 True

False a < b True

False

終了 出力

"max =", max

b < c True a < c False

c

max max b max c max a

この処理を行うCプログラムと、これをコンパイル/実行している様子を次に示す。 (下 線部はキーボードからの入力を表す。)

[motoki@x205a]$ nl max-among-3-elem-no2.c Enter 1 /* 3つの入力データの最大値(その2) */

2 #include <stdio.h>

3.1. 条件判断による処理の選択 57

3 int main(void) 4 {

5 int a, b, c, max;

6 scanf("%d%d%d", &a, &b, &c);

7

8 if (a < b){

9 if (b < c)

10 max = c;

11 else

12 max = b;

13 } else{

14 if (a < c)

15 max = c;

16 else

17 max = a;

18 }

19 printf("max = %d\n", max);

20 return 0;

21 }

[motoki@x205a]$ gcc max-among-3-elem-no2.c Enter [motoki@x205a]$ ./a.out Enter

1 2 3 Enter max = 3

[motoki@x205a]$

ここで、

• プログラム8行目最後∼13行目最初、13行目最後∼18行目 の部分は { と } で囲ま れているので、それぞれ複合文と呼ばれ構文上は1つの文と同等に扱われる。

• プログラム8行目 のif は13行目 のelseと組になり、if-else構文と呼ばれる条件分 岐の構文を構成している。このプログラムの場合は、8行目の括弧の中の条件a < b が成り立てば 8行目最後∼ 13行目最初の複合文が次に実行され、成り立たなければ 13行目最後∼18行目の複合文が次に実行されることになる。

• プログラム9行目,14行目 のifはそれぞれ11行目, 16行目 のelseと組になりif-else 構文を構成し、条件分岐の働きをする。

58 3. 復習 処理の選択と繰り返し

(プログラミング,別の方向) C言語においては、計 算式の中で条件分岐を表すための構文が用意されて いる。 そこで、この構文の使用を前提にして

最大要素が特定できるまで場合分けを重ねる という考え方に従って処理手順を組み直すと、行う べき処理は右図の様に書き表すこともできる。

この処理を行うCプログラムと、これをコンパイル/

実行している様子を次に示す。(下線部はキーボード からの入力を表す。)

開始 入力

a, b, c a, b, c は整数

終了 出力

"max =",

if a<b then if b<c then c else b else if a<c then c else a

[motoki@x205a]$ nl max-among-3-elem-no4.c Enter 1 /* 3つの入力データの最大値(その4) */

2 #include <stdio.h>

3 int main(void) 4 {

5 int a, b, c;

6 scanf("%d%d%d", &a, &b, &c);

7 printf("max = %d\n", (b<=a && c<=a) ? a : (c<=b ? b : c));

8 return 0;

9 }

[motoki@x205a]$ gcc max-among-3-elem-no4.c Enter [motoki@x205a]$ ./a.out Enter

1 2 3 Enter max = 3

[motoki@x205a]$

ここで、

• プログラム7行目 の (b<=a && c<=a) ? a : (c<=b ? b : c) は条件演算子(?

と : の組)を入れ子に使って出来た式である。この式の値を求める時には、まず条件 (b<=a && c<=a) が成り立つかどうかが調べられ、成り立てばa の値が、そして成り 立たなければ式 (c<=b ? b : c) の値が計算され、その結果が求める式の値として 扱われる。

例題3.1に対するアルゴリズム(3):

(考え方) 読み込んだ整数a, b, c間の大小関係を調べることにより、各々の要素が最大で

あるかどうかを判定することができる。例えば、

aが最大⇐⇒a≥bかつa≥c

である。 それゆえ、整数3つを読み込んだあとで、まず aが最大かどうか で場合分けす る。 その結果、もし aが最大 ならその値を出力し、もしそうでないなら 残ったb, cの間

3.1. 条件判断による処理の選択 59

でbが最大かどうか で場合分けして、各々の場合について答えを出力すればよい。

(プログラミング) 読み込んだ整数データを格納するために a, b, c という名前の変数

を用意することにすれば、行うべき処理は次の図の様に書き表すことができる。

開始 入力 a, b, c

a, b, c は整数

終了 出力

"max =", a aが最大

False

出力

"max =", b

出力

"max =", c

True True bが最大 False

a≧b かつ a≧c かどうかを調べればよい この時点では a が最大になる 可能性はないので、

b≧c かどうかを調べればよい

あるいは、

開始 入力 a, b, c

a, b, c は整数

終了 aが最大

False

bが最大

True True False

a≧b かつ a≧c かどうかを調べればよい この時点では a が最大になる 可能性はないので、

b≧c かどうかを調べればよい

a

max max b max c

出力

"max =", max

この処理を行うCプログラムと、これをコンパイル/実行している様子を次に示す。 (下 線部はキーボードからの入力を表す。)

[motoki@x205a]$ nl max-among-3-elem-no3.c Enter 1 /* 3つの入力データの最大値(その3) */

2 #include <stdio.h>

3 int main(void) 4 {

5 int a, b, c, max;

6 scanf("%d%d%d", &a, &b, &c);

7

8 if (b<=a && c<=a)

9 max = a;

10 else if (c<=b)

11 max = b;

12 else

60 3. 復習 処理の選択と繰り返し

13 max = c;

14 printf("max = %d\n", max);

15 return 0;

16 }

[motoki@x205a]$ gcc max-among-3-elem-no3.c Enter [motoki@x205a]$ ./a.out Enter

1 2 3 Enter max = 3

[motoki@x205a]$

ここで、

• プログラム8行目 の式 b<=a && c<=a は「b≤a かつ c≤a」という意味の論理式で ある。

• プログラム8∼13行目 はif-else構文が入れ子になった構造をしている。まず、論理式 b<=a && c<=a が成り立つかどうかが調べられ、もし成り立てば次に9行目の代入文 が実行され、もし成り立たなければ次に10行目途中∼13行目のif-else構文が実行さ れることになる。

C言語における論理式の扱い(概略): (=⇒ 3.7.1節を参照)

• C言語には真理値(真と偽)を表すためのデータ型は用意されていない。

=⇒ int型で代用。

( 真 · · · 0以外(標準は1) 偽 · · · 0

• 関係演算子として使えるのは <, <=, >, >=, ==, != の 6つ。これにより、例えば b*b-4*a*c>=0 や x==0 といった関係式を条件判定に使うことができる。

• 論理演算子として使えるのは&&,||,!の3つで、それぞれAND, OR, NOTを表す。

例えば、論理式

a>0 && b>0 && c>0 && a+b>c && b+c>a && c+a>b は

a>0 かつ b>0 かつ c>0 かつ a+b>c かつ b+c>a かつ c+a>b という意味であり、論理式

!(a<=0 || b<=0 || c<=0) は

(a<=0 または b<=0 または c<=0) でない という意味である。

• 式 p && q は左の条件から順に評価され、p の条件が不成立なら q の評価を行 うことなく、p && q は不成立と判定される。同様に、p || q も左から順に評価 され、pの条件が成立すればq の評価を行うことなく、p || q は成立と判定され る。この様に式全体の評価値が確定した時点で評価を終える方式を短絡評価と言う。

ドキュメント内 新潟大学学術リポジトリ (ページ 62-69)