sp-3. 関数の組み合わせ
1
金子邦彦
Scheme プログラミング)
URL:https://www.kkaneko.jp/pro/scheme/index.html
3-1 Scheme の関数
2
トライン
3-1 Scheme の関数
3-2 パソコン演習
3-3 課題
3
Scheme の式から出発して,実行結果に至
るステップを読み,理解する
複数の関数から構成されたプログラムを読
んで,意味を理解できる能力,知識を身に
付ける
見やすいプログラムを書くために,ブロッ
ク単位での字下げを行
本日の内容
4
Scheme の式から出発して,
実行結果に至るステップを理解する
なぜ?
コンピュータの振る舞いを理解
するためには
実行結果に至る過程
5
演算子を含む式が計算される
括弧の内側が優先される
例: (* 4 12) = 48
(* 3.14 (* 5 5)) = (* 3.14 25) = 78.5
関数が,その「中身」で置き換わる
同時に,関数のパラメータは,実際の値で置き換わ
: (area-of-disk 5) = (* 3.14 (* 5 5)) = ...
(+ (sqr 2) (sqr 4)) = (+ (* 2 2) (sqr 4)) = ...
実行結果に至る過程
6
Scheme 処理系と実行モデルを理解する
変数と関数の違い
7
Scheme の関数の振る舞い
関数 (procedure arg1... argn) に対して
procedure の値を取得する
arg1から argnの値を取得する
procedure の値に arg1から argnの値を引き渡す
8
○○の仕事を
頼む!
頼む人
担当者A
担当者B
△△の仕事を
頼む!
仕事の分割
9
プログラムは,しばしば,複数の関
数に「分割」される
関数
関数C
関数A
呼び出し側
呼び出され側
呼び出され側
関数とは
10
(define (area-of-disk r)
(* 3.14
(* r r)))
(define (area-of-ring outer inner)
(- (area-of-disk outer)
(area-of-disk inner)))
Scheme のプログラムは,一般に,複数の関
数の集まり
これらは
Scheme の式
参照: 例題3、4
Scheme のプログラムと関数
11
関数B
関数A
呼び出し側
呼び出され側
関数Bで使ための
「データ」の流れ
関数Aで使ための
データの流れ
関数でのデータの流れ
12
3-2 パソコン演習
13
資料を見ながら,「例題」を行ってみる
各自,「課題」に挑戦する
自分のペースで先に進んで構いません
パソコン演習の進め方
14
DrScheme の起動
プログラム PLT Scheme → DrScheme
今日の演習では「Intermediate Student
に設定
Language
→ Choose Language
→ Intermediate Student
→ Execute ボタン
DrScheme の使用
15
DrScheme の機能
プログラム実行の振る舞いを観察するための
ツール
「定義用インド」のみを使用
普通のプログラム実行とは違
Intermediate Student」に設定する必要あり
ステップ実行とは
16
次の式について,実行結果「48」に至る過程を見
DrScheme stepper を使用する
17
例題1.実行結果に至る過
(*(+2 2)
(/(*(+3 5)
(/30 10))
2))
*」とあるのは,「乗算」の意味
Scheme の式
1. 次を「定義用インド」で,実行しなさい
Intermediate Student で実行すること
入力した後に,Execute ボタンを押す
(*(+2 2)
(/(*(+3 5)
(/30 10))
2))
2. DrScheme 使って,ステップ実行の様子を
確認しなさい Step ボタン,Next ボタンを使用)
理解しながら進むこと
次は,例題2に進んでください
「例題1.実行結果に至る過程」の手順
18
定義用インドに入力して,
Execute ボタンを押した後,Step ボタンを押すと
例題2.式のステップ実行
19
(+ 2 2)」は「4」で
置き換わる 20
(+ 3 5)」は「8」で
置き換わる 21
(/ 30 10)」は「3」で
置き換わる 22
(* 8 3)」は「24」で
置き換わる 23
(/ 24 2)」は「12」で
置き換わる 24
(* 4 12)」は「48」で
置き換わる 25
(*(+2 2) (/(*(+3 5) (/30 10)) 2))
= (* 4 (/(*(+3 5) (/30 10)) 2))
= (* 4 (/(*8 (/30 10)) 2))
= (* 4 (/(*8 3) 2))
= (*4 (/24 2))
= (*4 12)
=48
最初の式
(+ 2 2) → 4
(+ 3 5) → 8
(/30 10) → 3
(* 8 3) → 2
(/24 2) → 12
実行結果
コンピュータ内部での計算
実行結果「48」が得られる過程
26
(*(+2 2) (/(*(+3 5) (/30 10)) 2))
= (* 4 (/(*(+3 5) (/30 10)) 2))
= (* 4 (/(*8 (/30 10)) 2))
= (* 4 (/(*8 3) 2))
= (*4 (/24 2))
= (*4 12)
=48
最初の式
(+ 2 2) → 4
(+ 3 5) 8
(/30 10) 3
(* 8 3) 2
(/24 2) → 12
実行結果
最初の式
(*(+2 2) (/(*(+3 5) (/30 10)) 2))
から始まって,計算を繰り返して,実行結果
48
に至る
実行結果「48」が得られる過程
27
円の半径 rから面積を求める関数 area-of-disk
ついて,実行結果に至る過程を見る
(area-of-disk 5) から 78.5 に至る過程を見る
DrScheme stepper を使用する
28
例題2.関数のステップ実
(define (area-of-disk r)
(* 3.14
(* r r)))
(area-of-disk 5)
= (* 3.14 (* 5 5))
= (* 3.14 25)
= 78.5
1. 次を「定義用インド」で,実行しなさい
Intermediate Student で実行すること
入力した後に,Execute ボタンを押す
(define (area-of-disk r)
(* 3.14
(* r r)))
(area-of-disk 5)
2. DrScheme を使って,ステップ実行の様子を
確認しなさい Step ボタン,Next ボタンを使用)
理解しながら進むこと
次は,例題3に進んでください
例題1に
1行書き加える
ステップ実行したい
ので,入力済みの
プログラムは,消さず
に残しておく
例題1と同じ
例題2.関数のステップ実行
29
定義用インドに入力して,
Execute ボタンを押した後,Step ボタンを押すと
例題2.式のステップ実行
30
(area-of-disk 5)」は
(* 3.14 (* 5 5))で置き換わる
注: 3.14 157/50」のよに表示されている
31
(* 5 5)」は
25」で置き換わる
157/50」とあるのは 3.14 のこと(有理数表示)
32
(* 3.14 25)」は
78.5」で置き換わる
157/2」とあるのは 78.5 のこと(有理数表示)
33
(area-of-disk 5) から 78.5 が得られる過程
(area-of-disk 5)
= (* 3.14 (* 5 5))
= (* 3.14 25)
= 78.5
最初の式
(* 5 5) → 25
実行結果
コンピュータ内部での計算
(* 3.14
(* r r)) r = 5 が代入される
34
(area-of-disk 5)
= (* 3.14 (* 5 5))
= (* 3.14 25)
= 78.5
最初の式
実行結果
最初の式
(area-of-disk 5)
から始まって,計算を繰り返して,実行結果
78.5
に至る
(area-of-disk 5) から 78.5 が得られる過程
35
(area-of-disk 5)
= (* 3.14 (* 5 5))
= (* 3.14 25)
= 78.5
これは,
(define (area-of-disk r)
(* 3.14
(* r r)))
r5 で置き換えたもの
(area-of-disk 5) から 78.5 が得られる過程
36
x yとから,x2+y2を求めるプログラ
sum-of-squares を作り,実行する
xの値から x2求める関数 sqr と組み合
わせる
37
例題3.2乗の和
1. 次を「定義用インド」で,実行しなさい
入力した後に,Execute ボタンを押す
(define (sqr x)
(* x x))
(define (sum-of-squares x y)
(+ (sqr x) (sqr y)))
2. その後,次を「実行用インド」で実行しなさい
次は,例題4に進んでください
(sum-of-squares 2 4)
(sum-of-squares 20 30)
「例題3.2乗の和」の手
38
まず,Scheme のプログラムを
コンピュータに読み込ませている
39
読み込ませたプログラムを実行
させている.
ここでは,
(sum-of-squares 2 4)
と書いて,xの値を 2, yの値を 4
に設定しての実行
実行結果である「20」が
表示される
40
今度は,
(area-of-ring 10 3)
と書いて,xの値を 20, y
の値を 30 に設定しての実行
実行結果である「1300」が
表示される
41
sqr
xの値:
416
入力は
1つの数値
出力は
1つの数値
入力と出力
42
(define (sqr x)
(* x x))
1つの関数
値を1つ受け取る(入力)
x のことを「パラメータ」とい
関数の名前
「関数である」ことを
示すキーワード
x の値から「(* x x)
を計算(出力)
sqr 関数
43
sum-of-squares
x, y の値
2, 4 20
入力は
2つの数値
出力は
1つの数値
入力と出力
44
(define (sum-of-squares x y)
(+ (sqr x) (sqr y)))
1つの関数
値を2つ受け取る(入力)
関数の名前
「関数である」ことを
示すキーワード
x2+ y2
を計算(出力)
sum-of-squares 関数
45
(define (sqr x)
(* x x))
(define (sum-of-squares x y)
(+ (sqr x) (sqr y)))
sqr
の部分
sum-of-squares
の部分
x2+y2を求める
2乗の和のプログラム
46
sqr 関数
sum-of-squares 関数
(define (sum-of-squares x y)
(+ (sqr x) (sqr y)))
(define (sqr x)
(* x x))
sum-of-squares 関数の中で,
sqr 関数を使っている(2箇所)
関数の関係
47
数値を,
sqr 関数に渡す
渡された値を,
x」とい名前で使
実行結果を
sum-of-squares 関数に返す
sqr 関数
sum-of-squares 関数
(define (sum-of-squares x y)
(+ (sqr x) (sqr y)))
(define (sqr x)
(* x x))
データの流れ
48
(define (sqr x)
(* x x))
(define (sum-of-squares x
y)
(+ (sqr x) (sqr y)))
(define (sum-of-squares x y)
(+ (* x x) (* y y)))
自分にとって「分かりやす
い」書き方で書くことが重
「働き」は同じ
分割する場合 分割しない場合
関数を分割する理由
49
関数 sum-of-squares (例題3)について,実行結
果に至る過程を見る
(sum-of-squares 20 30) から 1300 に至る過程を見る
DrScheme stepper を使用する
50
例題4.ステップ実行
(sum-of-squares 20 30)
= (+ (sqr 20) (sqr 30))
= (+ (* 20 20) (sqr 30))
= (+ 400 (sqr 30))
= (+ 400 (* 30 30))
= (+ 400 900)
= 1300
(define (sqr x)
(* x x))
(define (sum-of-squares x y)
(+ (sqr x) (sqr y)))
1. 次を「定義用インド」で,実行しなさい
Intermediate Student で実行すること
入力した後に,Execute ボタンを押す
2. DrScheme 使って,ステップ実行の様子を
確認しなさい Step ボタン,Next ボタンを使用)
理解しながら進むこと
次は,例題5に進んでください
例題3に
1行書き加え
ステップ実行したい
ので,入力済みの
プログラムは,消さず
に残しておく
例題3と同じ
(define (sqr x)
(* x x))
(define (sum-of-squares x y)
(+ (sqr x) (sqr y)))
(sum-of-squares 20 30)
例題4.ステップ実行
51
(+ (sqr x) (sqr y))」の
x」は「20」で「y」は「30」で置き換わる
52
(* x x)」の
x」は「20」で置き換わる
53
乗算により
(* 20 20)」は「400」で
置き換わる
54
(* x x)」の
x」は「30」で置き換わる
55
乗算により
(* 30 30)」は「900」で
置き換わる
56
加算により
(+ 400 900)」は「1300」で
置き換わる
57
(sum-of-squares 20 30) から 1300 が得られる過程
(sum-of-squares 20 30)
= (+ (sqr 20) (sqr 30))
= (+ (* 20 20) (sqr 30))
= (+ 400 (sqr 30))
= (+ 400 (* 30 30))
= (+ 400 900)
= 1300
最初の式
コンピュータ内部での計算
(+ (sqr x) (sqr y))
x = 2, y = 4 が代入される
実行結果
(* x x)) x = 2 が代入される
(* 2 2) → 4
(* x x)) x = 4 が代入される
(* 4 4) → 16
58
(sum-of-squares 20 30) から 1300 が得られる過程
(sum-of-squares 20 30)
= (+ (sqr 20) (sqr 30))
= (+ (* 20 20) (sqr 30))
= (+ 400 (sqr 30))
= (+ 400 (* 30 30))
= (+ 400 900)
= 1300
これは,
(define (sum-of-squares x y)
(+ (sqr x) (sqr y)))
x20 で,y30 で置き換えたもの
59
60
例題5.リングの面積
外径 outer, 内径 inner からリングの面積を求める
プログラム area-of-ring を作り,実行する
円の面積を求める関数 area-of-disk と組み合わせる
真ん中に穴のあいた
円の面積と考える
求める面積は,外側の円の面積から,
内側の穴の円の面積を引いたもの
外側の円 内側の円
リングの面積
61
リングの面積
外側の円の面積 内側の円の面積
外径:outer
内径: inner inner outer
半径 outer の円 半径 inner の円
リングの面積
62
1. 次を「定義用インド」で,実行しなさい
入力した後に,Execute ボタンを押す
(define (area-of-disk r)
(* 3.14
(* r r)))
(define (area-of-ring outer inner)
(- (area-of-disk outer)
(area-of-disk inner)))
2. その後,次を「実行用インドで実行しなさい
次は,例題6に進んでください
(area-of-ring 5 3)
「例題5.リングの面積」の手順
63
まず,Scheme のプログラムを
コンピュータに読み込ませている
64
読み込ませたプログラムを実行
させている.
ここでは,
(area-of-ring 5 3)
と書いて,outer の値を 5, inner
の値を 3 に設定しての実行
実行結果である「50.24」が
表示される
65
今度は,
(area-of-ring 10 3)
と書いて,outer の値を 10, inner
の値を 3 に設定しての実行
実行結果である「285.74」が
表示される
66
area-of-disk
578.5
入力は
1つの数値
出力は
1つの数値
入力と出力
67
(define (area-of-disk r)
(* 3.14
(* r r)))
1つの関数
値を1つ受け取る(入力)
r のことを「パラメータ
とい
関数の名前
「関数である」ことを
示すキーワード
r の値から「(* 3.14 (* r r))
を計算(出力)
area-of-disk 関数
68
area-of-ring
5, 3 50.24
入力は
2つの数
出力は
1つの数値
入力と出力
69
(define (area-of-ring outer inner)
(- (area-of-disk outer)
(area-of-disk inner)))
1つの関数
値を2つ受け取る(入力)
関数の名前
「関数である」ことを
示すキーワード
「外側の円の面積
-内側の円の面積」
を計算(出力)
area-of-ring 関数
70
外径: outer
内径: inner inner outer
(define (area-of-disk r)
(* 3.14
(* r r)))
(define (area-of-ring outer inner)
(- (area-of-disk outer)
(area-of-disk inner)))
area-of-disk
の部分
area-of-ring
の部分
リングの面積のプログラム
71
area-of-disk 関数
area-of-ring 関数
(define (area-of-ring outer inner)
(- (area-of-disk outer)
(area-of-disk inner))) (define (area-of-disk r)
(* 3.14
(* r r)))
area-of-ring 関数の中で,
area-of-disk 関数を使っている(2箇所)
関数の関係
72
数値を,
area-of-disk 関数に渡す
渡された値を,
r」とい名前で使
実行結果を
area-of-ring 関数に返す
area-of-disk 関数
area-of-ring 関数
(define (area-of-ring outer inner)
(- (area-of-disk outer)
(area-of-disk inner)))
(define (area-of-disk r)
(* 3.14
(* r r)))
データの流れ
73
(define (area-of-disk r)
(* 3.14
(* r r)))
(define (area-of-ring outer
inner)
(- (area-of-disk outer)
(area-of-disk inner)))
(define (area-of-ring outer
inner)
(- (* 3.14 (* outer outer))
(* 3.14 (* inner inner))))
リングの面積は,「外側の円の
面積」-「内側の円の面積」
あることがひと目で分かる
「働き」は同じ
分割する場合 分割しない場合
関数を分割する理由
74
関数 area-of-ring (例題5)について,実行結果
に至る過程を見る
(area-of-ring 5 3) から 50.24 に至る過程を見る
DrScheme stepper を使用する
75
例題6.ステップ実行
(define (area-of-disk r)
(* 3.14
(* r r)))
(define (area-of-ring outer inner)
(- (area-of-disk outer)
(area-of-disk inner)))
(area-of-ring 5 3)
= (- (area-of-disk 5) (area-of-disk 3))
= (- (* 3.14 (* 5 5)) (area-of-disk 3))
= (- (* 3.14 25) (area-of-disk 3))
= (- 78.5 (area-of-disk 3))
= (- 78.5 (* 3.14 (* 3 3)))
= (- 78.5 (* 3.14 9))
= (- 78.5 28.26)
= 50.24
1. 次を「定義用インド」で,実行しなさい
Intermediate Student で実行すること
入力した後に,Execute ボタンを押す
(define (area-of-disk r)
(* 3.14
(* r r)))
(define (area-of-ring outer inner)
(- (area-of-disk outer)
(area-of-disk inner)))
(area-of-ring 5 3)
2. DrScheme を使って,ステップ実行の様子を
確認しなさい Step ボタン,Next ボタンを使用)
理解しながら進むこと
次は,例題7に進んでください
例題5に
1行書き加える
ステップ実行したい
ので,入力済みの
プログラムは,消さず
に残しておく
例題5と同じ
例題6.ステップ実行
76
定義用インドに入力して,
Execute ボタンを押した後,Step ボタンを押すと
例題6.ステップ実行
77
例題6.ステップ実行
78
例題6.ステップ実行
79
例題6.ステップ実行
80
例題6.ステップ実行
81
例題6.ステップ実行
82
例題6.ステップ実行
83
例題6.ステップ実行
84
例題6.ステップ実行
85
(area-of-ring 5 3) から 50.24 が得られる過程
(area-of-ring 5 3)
= (- (area-of-disk 5) (area-of-disk 3))
= (- (* 3.14 (* 5 5)) (area-of-disk 3))
= (- (* 3.14 25) (area-of-disk 3))
= (- 78.5 (area-of-disk 3))
= (- 78.5 (* 3.14 (* 3 3)))
= (- 78.5 (* 3.14 9))
= (- 78.5 28.26)
= 50.24
最初の式
(* 5 5) → 25
コンピュータ内部での計算
(- (area-of-disk outer)
(area-of-disk inner))
outer = 5, inner = 3 が代入される
実行結果
(* 3.14
(* r r)) r = 5 が代入される
(* 3.14 25) → 78.5
(* 3.14
(* r r)) r = 3 が代入される
(* 3 3) → 9
(* 3.14 9) → 28.26
86
(area-of-ring 5 3) から 50.24 が得られる過程
(area-of-ring 5 3)
= (- (area-of-disk 5) (area-of-disk 3))
= (- (* 3.14 (* 5 5)) (area-of-disk 3))
= (- (* 3.14 25) (area-of-disk 3))
= (- 78.5 (area-of-disk 3))
= (- 78.5 (* 3.14 (* 3 3)))
= (- 78.5 (* 3.14 9))
= (- 78.5 28.26)
= 50.24
これは,
(define (area-of-ring outer inner)
(- (area-of-disk outer)
(area-of-disk inner)))
outer 5 で,inner 3 置き換えたも
87
公演での利益を求めるプログラムを作り,実行する
チケット代 ticket-price から利益、収入、支出、観客数を
求める関数 profit, revenue, cost, attendees の作成
profit:利益 収入(revenue) 費用(cost)
revenue:収入 観客数(attendees) ×チケット代(ticket-
price)
cost:支出 固定費 観客数(attendees)×費用
「固定費」と「費用」は公演ごとに異なる
attendees: チケット代(ticket-price)と観客数には関係がある
この「関係」は公演ごとに異なる
例題7.利益の計算
88
支出 固定費 観客数 ×費用
例) 固定費: $180
費用: 観客1人あたり$0.04
観客数
支出
0
固定費
観客がいなくても
かかる費用
(会場,設備,宣伝,
出演料その他)
観客数に比例して
かかる部分
支出の見積もり式
89
チケット代と観客数には関係がある
例) チケット代:$5 のとき,観客数は120人だった
チケット代:$0.1 値下げすると15人増えた
観客数 -(15/0.1)×(チケット代-$5) 120 と見積
もる
チケット代
観客数
0
推定された見積もり式
観客数の見積もり式
90
あなたが「劇場」の所有者であるとする
チケット代は,あなたが自由に決める
チケット代から,収入,支出,利益などを見積
もりたい
利益の計算
91
チケット代
観客数
0
観客数
のグラフ
チケット代を上げると,
観客数が減る
チケット代
支出
0
支出
のグラフ
チケット代を上げると,
観客数が減り,結果
として支出も減る
チケット代
観客数
0
収入
のグラフ
収入は,
観客数×チケット代
(これは2次曲線)
92
;; profit : number -> number
;; to compute the profit as the difference between
;; revenue and costs at some given ticket-price
(define (profit ticket-price) ... )
;; revenue:number number → number
;; to compute the revenue, given ticket-price
(define (revenue ticket-price) ... )
;; cost : number -> number
;; to compute the cost, given ticket-price
(define (cost ticket-price) ... )
;; attendees:number → number
;; to compute the number of attendees,
;; given ticket-price
(define (attendees ticket-price) ... )
1. 次を「定義用インド」で,実行しなさい
文法的な「間違い」が無いことを確認するため,入力した後に,
Execute ボタンを押す
次ページに進んでください
「例題7.利益の計算」の手順 (1/4)
94
(define (profit ticket-price)
(- (revenue ticket-price)
(cost ticket-price)))
2. 定義用インド」で,profit 関数の中身を書く.
文法的な「間違い」が無いことを確認するため,入力した後に,
Execute ボタンを押す
次ページに進んでくださ
(define (revenue ticket-price)
(* (attendees ticket-price) ticket-price))
3. 定義用インド」で,revenue 数の中身を書く.
文法的な「間違い」が無いことを確認するため,入力した後に,
Execute ボタンを押す
「例題7.利益の計算」の手順 (2/4)
95
(define (cost ticket-price)
(+ 180
(* .04 (attendees ticket-price))))
4. 定義用インド」で,cost 関数の中身を書く.
文法的な「間違い」が無いことを確認するため,入力した後に,
Execute ボタンを押す
次ページに進んでください
(define (attendees ticket-price)
(+ 120
(* (/ 15 .10) (- 5.00 ticket-price))))
5. 定義用インド」で,attendees 関数の中身を書く.
文法的な「間違い」が無いことを確認するため,入力した後に,
Execute ボタンを押す
「例題7.利益の計算」の手順 (3/4)
96
6. その後,次を「実行用インド」で実行しなさい
それぞれの実行結果が,予想通りであることを
確認しながら行こと
次は,例題8に進んでください
(attendees 3)
(cost 3)
(revenue 3)
(profit 3)
「例題7.利益の計算」の手順 (4/4)
97
まず,Scheme のプログラムを
コンピュータに読み込ませている
98
読み込ませたプログラムを実行
させている.
ここでは,
(attendees 3)
と書いて,ticket-price の値を
3 に設定しての実行
実行結果である「420」が
表示される
99
今度は,
(cost 3)
と書いて,ticket-price の値を
3 に設定しての実行
実行結果である「196.8」が
表示される
100
今度は,
(revenue 3)
と書いて,ticket-price の値を
3 に設定しての実行
実行結果である「1260」が
表示される
101
今度は,
(profit 3)
と書いて,ticket-price の値を
3 に設定しての実行
実行結果である「1063.2」が
表示される 102
profit
31063.2
入力 出力
入力と出力
103
(define (profit ticket-price)
(- (revenue ticket-price)
(cost ticket-price)))
値を1つ受け取る(入力)
関数の名前
「関数である」ことを
示すキーワード
費用を計算す
式(出力)
profit 関数
104
(define (profit ticket-price)
(- (revenue ticket-price)
(cost ticket-price)))
(define (revenue ticket-price)
(* (attendees ticket-price) ticket-price))
(define (cost ticket-price)
(+ 180
(* 0.04 (attendees ticket-price))))
(define (attendees ticket-price)
(+ 120
(* (/ 15 0.10) (- 5.00 ticket-price))))
profit 関数
revenue 関数
cost 関数
attendees 関数
105
profit 関数
(define (profit ticket-price)
(- (revenue ticket-price)
(cost ticket-price)))
revenue, cost 関数を
使っている
revenue 関数
(define (revenue ticket-price)
(* (attendees ticket-price) ticket-price))
attendees 関数を使っている
cost 関数
(define (cost ticket-price)
(+ 180
(* 0.04 (attendees ticket-price))))
attendees 関数を使っている
attendees 関数
(define (attendees ticket-price)
(+ 120
(* (/ 15 0.10) (- 5.00 ticket-price))))
関数の関係
106
関数 profit 例題7)について,実行結果に至る
過程を見る
(profit 3) から 1063.2 に至る過程を見る
DrScheme stepper を使用する
107
例題8.ステップ実行
(profit 3)
= (- (revenue 3) (cost 3))
= (- (* (attendees 3) 3) (cost 3))
= (- (* (+ 120 (* (/ 15 0.10) (- 5.00 3))) 3) (cost 3))
= (- (* (+ 120 (* 150 (- 5.00 3))) 3) (cost 3))
= (- (* (+ 120 (* 150 2)) 3) (cost 3))
= (- (* (+ 120 300) 3) (cost 3))
= (- (* 420 3) (cost 3))
= (- 1260 (cost 3))
= (- 1260 (+ 180 (* 0.04 (attendees 3))))
= (- 1260 (+ 180 (* 0.04 (+ 120 (* (/ 15 0.10) (- 5.00 3))))))
= (- 1260 (+ 180 (* 0.04 (+ 120 (* 150 (- 5.00 3))))))
= (- 1260 (+ 180 (* 0.04 (+ 120 (* 150 2)))))
= (- 1260 (+ 180 (* 0.04 (+ 120 300))))
= (- 1260 (+ 180 (* 0.04 420)))
= (- 1260 (+ 180 16.8))
= (- 1260 196.8)
=1063.2
1. 次を「定義用インド」で,実行しなさい
Intermediate Student で実行すること
入力した後に,Execute ボタンを押す
;; profit: number -> number
;; to compute the profit as the difference between
;; revenue and costs at some given ticket-price
(define (cost ticket-price)
(+ 180
(* .04 (attendees ticket-price))))
;; revenue:number number → number
;; to compute the revenue, given ticket-price
(define (revenue ticket-price)
(* (attendees ticket-price) ticket-price))
;; cost : number -> number
;; to compute the cost, given ticket-price
(define (cost ticket-price)
(+ 180
(* .04 (attendees ticket-price))))
;; attendees:number → number
;; to compute the number of attendees,
;; given ticket-price
(define (attendees ticket-price)
(+ 120
(* (/ 15 .10) (- 5.00 ticket-price))))
(profit 3)
2. DrScheme を使って,ステップ実行の様子を
確認しなさい Step タン,Next ボタンを使用)
例題7に
1行書き加える
ステップ実行したい
ので,入力済みの
プログラムは,消さず
に残しておく
例題7と同じ
「例題3.ステップ実行」の手順
108
(profit 3) から 1063.2 が得られる過程
(profit 3)
= (- (revenue 3) (cost 3))
= (- (* (attendees 3) 3) (cost 3))
= (- (* (+ 120 (* (/ 15 0.10) (- 5.00 3))) 3) (cost 3))
= (- (* (+ 120 (* 150 (- 5.00 3))) 3) (cost 3))
= (- (* (+ 120 (* 150 2)) 3) (cost 3))
= (- (* (+ 120 300) 3) (cost 3))
= (- (* 420 3) (cost 3))
= (- 1260 (cost 3))
= (- 1260 (+ 180 (* 0.04 (attendees 3))))
= (- 1260 (+ 180 (* 0.04 (+ 120 (* (/ 15 0.10) (- 5.00 3))))))
= (- 1260 (+ 180 (* 0.04 (+ 120 (* 150 (- 5.00 3))))))
= (- 1260 (+ 180 (* 0.04 (+ 120 (* 150 2)))))
= (- 1260 (+ 180 (* 0.04 (+ 120 300))))
= (- 1260 (+ 180 (* 0.04 420)))
= (- 1260 (+ 180 16.8))
= (- 1260 196.8)
=1063.2
最初の式
コンピュータ内部での計算
実行結果 109
(profit 3) から 1063.2 が得られる過程
(profit 3)
= (- (revenue 3) (cost 3))
= (- (* (attendees 3) 3) (cost 3))
= (- (* (+ 120 (* (/ 15 0.10) (- 5.00 3))) 3) (cost 3))
= (- (* (+ 120 (* 150 (- 5.00 3))) 3) (cost 3))
= (- (* (+ 120 (* 150 2)) 3) (cost 3))
= (- (* (+ 120 300) 3) (cost 3))
= (- (* 420 3) (cost 3))
= (- 1260 (cost 3))
= (- 1260 (+ 180 (* 0.04 (attendees 3))))
= (- 1260 (+ 180 (* 0.04 (+ 120 (* (/ 15 0.10) (- 5.00 3))))))
= (- 1260 (+ 180 (* 0.04 (+ 120 (* 150 (- 5.00 3))))))
= (- 1260 (+ 180 (* 0.04 (+ 120 (* 150 2)))))
= (- 1260 (+ 180 (* 0.04 (+ 120 300))))
= (- 1260 (+ 180 (* 0.04 420)))
= (- 1260 (+ 180 16.8))
= (- 1260 196.8)
=1063.2
最初の式
実行結果
これは,
(define (profit ticket-price)
(- (revenue ticket-price)
(cost ticket-price)))
ticket-price 3 で置き換えたもの
110
3-3 課題
111
関数 profit (授業の例題7)についての問題
関数 profit を実行し,チケット代が 3, 4, 5の時の
実行結果を報告しなさい
課題1
112
関数 profit (授業の例題7)についての問題
固定費が0になるよに例題7のプログラムを変
更しなさい
その後,関数 profit を実行し,チケット代が 3, 4,
5の時の実行結果を報告しなさい
課題2
113