7.プログラム設計法と 種々のエラー.

Slides:



Advertisements
Similar presentations
1 情報基礎 A 第 9 週 プログラミング入門 VBA の基本文法 1 準備・変数・データの入出力 徳山 豪・全 眞嬉 東北大学情報科学研究科 システム情報科学専攻 情報システム評価学分野.
Advertisements

ソフトウェア工学 理工学部 情報システム工学科 新田直也. 演習問題 1 の解答例  入庫処理の DFD 酒屋の在庫問題の DFD( 入庫処理 ) 更新情報 在庫ファイル 更新処理 倉庫係 在庫不足リスト 在庫ファイル 出庫指示書 新規出庫 判定 出庫指示書 作成処理 出庫依頼 積荷票.
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
関数(1) 第11回 [6月29日、H.16(‘04)] 今日のメニュー 1 前回の課題 2 前回の宿題 3 いろいろな関数の演習 4 課題
プログラミング基礎I(再) 山元進.
Java I 第2回 (4/18)
知識情報演習Ⅲ(後半第1回) 辻 慶太(水)
数値計算及び実習 第3回 プログラミングの基礎(1).
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
VBA H106077 寺沢友宏.
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
ISD実習E 2009年6月1日 read関数 read-macro back-quote 文字列のread 課題
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
第8回 プログラミングⅡ 第8回
情報数理Ⅱ 平成27年9月30日 森田 彦.
条件式 (Conditional Expressions)
Tokuda Lab. NISHIMURA Taichi
初年次セミナー 第2回 文字の出力.
関数 関数とスタック.
第9回:Microsoft Excel (1/2)
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
基礎プログラミング演習 第1回.
工学部2018年度 – プログラミング論I – 2018年度前期 (廣川) 工学部第15講義室(月曜1,2限目)
2. 関数を使ったプログラムの 作成と実行 プログラミング論I.
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
Borland Delphi 6 でビジュアルプログラミング
プログラミング言語論 第3回 BNF記法について(演習付き)
10.構造体とグラフィックス.
ソフトウェア制作論 平成30年10月3日.
前回の練習問題.
6. リスト処理関数の設計(発展版) プログラミング論 I.
12.数値微分と数値積分.
6.リストの生成.
東京工科大学 コンピュータサイエンス学部 亀田弘之
3.条件式.
概要.
4.リスト,シンボル,文字列.
第4回 ファイル入出力方法.
11.再帰と繰り返しの回数.
9.構造体.
プログラミング言語論 第9回 情報工学科 木村昌臣 篠埜 功.
C言語 はじめに 2016年 吉田研究室.
15.cons と種々のデータ構造.
統計ソフトウエアRの基礎.
基礎プログラミング演習 第6回.
情報基礎Ⅱ (第1回) 月曜4限 担当:北川 晃.
3. 条件式、 データのバリエーション プログラミング論I.
2.関数の組み合わせ によるプログラム.
PROGRAMMING IN HASKELL
ウェブデザイン演習 第6回.
第5回 プログラミングⅡ 第5回
13.ニュートン法.
~sumii/class/proenb2009/ml6/
1.Scheme の式とプログラム.
5. 任意長の合成データ:リスト プログラミング論I.
PROGRAMMING IN HASKELL
情報処理Ⅱ 2007年12月3日(月) その1.
pf-2. 条件分岐 (Python プログラミング基礎を演習で学ぶシリーズ)
例題のプログラムを通して JavaScriptの仕組みを理解することとします。
7. 設計の抽象化 プログラミング論 I.
情報処理Ⅱ 2005年11月25日(金).
第10回 関数と再帰.
4. 合成データ:構造体 プログラミング論I.
情報処理Ⅱ 第3回 2004年10月19日(火).
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
アルゴリズム ~すべてのプログラムの基礎~.
Presentation transcript:

7.プログラム設計法と 種々のエラー

説明資料

本日の内容 プログラム設計法 5つの手順 種々のエラー

