pe-4. 整数データと浮動小数点数データ

-- Views

February 03, 22

スライド概要

(Pascal プログラミング入門)
URL: https://www.kkaneko.jp/cc/pascal/index.html

profile-image

金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

pe-4. 整数データと浮動小数点 数データ (Pascal プログラミング入門) URL: https://www.kkaneko.jp/cc/pascal/index.html 金子邦彦 1

2.

内容 • 例題1.単純な金種計算 • 例題2.硬貨の金種計算 • 例題3.うるう年の判定 整数の変数 浮動小数点数と整数の違い • 例題4.複利計算 整数の変数と,浮動小数点数の変数を混在さ せるときに気を付けねばならないこと 2

3.

目標 • プログラムでの整数と浮動小数点数の違いについ て理解する • 目的に応じて,整数の変数,浮動小数点数の変数 を正しく使い分けることができるようになる 3

4.

オンライン開発環境 Online GDB • プログラミングを行えるオンラインのサービス https://www.onlinegdb.com • ウェブブラウザを使う • たくさんの言語を扱うことができる Pascal, Python3, Java, C/C++, C#, JavaScript, R, アセンブリ言語,SQL など • オンラインなので、「秘密にしたいプログラム」 を扱うには十分な注意が必要 4

5.

Online GDB で Pascal を動かす手順 ① ウェブブラウザを起動する ② 次の URL を開く https://www.onlinegdb.com 5

6.

③ 「Language」のところで,「Pascal」を選ぶ 6

7.

実行ボタン エディタ画面 プログラムを 書き換えること ができる 7

8.

例題1.単純な金種計算 • 金額を読み込んで,適切な紙幣と小銭の枚数を 求め,表示するプログラムを作る. 例) 金額が1050円のとき, 千円札: 1枚 1円玉: 50枚 • 例題では,簡単のため,紙幣は千円札のみ,硬 貨は1円玉のみ(種別は考えない)ことにする • 金額,千円札の枚数,1円玉の枚数を扱うため に,整数の変数を使う 8

9.

• 1000円札の枚数 金額を1000で割った商(小数点以下切り捨て) • 1円玉の枚数 金額を1000で割った余り 9

10.

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.

単純な金種計算 実行結果の例 11

12.

プログラム実行順 write('kingaku ?: '); readln(kingaku); メッセージ「金額は?:」を表示 整数データを読み込み sen := kingaku div 1000; 千円札と1円玉の数 を計算 en := kingaku mod 1000; writeln('1000 en', sen, ' mai'); 計算結果を表示 writeln('1 en ', en, ' mai'); readln 終わりの readln 12

13.

プログラムとデータ メモリ ② ① kingaku sen := kingaku div 1000; en := kingaku mod 1000; 千円札と1円玉 の数を計算 en readln(kingaku); 整数データを読み込み ③ writeln('1000 en =', sen, ' mai'); writeln('1 en = ', en, ' mai'); sen 計算結果を表示 データの集まり 13

14.

整数と浮動小数点数 • 整数 整数(正か負か0) 例) 0 3 28 4778 -1 -10 -1250 • 浮動小数点数 小数付きの数も可 例) 0 3 1278748623 ー456375939 8 2.190872 0.000178 14

15.

整数と浮動小数点数 整数 浮動小数点数 変数宣言 kingaku :integer; teihen :real; 四則演算 +, -, *, div +, -, *, / •div は割り算(余り は切り捨て) 剰余 mod 15

16.

変数 • 変数には,名前と型(型とはデータの種類のこと) がある • • 整数 浮動小数点数 integer real • 変数宣言では,名前と型を指定する 16

17.

整数データの算術演算子 + 和 - 差 * 積 div 割り算の商(余りは切り捨て) mod 割り算の剰余 17

18.

例題2.硬貨の金種計算 • 金額を読み込んで,適切な小銭の枚数を求め,表 示するプログラムを作る. 例) 金額が768円のとき, 500円玉: 1枚 100円玉: 2枚 50円玉: 1枚 10円玉: 1枚 5円玉: 1枚 1円玉: 3枚 • 例題では,簡単のため,紙幣は考えない(硬貨の み)ということにする • 各硬貨の枚数を扱うために,整数の変数を使う 18

