cp-4. 条件分岐と場合分け
(C プログラミング入門)
URL: https://www.kkaneko.jp/pro/adp/index.html
1
金子邦彦
if文による条件分岐の記述方法、比較演算と論理演算の
組み合わせによる複雑な条件式の構築
【学習内容の構成】
1. if文とelse文:条件式の成否に応じて実行する処理
を分岐
2. 比較演算:<、<=、>、>=、==、!=による値の比較
3. else if文:複数条件による多分岐の実現
4. 論理演算:&&(かつ)、||(または)、!(でない)
による条件式の組み合わせ
• 前提:四則演算、ライブラリ関数(sqrt、logなど)の
使用方法
• 意義:入力値に応じた柔軟な処理が可能なプログラム
の作成能力
2
条件分岐とは
Yes
No
B A
条件式
• 「ある条件式」が成り立てばAを、成り立た
なければBを実行
3
計算における条件分岐の例
• 平方根の計算
• 正または0ならば → sqrt() を使って計算できる
• 負の数ならば → 平方根は計算できない
• 対数の計算
• 正ならば → log() を使って計算できる
• 0または負の数ならば → 対数は計算できない
など
4
例題1.平方根の計算
• 浮動小数データを読み込んで,平方根の計算と表示を行う
プログラムを作る.
• 但し,負の数の場合には,メッセージを表示すること.
• 負の数であるかどうかによって条件分岐を行うために if 文を使う.
例) 9のとき: 3
-1のとき: メッセージを表示
5
#include <stdio.h>
#include <math.h>
#pragma warning(disable:4996)
int main()
{
double x;
double y;
printf("x=");
scanf("%lf",&x);
if ( x < 0 ) {
printf("負なので計算できません¥n");
}
else {
y = sqrt(x);
printf("sqrt(%f)=%f¥n", x, y);
}
return 0;
}
条件が成り立つ
場合に実行され
る部分
条件式
条件が成り立た
ない場合に実行
される部分
6
平方根の計算
実行結果の例
x=9
sqrt(9.000000)=3.000000
x=-1
負なので計算できません
7
プログラム実行順
printf("x=");
scanf("%lf ",&x);
y = sqrt(x);
printf("sqrt(%f)=%f¥n",x, y);
return 0;
メッセージ「x=」を表示
浮動小数データを読み込み
平方根を計算し,
計算結果を表示
終わり
Yes
No
条件分岐
x < 0
printf("負なので計算できません
¥n");
メッセージを表示
8
if 文と else 文
• 「条件式」が成り立てばAを、成り立たな
ければBを実行
Yes
No
B
A
条件式
if ( 条件式 ) {
式;
...;
}
else {
式;
...;
}
B
A
9
if 文
• if 文のみを書いて,else 文を書かないこともで
きる
• 「ある条件」が成り立つときに限りAを実行
Yes
No
A
条件式
if ( 条件式 ) {
式;
...;
}
A
10
比較演算
• 条件式の中には,ふつう,比較演算を書く
• 演算子 意味
< 左辺が右辺より小さい
<= 左辺が右辺以下
> 左辺が右辺より大きい
>= 左辺が右辺以上
== 左辺が右辺と等しい
!= 左辺が右辺と等しくない
11
比較演算の例
if (age >= 20 ){
printf("You may drink alcoholic beverage. ");
}
else{
printf("You may not drink alcoholic beverage.");
}
「左辺が右辺以上」の意味
12
ここまでのまとめ
Yes
No
B
A
条件式
if ( 条件式 ) {
式;
...;
}
else {
式;
...;
}
B
A
Yes
No
A
条件式
if ( 条件式 ) {
式;
...;
}
A
13
字下げとセミコロンを忘れないこと
if ( 条件式 ) {
文;
...;
}
else {
文;
...;
}
if ( 条件式 ) {
文;
...;
}
字下げ
セミコロン
字下げ
セミコロン
• セミコロンを忘れると
• プログラムは動かない
• 字下げを忘れると
• プログラムは動くが,
読みづらい
14
字下げ
例題2.多分岐の例
• キーボードから数値を読み込んで,
13以上なら 「100 Yen」
6以上なら 「50 Yen」
それ以外なら 「0 Yen」
と表示するプログラムを作る
• 多分岐を行うために,else if 文を使う
15
#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
int a;
printf("a=");
scanf("%d",&a);
if ( a > 13 ) {
printf("100 Yen¥n");
}
else if( a > 6 ) {
printf("50 Yen¥n");
}
else {
printf("0 Yen¥n");
}
return 0;
}
このうちどれか1つ
が実行される
16
多分岐の例
Yes
No
C
B
条件式
条件式
A
Yes
A, B, C のうちどれか1つを実行
No
17
if 文の入れ子
• if 文は,上のように,入れ子にすることもで
きる
if ( 条件式 ) {
if ( 条件式 ) {
式;
...;
}
式;
...;
}
else {
式;
...;
}
18
if 文の入れ子
Yes
No
C
B
条件式
条件式
A
Yes
No
19
課題1.2次方程式
• 2次方程式 ax
2
+ by + c = 0 の解を求めるプログ
ラムを作りなさい
• 重解,虚数解も正しく求めなさい(判別式 b
2
-4ac
の値で条件分岐する)
• 余裕があれば,(1)a=0, (2)a=0 かつ b=0, (3) a=0 かつ
b=0 かつ c=0 の場合にも,正しく解を求めるように
しなさい
• 「#include <math.h>」を忘れない
• 複素数は,実数部と虚数部に分けて扱う(実数部用と
虚数部用の変数を使う)
• 解が2つあるので,そのための変数を使う
20
課題2.if 文の入れ子
価格と重量(ともに浮動小数データ)を読み込んで,
価格1000以上で,重さ100以上 → Unnecessary
価格1000以上で,重さ100未満 → Expensive
価格1000未満で,重さ100以上 → Reasonable
価格1000未満で,重さ100未満 → Cheap
と表示するプログラムを作成せよ
21
例題3.うるう年の判定
• 「西暦年」を読み込んで,うるう年かどうか表
示するプログラムを作る.
• うるう年の判定のために,比較演算と論理演算を組
み合わせる
例) 2001 → 2001 is not a leap year.
2004 → 2004 is a leap year.
22
グレゴリオ暦でのうるう年
• うるう年とは: 2月が29日まである年
• うるう年は400年に97回で,1年の平均日数は
365.2422日
• うるう年の判定法
• 年数が4の倍数の年 → うるう年
• 但し, 100の倍数の年で400の倍数でない年
→ うるう年ではない
(4の倍数なのだが例外とする)
(例) 2008年: うるう年(4の倍数)
2004年: うるう年(4の倍数)
2000年: うるう年(4の倍数)
1900年: うるう年ではない
(100の倍数だが400の倍数でない)
1800年: うるう年ではない
(100の倍数だが400の倍数でない)
23
うるう年の判定
#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
int y;
printf("year=");
scanf("%d",&y);
if (((y % 400) == 0) || (((y % 100) != 0) && ((y %4) == 0))) {
printf(" %d is a leap year.¥n ",y);
}
else {
printf("%d is not a leap year.¥n ",y);
}
return 0;
}
条件式
条件が成り立つ
場合に実行され
る部分
条件が成り立た
ない場合に実行
される部分
24
うるう年の判定式
((y % 400) == 0) || ((( y % 100) != 0) && (( y % 4)
==0))
400の倍数である 100の倍数でない 4の倍数である
かつ
または
25
論理演算
• A && B A かつ B
• A || B A または B
• !A Aでない
真,偽に関する論理的な演算を行う.
26
if ( ( m == 1 ) || ( m == 2 ) ) {
y = y – 1;
m = m + 12;
}
m が1,または m が2の時に限り実行
論理演算子
比較演算子
例)
27
比較演算と論理演算の組み合わせ
課題3.曜日を求めるプログラム
• ツエラーの公式を使い,年,月,日を読み込ん
で,曜日を求めるプログラムを作成しなさい.
• ツエラーの公式については,次ページの解説を参照せ
よ
• 計算された曜日は,数字として表示すること
0:日曜日
1:月曜日
2:火曜日
3:水曜日
4:木曜日
5:金曜日
6:土曜日
28
ツエラーの公式
(y + (y/4) - (y/100) + (y/400) + ((13 * m + 8 ) / 5) + d) % 7
・この値が0なら日曜,1なら月曜・・・
・年,月,日を表す変数 y, m, d を,整数データとして
宣言すること.つまり, 「 /4」, 「/ 5」などは,割り
算を行って小数点以下切り捨てと考えよ.
• ツエラーの公式では,「1年の起点 を3月とし、月
は3月から14月まである」と考えている
• 1月,2月は,前年の13,14月と考えるということ
• ヒント (意味を理解してから使うこと):
if ( ( m == 1 ) || ( m == 2 ) ) {
y = y – 1;
m = m + 12;
}
29
より勉強したい人への付録
30
if 文での {, } の省略
• if文での {, } を省略したプログラムが時々あるので慌てな
いこと
• {, } 内に1つの式あるいは文しか書かない場合に限り省略可
• {, } を省略すると,しばしば,プログラムが読みにくくな
る
if (age >= 20 ) {
printf("You can smoke");
}
else {
printf("You can not smoke");
}
if (age >= 20 )
printf("You can smoke");
else
printf("You can not smoke");
同じ意味
31