リングの面積 第1回講義の「リングの面積」について, 「プログラム設計法(Design Recipe)」を示す リングの面積  第1回講義の「リングの面積」について,  「プログラム設計法(Design Recipe)」を示す 内径と外径からリングの面積を求めるプログラム area-of-ring を書く 円の面積を求めるプログラム area-of-disk を使用 名前: area-of-ring パラメータ: outer(外径), inner(内径) r1 r2 真ん中に穴のあいた 円の面積と考える

リングの面積のプログラム (define (area-of-disk r) (* 3.14 (* r r))) 外径:outer 内径: inner  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))) area-of-disk の部分 area-of-ring の部分

実行結果の例 プログラムを コンピュータに与えて いる部分 (area-of-ring 5) を実行し,50.24 を得ている

プログラム設計法 何をすべきか,そして,行うべきことの順番についての段階的な規定 Design Recipe (デザインレシピ)ともいう

プログラム設計法 プログラム開発に必要な活動 Contract: 問題の解析,関数の名前と入出力の定義 Purpose: プログラムの目的の理解.プログラムの振る舞いの設計 Example プログラムの振る舞いを「例」で記述. Definition プログラムの定義 Test 検査を通じた誤り(エラー)の発見

Contract 問題の解析 問題が取り扱うデータの種類の記述 area-of-ring : number number -> number プログラム名 (意味を良く表す名前) プログラムの 入力と出力 プログラム化すると ;; area-of-ring : number number -> number (define (area-of-ring outer inner) ...)

Purpose プログラムの振る舞いに関する仕様の明確化 プログラムの仕様,目的など to compute the area of a ring whose radius is outer and whose hole has a radius of inner プログラムが何をするか, 何を計算するかを書いた文章 プログラム化すると ;; area-of-ring : number number -> number ;; to compute the area of a ring whose radius is ;; outer and whose hole has a radius of inner (define (area-of-ring outer inner) ...)

Purpose の効果 プログラムが何をするものかのコメント.引数名をコメント中に盛り込むと,よりわかりやすい ;; area-of-ring : number number -> number ;; to compute the area of a ring whose radius is ;; outer and whose hole has a radius of inner (define (area-of-ring outer inner) ...)

Example 例題を使った,プログラムの振る舞いの例示 入出力関係を特徴づけるような「例」での記述 area-of-ring should produce 50.24 for the inputs 5 and 3 入力と期待される出力 (プログラムの理解の助けになる) プログラム化すると ;; area-of-ring : number number -> number ;; to compute the area of a ring whose radius is ;; outer and whose hole has a radius of inner ;; example: (area-of-ring 5 3) should produce 50.24 (define (area-of-ring outer inner) ...)

Example の効用 特定の入力に対する出力の記述 論理的なエラーの発見の手段. プログラムを正確に理解するための手段(関数の入力と出力の関係や,計算過程など) 後でプログラムを読み返すときのための「メモ」として prose : 散文

Definition Example まで終わったら,プログラム本体の記述に取りかかる. Contract において「…」としていた部分を実際に作成 ドーナツ型の面積は,外側の面積から 内側の面積を引いたもの プログラムの振る舞い プログラム化すると ;; area-of-ring : number number -> number ;; to compute the area of a ring whose radius is ;; outer and whose hole has a radius of inner ;; example: (area-of-ring 5 3) should produce 50.24 (define (area-of-ring outer inner) (- (area-of-disk outer) (area-of-disk inner))) )

Definition 与えられた入力から,プログラムがどのように出力を計算するのかを理解した後に行う 記述していた「Example」を再度見て,特定の入力に対する出力をどのように計算したかを理解すること 入出力関係が,数式で与えられていれば, → 直ちにプログラムを書ける 言葉で問題が与えられていれば, → 注意深くプログラムを作る to this end このために

Test テストを通したエラーの発見 少なくとも,「Example」で書いた場合のテストは行う この段階で,エラーの発見に努める

Test では 「Example」に対して,期待された出力を計算するかを確かめる. 間違った出力に対しては プログラムの中身の間違い