19.

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.

硬貨の金種計算 実行結果の例 20

21.

硬貨の金種計算 • 500円玉の枚数は 「(金額) を1000円で割った余り」 割る 00 5 例えば,12687 円のとき 500円玉: 12687 div 500 → 25 100円玉: (12687 mod 500) div 100 → 1 12687 を 500 で割った余り(値は 187) 50円玉: (12687 mod 100) div 50 → 1 12687 を 100 で割った余り(値は 87) 10円, 5円, 1円も同様に考える 21

22.

例題3.うるう年の判定 • 「西暦年」を読み込んで,うるう年かどうか表示 するプログラムを作る. • うるう年の判定のために,比較演算と論理演算を組み 合わせる • 西暦年が 4, 100, 400 の倍数であるかを調べるために mod を使う 2021 → うるう年でない 2024 → うるう年である 22

23.

グレゴリオ暦でのうるう年 • うるう年とは: 2月が29日まである年 • うるう年は400年に97回で,1年の平均日数は 365.2422日 • うるう年の判定法 • 年数が4の倍数の年 → うるう年 • 但し, 100の倍数の年で400の倍数でない年 → うるう年ではない(4の倍数だが例外とする) (例) 2024年: うるう年(4の倍数) 2020年: うるう年(4の倍数) 2000年: うるう年(4の倍数) 1900年: うるう年ではない (100の倍数だが400の倍数でない) 1800年: うるう年ではない 23 (100の倍数だが400の倍数でない)

24.
[beta]
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.

うるう年の判定 実行結果の例 25

26.

うるう年の判定式 ((y mod 400) = 0) or (((y mod 100) <> 0) and ((y mod 4) = 0)) 400の倍数である 100の倍数でない 4の倍数である かつ または 26

27.

例題4.複利計算 • 元金をある年利で,ある年数だけ運用したときの 利息を表示する • 複利計算では,利息が利息を生む. • 複利計算を行うために,Power 関数(Power(x,y)でxの y乗)を使う • 整数データと浮動小数点数データが混在する • 元金 gankin: 整数データ(単位は 円) • 年数 nensu: 整数データ(単位は 年) • 年利 nenri: 浮動小数点数データ (単位は %) 27

28.

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.

硬貨の金種計算 実行結果の例 29

30.

複利の計算 • 複利の公式: 元利 = 元金 × (1+年利)年数 • べき乗 xy の計算のために,ライブラリ関数 Power(x,y) を使用する ganri := trunc( gankin * Power( r, nensu ) ); r は年利 30

31.

整数に関する関数 • round 浮動小数点数を 最も近い整数へ変換 例) 3.4 → 3, 3.6 → 4, -1.6 → 2 • trunc 浮動小数点数を ゼロ方向に向かった最も近い整数へ変換 例) 3.4 → 3, 3.6 → 3, -1.6 → -1 31

32.

trunc の意味 • 浮動小数点数で計算される • 計算結果が浮動小数点数であるとき,整数の変数 に代入するには,小数点以下切り捨てか,四捨五 入が行われねばならない • trunc の意味: • 右辺の計算結果の小数点以下を切り捨てて,左辺の変 数に代入する. ganri := trunc( gankin * Power( r, nensu ) ); 整数 整数 浮動小数点数 整数 32

33.

演習1.trunc • 例題4のプログラムを次のように変更し,元金は 10000円,年数は10年,年利は2%として 実行せよ.実行結果を確認せよ. 変更前 変更後 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'); 33

34.

演習2.金種計算 • 金額を読み込んで,適切な紙幣と小銭の枚数を求 め,表示するプログラムを作成しなさい. • 但し,すべての種類の紙幣と硬貨を考えること • 例題2のプログラムを参考にすること 例) 金額が13,486円のとき, 1万円札: 1 500円: 0 5千円札: 0 100円: 4 千円札: 3 50円: 1 10円: 3 5円: 1 1円: 1 34

35.

演習3.時間の換算 • 秒数 x を読み込んで,h 時,m 分,s 秒を計算す るプログラムを作りなさい. 例) x=3723 のとき, 1 h, 2 m, 3 s 35