cp-4. 条件分岐と場合分け
C プログラミング入門
URL: https://www.kkaneko.jp/pro/adp/index.html
1
金子邦彦
if文による条件分岐の記述方法、比較演算と論理演算の
組み合わせによる複雑な条件式の構築
学習内容の構成
1. if文とelse:条件式の成否に応じて実行する処理
を分岐
2. 比較演算<<=>>===!=による値の比較
3. else if:複数条件による多分岐の実現
4. 論理演算&&(かつ)、||(または)、!(でない)
による条件式の組み合わせ
前提:四則演算、ライブラリ関数(sqrtlogなど)の
使用方法
意義:入力値に応じた柔軟な処理が可能なプログラム
の作成能力
2
条件分岐とは
Yes
No
条件式
「ある条件式」が成り立てばAを、成り立た
なければBを実行
3
計算における条件分岐の例
平方根の計算
正または0ならば sqrt() を使って計算できる
負の数ならば 平方根は計算できない
対数の計算
正ならば log() を使って計算できる
0または負の数ならば 対数は計算できない
など
4
例題1.平方根の計算
浮動小数データを読み込んで,平方根の計算と表示を行う
プログラムを作る.
但し,負の数の場合には,メッセージを表示すること.
負の数であるかどうかによって条件分岐を行うため if 文を使う
例) 9のとき:
-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
条件式
if ( 条件式 ) {
;
...
}
else {
;
...
}
9
if
if 文のみを書いて,else 文を書かないこともで
きる
「ある条件」が成り立つときに限りAを実行
Yes
No
条件式
if ( 条件式 ) {
;
...
}
10
比較演算
条件式の中には,ふつう,比較演算を書く
演算子 意味
左辺が右辺より小さい
<= 左辺が右辺以下
左辺が右辺より大きい
>= 左辺が右辺以上
== 左辺が右辺と等しい
!= 左辺が右辺と等しくない
11
比較演算の例
if (age >= 20 ){
printf("You may drink alcoholic beverage. ");
}
else{
printf("You may not drink alcoholic beverage.");
}
「左辺が右辺以上」の意味
12
ここまでのまとめ
Yes
No
条件式
if ( 条件式 ) {
;
...
}
else {
;
...
}
Yes
No
条件式
if ( 条件式 ) {
;
...
}
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
条件式
条件式
Yes
A, B, C のうちどれか1つを実行
No
17
if 文の入れ子
if 文は,上のように,入れ子にすることもで
きる
if ( 条件式 ) {
if ( 条件式 ) {
;
...
}
;
...
}
else {
;
...
}
18
if 文の入れ子
Yes
No
条件式
条件式
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 yearn ",y);
}
else {
printf("%d is not a leap yearn ",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月は,前年の1314月と考えるというこ
ヒント (意味を理解してから使うこと):
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