sp-2. Scheme の式とプログラム
1
金子邦彦
(Scheme プログラミング)
URL: https://www.kkaneko.jp/pro/scheme/index.html
Scheme言語における式の記述方法と、関数定義による
プログラム作成の基礎
【学習内容の構成】
1. Schemeの式:四則演算や各種演算子を用いた計算
式の記述と実行
2. Schemeの関数:defineによる関数定義とパラメー
タを用いたプログラム作成
3. DrSchem eの操作:定義用ウインドウと実行用ウイ
ンドウを使用したプログラミング環境の活用
• 前提:基本的な数学の知識(四則演算、べき乗、三角
関数)
• 意義:関数型プログラミングの基本概念の習得、計算
手順の抽象化の理解
2
2-1 Scheme の式
3
Scheme を使ってできること
• 計算機能:
• Scheme の式を入力すると:
計算が行われて,実行結果が表示される
• プログラム機能:
• Scheme のプログラムを入力すると:
プログラムが記憶され,後で何度でも実行できる
4
5
Scheme の計算機能
コンピュータ
(Scheme 搭載)
Scheme の式
式の実行結果
Scheme の式を入力すると,
計算が行われて表示される
Scheme のプログラム機能 (1/2)
6
コンピュータ
(Scheme 搭載)
Scheme の
プログラム
Scheme のプログラムを
読み込ませると ・・・
いったん,プログラムが
記憶される
Scheme のプログラム機能
実行結果が表示される
記憶されていた
プログラムが使用される
コンピュータ
(Scheme 搭載)
Scheme の式
今度は,読み込ませた
プログラムを実行させると ・・・
式の実行結果
7
• 数値:
5, -5, 0.5 など
• 変数名
• 四則演算子:
+, -, *, /
• その他の演算子:
remainder, quotient, max,
min, abs, sqrt, expt, log, sin,
cos, tan
asin, acos, atan など
• 括弧
(, )
• 関数名
• define
Scheme の式は,以下の組み合わせ
これ以外にもあるが,
適宜授業で触れていく
8
Scheme の式に登場するもの
• (+ 5 5)
• (+ -5 5)
• (+ 0.5 0.5)
• (- 5 5)
• (* 3 4)
• (/ 8 12)
負の数も扱える
+, -, *, / が使える
負の数も扱える
「*」 は掛け算
の意味
9
Scheme の式の例
ー 四則演算 -
実行結果の例
10
式を入力すると,
計算が行われて表示される
11
コンピュータが行っていること
コンピュータ
(Scheme 搭載)
Scheme の式
式の実行結果
例えば:
(+ 5 5)
を入力する
と・・・
10
が表示される
• (remainder 100 15) ;; 100 を 15 で割った剰余(=10)
• (quotient 100 15) ;; 100 を 15 で割った商(=6)
• (max 3 5) ;; 3, 5 の大きい方 (=5)
• (min 3 5) ;; 3, 5 の小さい方 (=3)
• (abs -10) ;; -10 の絶対値 (=10)
12
Scheme の式の例
ー 各種の演算 ー
13
実行結果の例
式を入力すると,
計算が行われて表示される
14
コンピュータが行っていること
コンピュータ
(Scheme 搭載)
Scheme の式
式の実行結果
例えば:
(remainder 100
15)
を入力すると・・・
10
が表示される
• (sqrt 2) ;; 2 の平方根
• (expt 2 3) ;; 2 の3乗
• (log 4) ;; log
e
4 (eを底とする)
• (sin 0.785) ;; sin 0.785
• (cos 0.785) ;; cos 0.785
• (tan 0.785) ;; tan 0.785
• (asin (/ (sqrt 2) 2)) ;;
• (acos (/ (sqrt 2) 2)) ;;
• (atan 1) ;; tan
-1
1
2
三角関数の
単位はラジアン
2
2
2
sin
1−
2
2
cos
1−
15
Scheme の式の例
ー 各種の演算 ー
実行結果の例
16
式を入力すると,
計算が行われて表示される
コンピュータが行っていること
コンピュータ
(Scheme 搭載)
Scheme の式
式の実行結果
例えば:
(sqrt 2)
を入力する
と・・・
#i1.4142135623730951
が表示される
#i とあるのは「近似値」という意味
17
18
Scheme の式の例
ー 入れ子になった括弧 ー
2
)10/30(*)53(
*)22(
+
+
Scheme 言語で書くと:
(* (+ 2 2)
(/ (* (+ 3 5)
(/ 30 10))
2))
「*」とあるのは,「乗算」の意味
Scheme の式
(* (+ 2 2) (/ (* (+ 3 5) (/ 30 10)) 2))
括弧が,計算の「単位」を表現
2
)10/30(*)53(
*)22(
+
+
19
括弧の意味
実行結果の例
20
実行結果が表示される
式を入力すると
21
コンピュータが行っていること
コンピュータ
(Scheme 搭載)
Scheme の式
式の実行結果
例えば:
(* (+ 2 2)
(/ (* (+ 3 5)
(/ 30 10))
2))
を入力する
と・・・
48
が表示される
2-2 Scheme の関数
22
計算等の実行手順を記述したもの
(define (area-of-disk r)
(* 3.14
(* r r)))
例
Scheme のプログラム
円の面積を求めるプログラム
• 円の半径 r の値から,円の面積
「(* 3.14 (* r r))」を計算
23
プログラムとは
半径 r の円の面積は 3.14
r
2
r (円の面積)
24
円の面積
(define (area-of-disk r)
(* 3.14
(* r r)))
この部分は Scheme の式
(変数 r を使用)
25
円の面積を求めるプログラム
(define (area-of-disk r)
(* 3.14
(* r r)))
値を1つ(名前は r )
受け取る
(r のことをパラメータ
という)
r の値から「(* 3.14 (* r r))」を計算
26
円の面積を求めるプログラム
• プログラムは「関数」と見立てることができる
• 入力と出力がある
area-of-disk
r の値: 5 のとき
78.5
入力
出力
27
関数としてのプログラム
関数 = プログラムの単位
(define (area-of-disk r)
(* 3.14
(* r r)))
1つの 関数
値を1つ受け取る(入力)
関数の名前
「関数である」ことを
示すキーワード
r の値から「(* 3.14 (* r r))」
を計算(出力)
28
まとめ
2-3 パソコン演習
29
• 資料を見ながら,「例題」を行ってみる
• 各自,「課題」に挑戦する
• 自分のペースで先に進んで構いません
30
パソコン演習の進め方
Scheme の関数を
作り,コンピュータ
に読み込ませる
Scheme の関数の定義
作った関数を実行
して,実行結果を
得る
Scheme の式の実行
31
Scheme プログラミングの手順
定義用ウインドウ
実行用ウインドウ
32
DrScheme の2つのウインドウ
関数を編集し,
コンピュータに
読み込ませてい
る
読み込んだ関
数を実行させ
ている
33
DrScheme の2つのウインドウ
Execute ボタン
・定義を行ったら
「Execute ボタン」を押す
→ 関数の定義内容を
コンピュータが読み込む
→ 「実行用ウインドウ」の
中身はクリアされる
34
DrScheme の Execute ボタン
DrScheme
実行用ウインドウ
実行結果
実行用ウインドウ
式
定義用ウインドウ
関数
35
DrScheme の2つのウインドウ
• 何日かかけてプログラム作成したいとき
→ プログラムを保存する必要あり
• DrScheme の「Save 機能」を活用すること
• ファイル名は「英語」で付けることを勧める
36
DrScheme でのプログラム保存法
保存では,「File」→
「Save Definitions」 を行う
37
• DrScheme の起動
プログラム → PLT Scheme →
DrScheme
• 今日のパソコン演習では「Intermediate
Student」
に設定
Language
→ Choose Language
→ Intermediate Student
→ Execute ボタン
38
DrScheme の使用
39
「Intermediate Student」に設定
Language
→ Choose Language
Intermediate Student
を選択し,
「OK」をクリック
最後に Execute ボタン
40
例題1.簡単な数式
• 次の Scheme の式を DrScheme の実行用ウイン
ドウに入力し,実行してみる
2
)10/30(*)53(
*)22(
+
+
• Scheme 言語で書くと:
(* (+ 2 2)
(/ (* (+ 3 5)
(/ 30 10))
2))
Scheme の式
1. 次の式を「実行用ウインドウ」で,実行しなさい
(* (+ 2 2)
(/ (* (+ 3 5)
(/ 30 10))
2))
☆ 次は,例題2に進んでください
41
「例題1.簡単な数式」の手順
式を実行用ウインドウに入力して,
Enter キーを押すと
42
「例題1.簡単な数式」の結果 (1/2)
実行結果が表示される
43
「例題1.簡単な数式」の結果 (2/2)
44
コンピュータが行っていること
コンピュータ
(Scheme 搭載)
Scheme の式
式の実行結果
例えば:
(* (+ 2 2)
(/ (* (+ 3 5)
(/ 30 10))
2))
を入力する
と・・・
48
が表示される
• 「スペース(空白文字)」に意味がある
(* (+2 2)
(/ (* (+ 3 5)
(/ 30 10))
2))
(*(+ 2 2)
(/ (* (+ 3 5)
(/ 30 10))
2))
間違いの例 1
間違いの例 2
+の後にスペースが無い
*の後にスペースが無い
45
よくある間違い
+, ー, *, /, sqrt, expt, remainder など
の基本的な演算は,すでに,コンピュータ内
に組み込み済み
簡単な数式の実行
では,定義用ウインドウ
は使用しない
46
定義用ウインドウ
• 円の半径 r から面積を求める関数
area-of-disk を書き,実行する
例) 5 → 78.5
• 関数の名前: area-of-disk
• パラメータ: r
47
例題2.円の面積
1. 次を「定義用ウインドウ」で,実行しなさい
• 入力した後に,Execute ボタンを押す
(define (area-of-disk r)
(* 3.14
(* r r)))
2. その後,次を「実行用ウインドウ」で実行しなさい
☆ 次は,例題3に進んでください
(area-of-disk 5)
48
「例題2.円の面積」の手順
まず,定義用ウインドウで
プログラムを編集している
49
「例題2.円の面積」の結果(1/4)
Execute ボタンを押す
と,定義用ウインドウ
に書いたプログラム
が,コンピュータに読
み込まれる
このとき,実行用ウインドウ
の中身はクリアされる
50
「例題2.円の面積」の結果(2/4)
実行用ウインドウで,
(area-of-disk 5)
と入力して,Enter キーを押す
(これは,r の値 を 5 に設定しての実行)
51
「例題2.円の面積」の結果(3/4)
実行結果である「78.5」が
表示される
(確かに 5×5×3.14 = 78.5)
52
「例題2.円の面積」の結果(4/4)
今度は,
(area-of-disk 10)
と書いて,r の値 を 10 に設定し
ての実行.
実行結果である「314」が
表示される
(確かに 10×10×3.14 = 314)
53
① プログラムを書き,コンピュータに読み込
ませる
② 読み込ませたプログラムを実行させる
(define (area-of-disk r)
(* 3.14
(* r r)))
例
(area-of-disk 5)
例
Scheme のプログラム
Scheme のプログラム
を実行させるための
Scheme の式
(area-of-disk 10)
円の面積を求める
プログラム
実際に,半径 5, 半径 10
の円の面積を求める
54
プログラム実行までの手順
• 式の中に「関数名」 を書く
例: (area-of-disk 5) ←これも、Scheme の
式
実際に,半径 5
の円の面積を求める
55
プログラムの実行
56
コンピュータが行っていること
コンピュータ
(Scheme 搭載)
Scheme の
プログラム(関数)
例えば
(define (area-of-disk r)
(* 3.14
(* r r)))
を読み込ませると
いったん,
コンピュータ内に
記憶される
57
コンピュータが行っていること
コンピュータ
(Scheme 搭載)
Scheme の式
式の実行結果
例えば:
(area-of-disk 5)
を入力する
と・・・
78.5
が表示される
• 次の関数を書き,実行する
f1: x と N から 「x
N
/N」を求める
f2: x と y から 「x, y のうち大きいほう」
を求める
f3: x から 「x を100で割った余り」を求
める
f4: x から 「x を100で割った商」を求め
る
58
例題3.簡単なプログラム
1. 次を「定義用ウインドウ」で,実行しなさい
• 入力した後に,Execute ボタンを押す
(define (f1 x N)
(/ (expt x N) N))
(define (f2 x y)
(max x y))
(define (f3 x)
(remainder x 100))
(define (f4 x)
(quotient x 100))
2. その後,次を「実行用ウインドウ」で実行しなさい
☆ 次は,課題に進んでください
(f1 2 5)
(f2 3 4)
(f3 123)
(f4 123)
59
「例題3.簡単なプログラム」の手順
まず,Scheme のプログラムを
コンピュータに読み込ませている
60
確かに 2
5
/5 = 6.4
確かに 123 を 100 で
割った余りは,23
確かに 123 を 100 で
割った商は,1
確かに, 3, 4 の大きい方は 4
61
• x
N
/N
(/ (expt x N) N) ・・・ 2変数の式
• x, y のうち大きいほう
(max x y) ・・・ 2変数の式
• x を100で割った余り
(remainder x 100) ・・・ 1変数の式
• xを100で割った商
(quotient x 100) ・・・ 1変数の式
関数の本体には「変数を含む式」を書くことになる
62
Scheme の式の例
変数が登場するもの
2-4 課題
63
• ドル d から円を求める関数 d2y を作成
し,実行結果を報告しなさい
• define を使うこと
• 1ドルは,120.53円とする
64
課題1.ドルから円への変換
• x から「10 x + 30」 を求める関数 foo
を作成し,実行結果を報告しなさい
解答の例:
(define (foo x)
(+ (* 10 x) 30))
実行結果は次の通り.期待通りの結果を得た
> (foo 10)
130
> (foo 20)
230
(あくまでも解等の例です)
65
課題のヒント
• ここにあるのは「間違い」の例です.同じ間
違いをしないこと
1.「かっこ」の間違い
define (d2y d)
(* 120.53 dollar)
⇒ 全体をかっこで囲むこと
2.変数名の対応の間違い
(define (d2y dollar)
(* 120.53 d))
⇒ 変数名 d と dollar は
どちらか1つにそろえること
3.関数の書き方の間違い
(define (d2y)
(* 120.53 d))
(define (d 2 y d)
(* 120.53 d))
4.関数名の付け方の間違い
⇒ 「d 2 y」では無く,
「d2y」と書くこと
⇒ d2y の後に d が必要
66
課題1のヒント
• 摂氏(Celsius) c から華氏
(Fahrenheit)を求める関数 c2f を作成
し,実行結果を報告しなさい
• define を使うこと
• 摂氏と華氏の変換式: c=5×(f-32)/9
67
課題2.摂氏から華氏への変換
• 元利を求める関数 interest を作成し,実行結
果を報告しなさい
• define を使うこと
• 元利の計算式:
「元利 = 元金 × (1+年利)
年数
」
• 作成した関数を実行し,元金1000円,年利
2%での,50年後の元利を報告しなさい
68
課題3.元利の計算
5 + 5
-5 + 5
3 * 4
8 / 12
(2 + 2) * (((3 + 5) * (30 / 10)) / 2)
3 + 4.5
2の平方根
3の5乗
356を4で割った余り
7の対数 (但し,e を底とする)
sin (0.7865) (0.7865 はラジアン)
• 次の計算を行う Scheme の式を書き,
「DrScheme の実行用ウインドウ」で実行
して,実行結果を報告しなさい
69
課題4.Scheme 式