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