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