プログラム設計法の例(まとめ) Contract: area-of-ring : number number -> number (define (area-of-ring outer inner) … ) Purpose: to compute the area of a ring whose radius is outer and whose hole has a radius of inner Example: (area-of-ring 5 3) should produce 50.24 Definition: (define (area-of-ring outer inner) (- (area-of-disk outer) (area-of-disk inner))) Tests: (area-of-ring 5 3) ;; expected value 50.24 参考 Web ページ http://www.htdp.org/2001-11-21/Book/node14.htm

ここまでのまとめ Contract 問題の解析.問題が取り扱うデータの種類の記述 Purpose プログラムの振る舞いに関する仕様の明確化 (プログラムの仕様,目的など) Example 例題を使った,プログラムの振る舞いの例示 Definition プログラムの作成 Test テストを通したエラーの発見

種々のエラー DrSchemeが 見つける. 構文エラー(Syntax Errors) 実行エラー(Run-time Errors) e.g. (10) , (10 + 20), (define (P x) (+ (x) 10)) 実行エラー(Run-time Errors) Schemeの書式に合っているプログラムの全てが,結果を返すとは限らない. e.g. (/ 1 0), (define (f n) (+ (/ n 3) 2))に対する(f 5 8) 論理的エラー(Logical Errors) Schemeの書式に合っていて,答えも出すが,その答えが間違っている.          e.g. (define (area-of-triangle b h) (+ b h))          (define (wage h) (+ 12 h)) (f 5 8)は,定義された引数の数と異なる数の引数が与えられている. 注意深く,規則正しく プログラムを設計することで発見できる.

言葉で表現された問題 問題  株式会社XYZは,全従業員に,時給12ドルを支払う.一般の従業員は,週に,20時間から65時間働く.従業員が働く時間数から,その従業員の賃金を求めるプログラムを作りなさい. 数式のような決まった形式を持たず,また,不要な情報も含まれているような文章から,問題を解くために必要な情報を見つけ,適当な式を作成する.

分野の知識(Domain Knowledge) プログラムを定義するには,プログラムをしようとする領域の知識(分野の知識)が必要. e.g. 数学の知識,音楽,生物学,土木工学,芸術.. その領域の言葉を理解することが求められる 時には,その応用領域のデータを表現する言語を発明しなければならない. コンピュータ言語にとらわれない,しっかりとした基礎の理解が不可欠. imperative 避けられない (命令法)

なぜプログラムを学ぶのか? 問題分析と問題解決の技術を学ぶため プログラミングにおける重要な概念 ある量から別の量へ関連づけ 名前に値を代入して,ある関係を評価する. プログラミングにおける重要な概念 スプレッドシート(表計算ソフト) スタイルシート(ワードプロセッサ) Web検索(検索エンジン) 種々のアプリケーション で,この概念が生きている. 2つの重要な概念 入力 出力

プログラミングを学ぶとは? サッカー トラップ ドリブル パス シュート ポジショニング 戦略 戦略の選択 戦略の作成 基本 応用 あらまし(概略) 設計 プログラム 基本がとても重要

実習

実習の進め方 資料を見ながら,「例題」を行ってみる 各自,「課題」に挑戦する 自分のペースで先に進んで構いません 各自で自習 + 巡回指導 各自で自習 + 巡回指導 遠慮なく質問してください 自分のペースで先に進んで構いません

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

例題1.条件式 残高 amount から利率を求める関数 interest-rate を作る 残高を条件とする条件式を使う 残高が $1000 以下ならば: 4% 残高が $5000 以下ならば: 4.5% 残高が $5000より多ければ: 5% 残高を条件とする条件式を使う cond 句が登場

例題1.条件式 利率 0.05 0.045 0.04 1000 5000 残高

入力と出力 1500 0.045 interest-rate 入力 出力

条件式のプログラム ;; interest-rate: number -> number ;; to determine the interest rate ;; for the given amount (define (interest-rate amount) (cond [(<= amount 1000) 0.040] [(<= amount 5000) 0.045] [(> amount 5000) 0.050])) amount ≦ 1000 のとき 1000 < amount ≦ 5000 のとき 5000 < amount のとき 条件式

