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