3 1 Scheme 2 Scheme Scheme define areaofdisk

  • Slides: 112
Download presentation

3 -1 Scheme の関数 2

3 -1 Scheme の関数 2

Scheme のプログラムと関数 • Scheme のプログラムは,一般に,複数の関 数の集まり (define (area-of-disk r) (* 3. 14 (* r

Scheme のプログラムと関数 • Scheme のプログラムは,一般に,複数の関 数の集まり (define (area-of-disk r) (* 3. 14 (* r r))) (define (area-of-ring outer inner) (- (area-of-disk outer) (area-of-disk inner))) ⇒ 参照: これらは Scheme の式 例題3、4 11

Dr. Scheme の使用 • Dr. Scheme の起動 プログラム → PLT Scheme → Dr. Scheme

Dr. Scheme の使用 • Dr. Scheme の起動 プログラム → PLT Scheme → Dr. Scheme • 今日の演習では「Intermediate Student」 に設定 Language → Choose Language → Intermediate Student → Execute ボタン 15

2乗の和のプログラム • x 2+y 2 を求める (define (sqr x) (* x x)) (define (sum-of-squares

2乗の和のプログラム • x 2+y 2 を求める (define (sqr x) (* x x)) (define (sum-of-squares x y) (+ (sqr x) (sqr y))) sqr の部分 sum-of-squares の部分 46

関数の関係 sum-of-squares 関数 (define (sum-of-squares x y) (+ (sqr x) (sqr y))) sum-of-squares 関数の中で,

関数の関係 sum-of-squares 関数 (define (sum-of-squares x y) (+ (sqr x) (sqr y))) sum-of-squares 関数の中で, sqr 関数を使っている(2箇所) sqr 関数 (define (sqr x) (* x x)) 47

例題4.ステップ実行 • 関数 sum-of-squares (例題3)について,実行結 果に至る過程を見る • (sum-of-squares 20 30) から 1300 に至る過程を見る •

例題4.ステップ実行 • 関数 sum-of-squares (例題3)について,実行結 果に至る過程を見る • (sum-of-squares 20 30) から 1300 に至る過程を見る • Dr. Scheme の stepper を使用する (define (sqr x) (* x x)) (define (sum-of-squares x y) (+ (sqr x) (sqr y))) (sum-of-squares 20 30) = (+ (sqr 20) (sqr 30)) = (+ (* 20 20) (sqr 30)) = (+ 400 (* 30 30)) = (+ 400 900) = 1300 50

(sum-of-squares 20 30) から 1300 が得られる過程 (sum-of-squares 20 30) = (+ (sqr 20) (sqr

(sum-of-squares 20 30) から 1300 が得られる過程 (sum-of-squares 20 30) = (+ (sqr 20) (sqr 30)) = (+ (* 20 20) (sqr 30)) これは, = (+ 400 (sqr 30)) (define (sum-of-squares x y) (+ 30 (sqr 30)) x) (sqr y))) = (+ 400 (* の x を 20 で,y を 30 で置き換えたもの = (+ 400 900) = 1300 59

リングの面積のプログラム 外径: outer 内径: inner (define (area-of-disk r) (* 3. 14 (* r r)))

リングの面積のプログラム 外径: outer 内径: inner (define (area-of-disk r) (* 3. 14 (* r r))) (define (area-of-ring outer inner) (- (area-of-disk outer) (area-of-disk inner))) outer area-of-disk の部分 area-of-ring の部分 71

関数の関係 area-of-ring 関数 (define (area-of-ring outer inner) (- (area-of-disk outer) (area-of-disk inner))) area-of-disk 関数

関数の関係 area-of-ring 関数 (define (area-of-ring outer inner) (- (area-of-disk outer) (area-of-disk inner))) area-of-disk 関数 (define (area-of-disk r) (* 3. 14 area-of-ring 関数の中で, (* r r))) area-of-disk 関数を使っている(2箇所) 72

データの流れ area-of-ring 関数 (define (area-of-ring outer inner) (- (area-of-disk outer) (area-of-disk inner))) ① 数値を,

データの流れ area-of-ring 関数 (define (area-of-ring outer inner) (- (area-of-disk outer) (area-of-disk inner))) ① 数値を, area-of-disk 関数に渡す ②渡された値を, 「r」という名前で使う area-of-disk 関数 (define (area-of-disk r) (* 3. 14 (* r r))) ③実行結果を area-of-ring 関数に返す 73

例題6.ステップ実行 • 関数 area-of-ring (例題5)について,実行結果 に至る過程を見る • (area-of-ring 5 3) から 50. 24 に至る過程を見る

例題6.ステップ実行 • 関数 area-of-ring (例題5)について,実行結果 に至る過程を見る • (area-of-ring 5 3) から 50. 24 に至る過程を見る • Dr. Scheme の stepper を使用する (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 (* 3. 14 (* 3 3))) = (- 78. 5 (* 3. 14 9)) = (- 78. 5 28. 26) = 50. 24 75

(area-of-ring 5 3) から 50. 24 が得られる過程 (area-of-ring 5 3) 最初の式 = (- (area-of-disk

(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)) (- (area-of-disk outer) (area-of-disk inner)) に outer = 5, inner = 3 が代入される (* 3. 14 (* r r)) に r = 5 が代入される = (- (* 3. 14 25) (area-of-disk 3)) (* 5 5) → 25 = (- 78. 5 (area-of-disk 3)) (* 3. 14 25) → 78. 5 = (- 78. 5 (* 3. 14 (* 3 3))) (* 3. 14 に r = 3 が代入される (* r r)) = (- 78. 5 (* 3. 14 9)) (* 3 3) → 9 = (- 78. 5 28. 26) (* 3. 14 9) → 28. 26 = 50. 24 実行結果 コンピュータ内部での計算 86

(area-of-ring 5 3) から 50. 24 が得られる過程 (area-of-ring 5 3) = (- (area-of-disk 5)

(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)) (define (area-of-ring = (- 78. 5 (area-of-disk 3)) outer inner) ((area-of-disk outer) = (- 78. 5 (* 3. 14 (* 3 3))) (area-of-disk inner))) =の (- 78. 5 (* 3. 14 outer を 59)) で,inner を 3 で置き換えたも =の (- 78. 5 28. 26) = 50. 24 87

「例題7.利益の計算」の手順 (1/4) 1. 次を「定義用ウインドウ」で,実行しなさい • 文法的な「間違い」が無いことを確認するため,入力した後 Execute ボタンを押す ; ; profit : number ->

「例題7.利益の計算」の手順 (1/4) 1. 次を「定義用ウインドウ」で,実行しなさい • 文法的な「間違い」が無いことを確認するため,入力した後 Execute ボタンを押す ; ; 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 ; ; 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). . . ) ☆ 次ページに進んでください 94

(define (profit ticket-price) (- (revenue ticket-price) profit 関数 (cost ticket-price))) (define (revenue ticket-price) (*

(define (profit ticket-price) (- (revenue ticket-price) profit 関数 (cost ticket-price))) (define (revenue ticket-price) (* (attendees ticket-price)) revenue 関数 (define (cost ticket-price) (+ 180 cost 関数 (* 0. 04 (attendees ticket-price)))) (define (attendees ticket-price) (+ 120 (* (/ 15 0. 10) (- 5. 00 ticket-price)))) attendees 関数 105

関数の関係 profit 関数 (define (profit ticket-price) (- (revenue ticket-price) (cost ticket-price))) revenue, cost 関数を

関数の関係 profit 関数 (define (profit ticket-price) (- (revenue ticket-price) (cost ticket-price))) revenue, cost 関数を 使っている revenue 関数 (define (revenue ticket-price) (* (attendees 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

例題8.ステップ実行 • 関数 profit (例題7)について,実行結果に至る 過程を見る • (profit 3) から 1063. 2 に至る過程を見る •

例題8.ステップ実行 • 関数 profit (例題7)について,実行結果に至る 過程を見る • (profit 3) から 1063. 2 に至る過程を見る • Dr. Scheme の stepper を使用する (profit 3) = (- (revenue 3) (cost 3)) = (- (* (attendees 3) 3) (cost 3)) = (- (* (+ 120 (* (/ 15 0. 10) (- 5. 00 3))) 3) (cost 3)) = (- (* (+ 120 (* 150 2)) 3) (cost 3)) = (- (* (+ 120 300) 3) (cost 3)) = (- (* 420 3) (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 2))))) = (- 1260 (+ 180 (* 0. 04 (+ 120 300)))) = (- 1260 (+ 180 (* 0. 04 420))) = (- 1260 (+ 180 16. 8)) = (- 1260 196. 8) =1063. 2 107

「例題3.ステップ実行」の手順 1. 次を「定義用ウインドウ」で,実行しなさい • Intermediate Student で実行すること • 入力した後に,Execute ボタンを押す ; ; profit: number

「例題3.ステップ実行」の手順 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 ; ; to compute the revenue, given ticket-price (define (revenue ticket-price) (* (attendees 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) 例題7と同じ ステップ実行したい ので,入力済みの プログラムは,消さず に残しておく 例題7に 1行書き加える 2. Dr. Scheme を使って,ステップ実行の様子を 確認しなさい (Step ボタン,Next ボタンを使用) 108

(profit 3) から 1063. 2 が得られる過程 (profit 3) 最初の式 = (- (revenue 3) (cost

(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 2)) 3) (cost 3)) = (- (* (+ 120 300) 3) (cost 3)) = (- (* 420 3) (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 2))))) = (- 1260 (+ 180 (* 0. 04 (+ 120 300)))) = (- 1260 (+ 180 (* 0. 04 420))) = (- 1260 (+ 180 16. 8)) コンピュータ内部での計算 = (- 1260 196. 8) 109 =1063. 2 実行結果

(profit 3) から 1063. 2 が得られる過程 (profit 3) 最初の式 = (- (revenue 3) (cost

(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)) (profit ticket-price) = (- (define (* (+ 120 300) 3) (cost 3)) = (- (*(-420 3) (cost 3))ticket-price) (revenue = (- 1260(cost 3)) ticket-price))) = (- 1260 (+ 180 (* 0. 04 (attendees 3)))) ticket-price を (+3 120 で置き換えたもの =の (- 1260 (+ 180 (* 0. 04 (* (/ 15 0. 10) (- 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

3 -3 課題 111

3 -3 課題 111