条件付き関数の設計(1) データ分析と定義 関数例 データ定義.数値関数の場合,数直線を引いて特定の状況に対応する間隔を同定する. ;; interest-rate: number -> number ;; to determine the interest rate for the given amount >= 0 関数例 状況毎に,一つの関数例を作成.状況を数値間隔として特徴づけた場合は,その例は,全ての境界の場合も含むべき. 境界:0 , 1000, 5000 内部 500, 2000, 7000

条件付き関数の設計(2) 関数本体ー条件 関数本体ー答え 簡潔化 各状況を特徴づける条件を定式化 [(and (<= 0 amount) (<= amount 1000)) ... ] 関数本体ー答え cond節の条件に合った場合の答えを作成 簡潔化 cond節の条件が簡潔に表現できないかを確認し,できれば簡潔に表現し直そう.

関数 element3 について リストの長さが2以下の時には,「エラーメッセージ」が表示される (element3 (list 1 2)) 例) (element3 (list 1 2)) → エラーメッセージが表示される

(element3 (list 1 2)) から 実行エラーに至る過程 = (first (rest (rest (list 1 2))) = (first (rest (list 2))) = (first empty) 最初の式 (first (rest (rest a-list))) に a-list = (list 1 2) が 代入される (rest (list 1 2)) → (list 2) (rest (list 1)) → empty コンピュータ内部での計算 → 「空リスト empty に対して first を実行できない」 という決まりがあるので,実行エラー

実行エラーの例 first, rest に関する実行エラー(runtime error) 空で無いリスト 空リスト 数値 first OK

実行エラーの例 DrScheme の実行画面

よくある勘違い (define (list-length a-list) (cond [(= a-list empty) 0] [else (+ 1 (list-length (rest a-list)))])) 終了条件の判定:  ・ 正しくは「(empty? a-list)」 ・ x がリストのとき、(= x empty) は実行エラー ・ 「=」は数値の比較には使えるが,リスト同士の比較には使えない

実行エラーの例

プログラム作製のプロセス

エラーメッセージ 期待された入力以外の時には,警告のメッセージを出したい.error関数を使う. (error SYMBOL STRING) (define (give-name name) (cond [(symbol? name) (format “Hello, ~s” name)] [else (error ‘give-name “symbol expected”)]))

profit 関数 revenue 関数 cost 関数 attendees 関数 ;; profit: number -> number ;; to compute the profit as the difference between ;; revenue and costs at some given ticket-price (define (profit ticket-price) (- (revenue ticket-price) (cost 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 (* 0.04 (attendees ticket-price)))) ;; attendees: number -> number ;; to compute the number of attendees, ;; given ticket-price (define (attendees ticket-price) (+ 120 (* (/ 15 0.10) (- 5.00 ticket-price)))) profit 関数 revenue 関数 cost 関数 attendees 関数

プログラムの作成手順と問題の分析について 関数の名前とパラメータを決める 関数の機能を,文章で書く 関数の中身を書く $5 .. 120 $5 - 0.1x .. 120 + 15x y=$4 = $5 -0.1x -> x=10 ->120+15*10=270 cost 270 * 0.04 y=$3 -> x=20 ->120+15*20=420 cost 420 * 0.04 x=($5-y)/0.1 z=120+15*x = 120+(15 * ($5 -y)/0.1)

今日の実習課題

課題1 次のように関数 f が定義されている時,「(f 5 20)」 を DrScheme で実行すると,どうなるか,説明せよ。 (define (f n) (* n 20))

課題2 次の Scheme式のエラーの原因について,分かりやすく説明しなさい (10 + 20) ・・・構文エラー 次のScheme式を DrScheme を使って実行すると,赤い文字で,エラーメッセージが表示される (10 + 20) ・・・構文エラー (define (f y) ・・・実行エラー (+ x 10))のとき,(f 5)を実行 (define (g x) ・・・構文エラー + x 10) (define h(x) ・・・構文エラー (+ x 10)) (define (f n) ・・・実行エラー (+ (/ n 3) 2))のとき,(f 5 8)を実行 (+ 5 (/ 1 0)) ・・・実行エラー