pe-3. 条件分岐と場合分け
1
(Pascal プログラミング入門)
URL: https://www.kkaneko.jp/pro/pascal/index.html
金子邦彦
if文による条件分岐の仕組み、比較演算・論理演算を用いた
条件式の記述方法
【学習内容の構成】
1. 条件分岐:条件式の真偽に応じて異なる処理を実行する
制御構造
2. 比較演算:<、<=、>、>=、=、<>による値の比較
3. 論理演算:and、or、notによる複合条件の構築
4. 多分岐:else ifを用いた3つ以上の場合分け
• 前提:四則演算、ライブラリ関数(sqrt、ln等)、変数の
基本操作
• 意義:入力値に応じた柔軟な処理が可能となり、実用的な
プログラム作成への発展
2
前回のまとめ
Pascalには,四則演算と各種ライブラリ関数(三角
関数,指数・対数関数,平方根など)の機能がある
•3
))()(( csbsass −−−
2/)( cba ++
s := ( a + b + c ) / 2;
を計算し,s に格納
A := sqrt(s * (s - a) * (s - b) * (s - c));
を計算し,A に格納
条件分岐とは
• 「ある条件式」が成り立てばAを、成り立たなけ
ればBを実行
•4
Yes
No
B A
条件式
オンライン開発環境 Online GDB
• プログラミングを行えるオンラインのサービス
https://www.onlinegdb.com
• ウェブブラウザを使う
• たくさんの言語を扱うことができる
Pascal, Python3, Java, C/C++, C#, JavaScript,
R, アセンブリ言語,SQL など
• オンラインなので、「秘密にしたいプログラム」
を扱うには十分な注意が必要
5
Online GDB で Pascal を動かす手順
① ウェブブラウザを起動する
② 次の URL を開く
https://www.onlinegdb.com
6
③ 「Language」のところで,「Pascal」を選ぶ
7
エディタ画面
実行ボタン
プログラムを
書き換えること
ができる
8
例題1.平方根の計算
• 浮動小数点数データを読み込んで,平方根の計算
と表示を行うプログラムを作る.
• 但し,負の数の場合には,「計算できないこと」を意
味するメッセージを表示する
正または0のとき: sqrt() を使って計算できる
負のとき: 平方根は計算できない
• 負であるかどうかによって条件分岐を行うために if 文
を使う
•9
program sum;
var x: real;
begin
write('Please Enter x: ');
readln(x);
if x < 0 then begin
writeln('x < 0, then x is out of range');
end
else begin
writeln('sqrt(', x:8:3, ') =', sqrt(x):8:3);
end;
readln
end.
•10
条件式
条件が成り立つ
場合に実行され
る部分
条件が成り立た
ない場合に実行
される部分
平方根の計算
•11
実行結果の例
プログラム実行順
•12
write('Please Enter x: ');
readln(x);
writeln('sqrt(', x:8:3, ') =', sqrt(x):8:3);
readln
メッセージ
「Please Enter x:」を表示
浮動小数点数データを読み込み
平方根を計算し,計算
結果を表示
終わりの readln
Yes
No
条件分岐
x < 0
writeln(' x < 0, then x is out of
range');
メッセージを表示
プログラムとデータ
•13
メモリ
1つの変数
readln(x);
x
①
浮動小数点数データを
読み込み
writeln('sqrt(', x:8:3, ') =', sqrt(x):8:3);
③
計算と表示
if ... else 文
• 「条件式」が成り立てばAを、成り立たなければ
Bを実行
•14
Yes
No
B
A
条件式
if 条件式 then begin
文;
文;
...
end
else begin
文;
文;
...
end;
B
A
if ... else 文
「if ... then begin ... end else begin ... end;」 で
1つの文であり,文の末端には文の区切りとして,
セミコロンが必要
•15
if 条件式 then begin
文;
文;
...
end
else begin
文;
文;
...
end;
if 文
• if 文のみを書いて,else 文を書かないこともでき
る
• 「条件式」が成り立つときに限りAを実行
•16
Yes
No
A
条件式
if 条件式 then begin
文;
文;
...
end;
A
if 文
「if ... then begin ... end;」 で1つの文であり,文
の末端には文の区切りとして,セミコロンが必要
•17
if 条件式 then begin
文;
文;
...
end;
比較演算
• 比較演算は,条件式を書くときなどに使用
• 演算子 意味
< 左辺が右辺より小さい
<= 左辺が右辺以下
> 左辺が右辺より大きい
>= 左辺が右辺以上
= 左辺が右辺と等しい
<> 左辺が右辺と等しくない
•18
比較演算の例
if age >= 20 then begin
writeln('成人です');
end
else begin
writeln('未成年です');
end;
•19
「左辺が右辺以上」の意味
例題2.対数の計算
• 浮動小数点数データを読み込んで,e を底とする
対数の計算と表示を行うプログラムを作る.
• 但し,0または負の数の場合には,「計算できないこ
と」を意味するメッセージを表示する
正のとき: ln() を使って計算できる
0または負のとき: 対数は計算できない
• 負であるかどうかによって条件分岐を行うために if 文
を使う.
•20
• a を底とする指数関数
y = a
x
• a を底とする y の対数
x = log
a
y ⇔ y = a
x
•21
program sum;
var x: real;
begin
write('Please Enter x: ');
readln(x);
if x <= 0 then begin
writeln('x <= 0, then x is out of range');
end
else begin
writeln('ln(', x:8:3, ') =', ln(x):8:3);
end;
readln
end.
•22
条件式
条件が成り立つ
場合に実行され
る部分
条件が成り立た
ない場合に実行
される部分
対数の計算
•23
実行結果の例
プログラム実行順
•24
write('Please Enter x: ');
readln(x);
writeln('ln(', x:8:3, ') =', ln(x):8:3);
readln
メッセージ
「Please Enter x:」を表示
浮動小数点数データを読み込み
対数を計算し,計算結
果を表示
終わりの readln
Yes
No
条件分岐
x <= 0
writeln(' x <= 0, then x is out of range');
メッセージを表示
プログラムとデータ
•25
メモリ
1つの変数
readln(x);
x
①
浮動小数点数データを
読み込み
writeln('ln(', x:8:3, ') =', ln(x):8:3);
③
計算と表示
字下げとセミコロンを忘れないこと
• セミコロンを忘れると
プログラムは動かない
• 字下げを忘れると
プログラムは動くが,
読みづらい
•26
if 条件式 begin
文;
文;
...
end
else begin
文;
文;
...
end;
if 条件式 begin
文;
文;
...
end;
字下げ
セミコロン
字下げ
セミコロン
セミコロン
字下げ
例題3.定形郵便物の料金
• キーボードから数値を読み込んで,
25 以下なら 「84 Yen」
25 より大きくて50以下なら 「94 Yen」
50より大きいなら 「Too heavy」
と表示するプログラムを作る
• 多分岐を行うために,if 文を使う
•27
program sum;
var x: real;
begin
write('juuryou?: ');
readln(x);
if x <= 25 then begin
writeln('84 Yen');
end
else if x <=50 then begin
writeln('94 Yen');
end
else begin
writeln('Too heavy');
end;
readln
end.
•28
x <= 25 が成り立つ
場合に実行される部分
x <= 25 が成り立たず,
x <= 50 が成り立つ
場合に実行される部分
x <= 25 も成り立たず,
x <= 50 も成り立たない
場合に実行される部分
セミコロン
定形郵便物の料金
•29
実行結果の例
定形郵便物の料金
•30
Yes
No
C
B
x <= 25
x <= 50
A
Yes
A, B, C のうちどれか1つを実行
No
writeln('84 Yen');
writeln('94 Yen');
writeln('Too heavy');
•31
このうちどれか1つ
が実行される
program sum;
var x: real;
begin
write('juuryou?: ');
readln(x);
if x <= 25 then begin
writeln('84 Yen');
end
else if x <=50 then begin
writeln('94 Yen');
end
else begin
writeln('Too heavy');
end;
readln
end.
例題4.2次方程式
• 2次方程式 ax
2
+ by + c = 0 の解を求めるプログ
ラムを作る
• 重解,虚数解も正しく求めるために,判別式 b
2
-4ac
の値で条件分岐する
• この例題4では,「a=0」の場合は考えない
•32
D = b
2
- 4ac とする
1) 判別式 D > 0 のとき
2) D = 0 のとき
3) D < 0 のとき
•33
a
Db
a
Db
x
2
,
2
−−+−
=
,
2a
b
x −=
a
Dib
a
Dib
x
2
,
2
−−−−+−
=
異なる2実数解
重解
異なる2虚数解
program sum;
var a, b, c, D: real;
begin
write('Please Enter a: ');
readln(a);
write('Please Enter b: ');
readln(b);
write('Please Enter c: ');
readln(c);
D := b * b - 4 * a * c;
if D > 0 then begin
writeln('x =', (- b + sqrt(D))/ (2*a):8:3, ', ', (- b - sqrt(D))/ (2*a):8:3 );
end
else if D = 0 then begin
writeln('x =', - b / (2*a):8:3 );
end
else begin
writeln( 'x =', - b / ( 2*a ):8:3, ' + ', sqrt(-D) / (2*a):8:3, 'i ,',
- b / (2*a):8:3, ' - ', sqrt(-D) / (2*a):8:3, 'i');
end;
readln
end.
•34
D > 0 のとき
D = 0 のとき
D < 0 のとき
2次方程式
•35
実行結果の例
例題5.直線と原点の距離
• 平面: ax + by + c = 0 と原点との距離を求めるプ
ログラムを作成する
• 但し,a = 0 かつ b = 0 のときには計算を行わない
•36
22
ba
c
d
+
=
直線と原点の距離
•37
直線 ax + by + c = 0
o
x
y
program sum;
var a, b, c, d: real;
begin
write('Please Enter a: ');
readln(a);
write('Please Enter b: ');
readln(b);
write('Please Enter c: ');
readln(c);
if ( a = 0 ) and ( b = 0 ) then begin
writeln('a=0 and b=0!' );
end
else begin
d := abs( c ) / sqrt( a * a + b * b );
writeln('d =', d:8:3 );
end;
readln
end.
•38
条件が成り立つ場合に
実行される部分
条件が成り立たない
場合に実行される部分
直線と原点の距離
•39
実行結果の例
条件式
( a = 0) and ( b = 0 )
•40
a=0 である b=0 である
かつ
論理演算
• A and B A かつ B
• A or B A または B
• not A Aでない
真,偽に関する論理的な演算を行う.
•41
演習1.論理式に関する演習
(1)2次方程式 ax
2
+ by + c = 0 の解を求めるプ
ログラムを作りなさい
例題4のプログラムを書き換えて,a=0 の場合にも,正
しく解を求めるようにしなさい
•42
(2)平面 ax + by + cz + d = 0 と原点の距離を求
めるプログラムを作りなさい
演習(1)で行うこと
• a = 0 かつ b = 0 かつ c = 0 のとき
すべての x が解である
• a = 0 かつ b = 0 かつ c ≠0 のとき
解なし
• a = 0 かつ b ≠ 0 のとき
x = - c / b
•43
演習(1)で行うこと
• a = 0 かつ b ≠ 0 のとき
x = - c / b
•44
else if ( a = 0 ) and ( b <> 0 ) then begin
writeln ('x =', - c / b:8:3 );
end
この部分のプログラム例(正解は1つでは無い)