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))
間違いの例
間違いの例
+の後にスペースが無い
*の後にスペースが無い
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
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 dolar
どちらか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 を使うこと
摂氏と華氏の変換式: c5×(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の平方根
35
3564で割った余り
7の対数 (但し,e を底とする)
sin (0.7865) 0.7865 はラジアン)
次の計算を行う Scheme の式を書き,
DrScheme の実行用ウインドウ」で実行
して,実行結果を報告しなさい
69
課題4.Scheme