制御構造1: 条件分岐

情報処理演習
制御構造1: 条件分岐
システム科学科 生物工学コース 佐々木耕太
http://www7.bpe.es.osaka-u.ac.jp/~kota/classes/jse.html
[email protected]
C言語のプログラムは
処理の流れがわかりやすい
int main(void)
{
/* 変数の宣言 */
/* 実行文 */
return 0;
}
int main(void)の
ブロックを上から下へ
1文ずつ実行していく
条件によっては実行する
int main(void)
{
/* 変数の宣言 */
/* 実行文 */
int main(void)の
ブロックを上から下へ
1文ずつ実行していく
ある条件を満たすときだけ実行
する(ある条件を満たさないと
きは実行しない)ところ
return 0;
}
例: sqrtの引数に負の数を与えるとエ
ラーを起こすので、sqrtを用いた
計算は非負の数のときだけ行いた
い
条件分岐
if (条件式)
ブロック1
else
ブロック2
if (条件式)
ブロック
条件式
Yes
ブロック
No
条件式
No
Yes
ブロック1 ブロック2
条件分岐
例: xが非負の数なら正規の計算をし、
そうでなければ警告メッセージを出力する
if (x >= 0.0) { x ≥ 0.0のときに実行されるブロック
/* 正規の計算をする */
} else {
そうでないときに実行されるブロック
printf(“xは非負の数ではありません。\n”);
}
設計者が期待するいい条件がそろったときだけ正常に動作するのでは
なく、起こりうる悪い条件(間違いや事故)を想像し、その場合どう
対処するかあらかじめ考えてプログラムを作成することが実用上大切
(プログラムを使う人が、設計者の意図をわかった上で使ってくれる
とも、意図通りにいつも使ってくれるとも期待してはいけない)
真偽評価の演算子
比較演算子
数学
C言語
=
≠
>
≥
<
≤
==
!=
>
>=
<
<=
論理演算子
数学
(not)
∧ (and)
∨ (or)
C言語
!
&&
||
if (条件式)の直後に;を書かない
参考: ifやelse if、elseの後ですることが
1文だけならブロックを用いなくてもよい
if (条件式) {
文;
}
同じ
if (条件式)
文;
したがって、if (条件式);と書くと、条件式を満たすときには;
(何もしない)を実行することになる。その後にあるブロックや
文は条件式を満たすかどうかに関わらず実行される(ので、プロ
グラムは期待したように動作しない)。
/* ふたつの値の相加平均を計算する
入力された値がいずれも非負の数だったら相乗平均も計算する
(if - elseの例) */
#include <stdio.h>
#include <math.h>
int main(void)
{
double val1, val2, arith_mean, geo_mean;
printf(“ふたつの値の相加平均と相乗平均を計算します\n”);
printf(“入力された値のいずれかが負の数なら相乗平均の計算はしません\n”);
printf(“ひとつめの値を入力してください:”);
scanf(“%lf”, &val1);
printf(“ふたつめの値を入力してください:”);
scanf(“%lf”, &val2);
arith_mean = (val1 + val2) / 2.0; /* 相加平均 */
printf(“相加平均は%f、”, arith_mean);
if (val1 >= 0.0 && val2 >= 0.0) {
geo_mean = sqrt(val1 * val2); /* 相乗平均 */
printf(“相乗平均は%fです\n”, geo_mean);
} else {
printf(“入力された値のいずれかが負の数だったので相乗平均は計算しませんでした\n”);
}
return 0;
}
if - else if - else
if (条件式1)
ブロック1
else if (条件式2)
ブロック2
else
ブロック3
条件式1
Yes
ブロック1
• else
No
条件式2
No
Yes
ブロック2
ブロック3
ifは、ifの後で何度でも用いることができる
• 最後のelseは必要なければ省略できる
/* ふたつの整数を読み込み、それらの大小関係に応じて
メッセージを出力する(if - else if - elseの例) */
#include <stdio.h>
int main(void)
{
int n, m;
printf(“ふたつの整数の大小関係を判定します\n”);
printf(“整数をふたつ入力してください\n”);
printf(“整数 N:”); scanf(“%d”, &n);
printf(“整数 M:”); scanf(“%d”, &m);
if (n == m) {
printf(“NとMは等しい\n”);
} else if (n > m) {
printf(“NはMより大きい\n”);
} else {
printf(“MはNより大きい\n”);
}
1行に2文以上書いてもよい
等しいかどうか評価するときは==を使う
(=は右辺(の計算の結果)を左辺の変
数に代入するために使う)
return 0;
}
このプログラムを「NとMは等しい」「差は10未満である」「差は
10以上ある」ことを判定するプログラムに書き換えてみよ
/* 100点満点のテストの点数を整数値として読み込んで優、良、可、不可を出力する
(if - else if - elseの例) */
#include <stdio.h>
int main(void)
{
int n;
printf(“テストの点数に応じて成績をつけます\n”);
printf(“点数を入力してください:”);
scanf(“%d”, &n);
if (n >= 0 && n < 60) /* 0 <= n < 60ではどうなる? */ {
printf(“不可\n来年もがんばってください\n”);
} else if (n >= 60 && n < 70) {
printf(“可\n”);
} else if (n >= 70 && n < 80) {
printf(“良\n”);
} else if (n >= 80 && n <= 100) {
printf(“優\nおめでとう\n”);
} else {
printf(“評価なし\n”);
}
return 0;
}
ブロックは入れ子にできる
は の中のブロック
if (x <= 0.0) {
if (y <= 0.0) {
/* x <= 0.0 かつ y <= 0.0 のとき */
} else {
/* x <= 0.0 かつ y > 0.0 のとき */
}
} else {
/* x > 0.0 のとき */
}
©Beeworks/SUCCESS
if (
)は、(
)の中が
0ではないかどうか評価する
真のときは1に
(n == 0などの)条件式は
置き換えられる
偽のときは0に
if (
/*
) {
が0でなければこのブロックを実行する */
} else {
/*
が0ならこのブロックを実行する */
}
• nが0かどうか評価したい時にif
(n = 0)と書き間違える
と、まずnに0が代入され、そして、その値(この場合0)が
評価に使われるので、…どうなる?
• if
(n >= 0 && n < 60)の代わりに、
if (0 <= n < 60)と書くと…どうなる?
/* 等しいかどうか評価するためには == を使う
=は右辺(の計算の結果)を左辺の変数に代入するために使う
ifに条件式ではなく整数を与えてみる */
#include <stdio.h>
int main(void)
{
int n, val;
n = 0;
val = n == 0; /* n == 0の結果をvalに代入する */
/* val = n = 0; */ /* 上の文との違いを説明できる? */
printf(“if (%d)では、”, val);
if (val) {
printf(“ifの直後のブロックが実行されました\n”);
} else {
printf(“elseの直後のブロックが実行されました\n”);
}
return 0;
}