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