pe-3. 条件分岐と場合分け
1
Pascal プログラミング入門)
URL: https://www.kkaneko.jp/pro/pascal/index.html
金子邦彦
if文による条件分岐の仕組み、比較演算・論理演算を用いた
条件式の記述方法
【学習内容の構成】
1. 条件分岐:条件式の真偽に応じて異なる処理を実行する
制御構造
2. 比較演算<<=>>==<>による値の比較
3. 論理演算andornotによる複合条件の構築
4. 多分岐else ifを用いた3つ以上の場合分け
前提:四則演算、ライブラリ関数(sqrtln等)、変数の
基本操作
意義:入力値に応じた柔軟な処理が可能となり、実用的な
プログラム作成への発展
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
条件式
オンライン開発環境 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を、成り立たなければ
実行
14
Yes
No
条件式
if 条件式 then begin
;
;
...
end
else begin
;
;
...
end;
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
条件式
if 条件式 then begin
;
;
...
end;
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
x <= 25
x <= 50
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つでは無い)