pe-4. 整数データと浮動小数点
数データ
1
Pascal プログラミング入門)
URL: https://www.kkaneko.jp/pro/pascal/index.html
金子邦彦
内容
例題1.単純な金種計算
例題2.硬貨の金種計算
例題3.うるう年の判定
整数の変数
浮動小数点数と整数の違い
例題4.複利計算
整数の変数と,浮動小数点数の変数を混在さ
せるときに気を付けねばならないこと
2
目標
プログラムでの整数浮動小数点数の違いについ
て理解する
目的に応じて,整数の変数浮動小数点数の変数
正しく使い分けることができるようになる
3
オンライン開発環境 Online GDB
プログラミングを行えるオンラインのサービス
https://www.onlinegdb.com
ウェブブラウザを使う
たくさんの言語を扱うことができる
Pascal, Python3, Java, C/C++, C#, JavaScript,
R, アセンブリ言語,SQL など
オンラインなので、「秘密にしたいプログラム」
を扱うには十分な注意が必要 4
Online GDB Pascal を動かす手順
ウェブブラウザを起動する
次の URL を開く
https://www.onlinegdb.com
5
Language」のところで,「Pascal」を選ぶ
6
エディタ画面
実行ボタン
プログラムを
書き換えること
ができる
7
例題1.単純な金種計算
金額を読み込んで,適切な紙幣と小銭の枚数
求め,表示するプログラムを作る.
例) 金額が1050円のとき,
千円札: 1枚
1円玉: 50枚
例題では,簡単のため,紙幣は千円札のみ,硬
貨は1円玉のみ(種別は考えない)ことにする
金額,千円札の枚数,1円玉の枚数を扱うため
に,整数の変数を使う
8
1000円札の枚数
金額1000で割った商(小数点以下切り捨て)
1円玉の枚数
金額1000で割った余り
9
program sum;
var kingaku, sen, en: integer;
begin
write('kingaku ?: ');
readln(kingaku);
sen := kingaku div 1000;
en := kingaku mod 1000;
writeln('1000 en =', sen:8, ' mai');
writeln('1 en = ', en:8, ' mai');
readln
end.
10
計算を
行っている部分
キーボードからの
データの読み込み
行っている部分
画面へのデータの
書き出しを行ってい
る部分
単純な金種計算
11
実行結果の例
プログラム実行順
12
write('kingaku ?: ');
readln(kingaku);
sen := kingaku div 1000;
en := kingaku mod 1000;
writeln('1000 en', sen, ' mai');
writeln('1 en ', en, ' mai');
readln
メッセージ「金額は?:」を表示
整数データを読み込み
千円札と1円玉の数
を計算
計算結果を表示
終わりの readln
プログラムとデータ
13
メモリ
en
sen
データの集まり
readln(kingaku);
kingaku
整数データを読み込み
writeln('1000 en =', sen, ' mai');
writeln('1 en = ', en, ' mai');
計算結果を表示
sen := kingaku div 1000;
en := kingaku mod 1000;
千円札と1円玉
の数を計算
整数と浮動小数点数
整数
整数(正か負か0)
例)
28
4778
-1
-10
-1250
浮動小数点数
小数付きの数も
例)
1278748623
ー456375939
2.190872
0.000178
14
整数と浮動小数点数
15
整数 浮動小数点数
変数宣言 kingaku :integer; teihen :real;
四則演算 +, -, *, div
div は割り算(余り
は切り捨て)
+, -, *, /
剰余 mod
変数
変数には,名前(型とはデータの種類のこと
がある
整数 integer
浮動小数点数 real
変数宣言では,名前を指定する
16
整数データの算術演算子
*
div 割り算の商(余りは切り捨て)
mod 割り算の剰余
17
例題2.硬貨の金種計算
金額を読み込んで,適切な小銭の枚数を求め,表
示するプログラムを作る.
例) 金額が768円のとき,
500円玉: 1枚
100円玉: 2枚
50円玉: 1枚
10円玉: 1枚
5円玉: 1枚
1円玉: 3枚
例題では,簡単のため,紙幣は考えない硬貨の
)ということにする
各硬貨の枚数を扱うために,整数の変数を使う 18
program sum;
var kingaku, n500, n100, n50, n10, n5, n1: integer;
begin
write('kingaku ?: ');
readln(kingaku);
n500 := kingaku div 500;
n100 := ( kingaku mod 500 ) div 100;
n50 := ( kingaku mod 100 ) div 50;
n10 := ( kingaku mod 50 ) div 10;
n5 := ( kingaku mod 10 ) div 5;
n1 := kingaku mod 5;
writeln('500 en', n500:4, ' mai');
writeln('100 en', n100:4, ' mai');
writeln('50 en ', n50:4, ' mai');
writeln('10 en ', n10:4, ' mai');
writeln('5 en ', n5:4, ' mai');
writeln('1 en ', n1:4, ' mai');
readln
end. 19
計算を
行っている部分
キーボードからの
データの読み込み
行っている部分
画面へのデータの
書き出しを行ってい
る部分
硬貨の金種計算
20
実行結果の例
硬貨の金種計算
500円玉の枚数
「(金額) を1000円で割った余り」 割る
00
例えば,12687 円のとき
500円玉: 12687 div 500 → 25
100円玉: (12687 mod 500) div 100 → 1
50円玉: (12687 mod 100) div 50 → 1
21
12687 500 で割った余り(値は 187
12687 100 で割った余り(値は 87
10, 5, 1円も同様に考える
例題3.うるう年の判定
「西暦年」を読み込んでうるう年かどうか表示
するプログラムを作る.
うるう年の判定のために,比較演算論理演算を組み
合わせる
西暦年が 4, 100, 400 の倍数であるかを調べるために
mod を使う
2021 うるう年でない
2024 うるう年である
22
グレゴリオ暦でのうるう年
うるう年とは: 2月が29日まである年
うるう年は400年に97回で,1年の平均日数は
365.2422
うるう年の判定法
年数が4の倍数の年 うるう年
但し, 100の倍数の年で400の倍数でない年
うるう年ではない(4の倍数だが例外とする)
(例) 2024年: うるう年(4の倍数)
2020年: うるう年(4の倍数)
2000年: うるう年(4の倍数)
1900年: うるう年ではない
(100の倍数だが400の倍数でない
1800年: うるう年ではない
(100の倍数だが400の倍数でない23
program sum;
var y: integer;
begin
write('year ?: ');
readln(y);
if ((y mod 400) = 0) or (((y mod 100) <> 0) and ((y mod 4) = 0)) then begin
writeln(y, ' is leap year');
end
else begin
writeln(y, ' is NOT leap year');
end;
readln
end. 24
条件式
条件が成り立つ場合に
実行される部分
条件が成り立たない場合に
実行される部分
うるう年の判定
25
実行結果の例
うるう年の判定式
((y mod 400) = 0) or (((y mod 100) <> 0) and ((y mod 4) = 0))
26
400の倍数である 100の倍数でない 4の倍数である
かつ
または
例題4.複利計算
元金をある年利で,ある年数だけ運用したときの
利息を表示する
複利計算では,利息が利息を生む.
複利計算を行うために,Power 関数(Power(x,y)x
y乗)を使う
整数データと浮動小数点数データが混在する
元金 gankin: 整数データ(単位は 円)
年数 nensu: 整数データ(単位は 年)
年利 nenri: 浮動小数点数データ (単位は %)
27
program sum;
uses Math;
var gankin, nensu, ganri: integer;
var nenri, r: real;
begin
write('gankin ? (en): ');
readln(gankin);
write('nensu ? (nen): ');
readln(nensu);
write('nenri ? (%): ');
readln(nenri);
r := 1 + ( nenri * 0.01 );
ganri := trunc( gankin * Power( r, nensu ) );
writeln('ganri = ', ganri:8, ' en');
writeln('risoku =', ( ganri - gankin ):8, ' en');
readln
end. 28
計算を
行っている部分
キーボードからの
データの読み込み
行っている部分
画面へのデータの
書き出しを行ってい
る部分
硬貨の金種計算
29
実行結果の例
複利の計算
複利の公式:
べき乗 xyの計算のために,ライブラリ関数
Power(x,y) を使用する
30
ganri := trunc( gankin * Power( r, nensu ) );
r は年利
元利 = 元金 ×(1+年利)年数
整数に関する関数
round 浮動小数点数
最も近い整数へ変換
例) 3.4 → 3, 3.6 → 4, -1.6 → 2
trunc 浮動小数点数
ゼロ方向に向かった最も近い整数へ変換
例) 3.4 → 3, 3.6 → 3, -1.6 → -1
31
trunc の意味
浮動小数点数で計算される
計算結果が浮動小数点数であるとき,整数の変数
に代入するには,小数点以下切り捨てか,四捨五
が行われねばならない
trunc の意味:
右辺の計算結果の小数点以下を切り捨てて,左辺の変
数に代入する.
32
ganri := trunc( gankin * Power( r, nensu ) );
浮動小数点数
整数 整数
整数
演習1.trunc
例題4のプログラムを次のように変更し,元金は
10000円,年数は10年,年利は2%として
実行せよ.実行結果を確認せよ.
33
var gankin, nensu, ganri: integer;
(途中省略)
ganri := trunc( gankin * Power( r, nensu ) );
writeln('ganri = ', ganri:8, ' en');
writeln('risoku =', ( ganri - gankin ):8, ' en');
var gankin, nensu: integer;
var ganri: real;
(途中省略)
ganri := gankin * Power( r, nensu );
writeln('ganri = ', ganri:8:3, ' en');
writeln('risoku =', ( ganri - gankin ):8:3, ' en');
変更前
変更後
演習2.金種計算
金額を読み込んで,適切な紙幣と小銭の枚数を求
め,表示するプログラムを作成しなさい.
但し,すべての種類の紙幣と硬貨を考えること
例題2のプログラムを参考にすること
例) 金額が13,486円のとき,
1万円札: 500円:
5千円札: 100円:
千円札: 50円:
10円:
5円:
1円: 34
演習3.時間の換算
秒数 x を読み込んで,h 時,m 分,s 秒を計算
るプログラムを作りなさい.
例) x=3723 のとき,
1 h, 2 m, 3 s
35