以下に示す課題の中から1つを選択し、解決した上で、最終課題レポートとして提出せよ。
Smalltalk を用いて、砲丸の軌跡を表示するプログラムを作成しよう。入出力の条件は次のとおりである。
以上により、連続ストロボ撮影をしたかのように、砲丸の軌跡を表示する。実行時の様子を参考として以下に示す。
設問1 既存の Point オブジェクトを使用して、砲丸の位置を扱うことにする。System Browser の「find class」という操作を用いて、Point オブジェクトの定義(インスタンス変数として何が存在するか)を検出し、表示せよ。そして、インスタンスメソッド x、y、およびクラスメソッド x:y: の定義を表示せよ。
設問2 砲丸の位置を計算するには、物理的な位置を表す座標系(p系と呼ぶことにする)を使用する。一方、砲丸を表示するには、Squeak の画面上の位置を表す座標系(s系と呼ぶことにする)を使用する。そこで、2つの座標系間の位置情報の変換を行うためのオブジェクト MyConverter を作成しよう。このオブジェクトにおいて、インスタンスメソッド setOx:、setOy:、および、setScale: を作成せよ。ここで、setOx: と setOy: は、p系の原点が対応する s系の位置を設定するものとする。setScale: は、p系における単位長に対する s系における長さを設定するものとする(たとえば、p系における1 がs系における 100 に対応するとき setScale: 100 とする)。次に、p系の位置を s系の位置に変換するメソッドとして toSfromP: を作成せよ。このメソッドの引数は、Point インスタンスを想定せよ。
設問3 まず、軌跡オブジェクト Tracer を作成しよう。Tracer は、抽象オブジェクトである。抽象メソッドとして、pointAtTime: を作成せよ。このメソッドは、引数の時刻における物体の位置(p系)を Point のインスタンスとして返すことが期待されている。次に、砲丸の軌跡オブジェクト TrCannonball を作成せよ。重力加速度を指定するメソッド setGravity:、砲丸の初速度を指定するメソッド setInitialVelocity:、砲丸の投射角度を指定するメソッド setAngle: を作成せよ。また、pointAtTime: を具体的に作成せよ。ちなみに、ラジアンの値に cos というメッセージを送ると、cos の値が返される。
設問4 軌跡をストロボ撮影風に表示するためのオブジェクト MyPrinter を作成しよう。このオブジェクトには、座標系変換のためのオブジェクトを指定するメソッド setConverter:、軌跡計算のためのオブジェクトを指定するメソッド setTracer:、表示する物体(StarMorph など)を指定するメソッド setMorph:、表示周期を指定するメソッド setTerm: を作成せよ。さらに、指定時刻までの軌跡を表示するメソッド showTill:、表示した物体を消去するメソッド clean を作成せよ。なお、showTill: にて表示する物体を Bag などのインスタンス変数に蓄積しておくことで、clean が作成しやすくなる。
設問5 ワークスペースで以下を1行ずつ実行し、画面中央付近に、放物線を描く☆の並びが表示されることを確認せよ。また、最後に mp clean を実行することで、☆が全て消去されることを確認せよ。レポートには☆の並びの表示を掲載せよ。
mc := MyConverter new mc setOx: 300 mc setOy: 400 mc setScale: 50 ball := TrCannonball new ball setGravity: 9.8 ball setInitialVelocity: 10.0 ball setAngle: 45 mp := MyPrinter new mp setConverter: mc mp setTracer: ball mp setMorph: StarMorph mp setTerm: 0.1 mp showTill: 1.7 mp clean |
設問6 学籍番号の1桁目に応じて以下の問いを選択して答えよ。
設問7 自身のオリジナルの問題を設定し、その解決例を示せ。
Scheme を用いて、オブジェクト指向プログラミングをやってみよう。
配列オブジェクト array を定義しよう。このオブジェクトは次のように操作できるものとする:
設問1 (define a ((array 'new))) により、変数 a に array のインスタンスをバインドせよ。
設問2 (define b ((array 'list) 〈リスト〉)) により、〈リスト〉から作成した配列を持つインスタンスを変数 b にバインドせよ。
設問3 次のメソッドを定義せよ。なお、下記の〈 〉は引数を表す。メッセージ名と引数を並べて記述しているが、Scheme 上で実行する際、上記の形式で引数を与えるものとする。また、「返す」という意味は、「返り値として返す」であり、「writeなどで表示する」ではない。
設問4 先頭要素を扱うメソッドを作ろう。
設問5 「'qsort」により、レシーバの配列をクイックソートした結果を持つ新しい array インスタンスを返す。ただし、レシーバの状態は変化しない。
設問6 学籍番号の1桁目に応じて以下の問いを選択して答えよ。
設問7 自身のオリジナルの問題を設定し、その解決例を示せ。
※ オブジェクト指向プログラミングの性質が再現できていない場合には、点数が伸びない。よく考えて解答すること。
Prolog を用いて、旅行を計画するプログラムを作成しよう。
入出力の条件は次のとおりである。
※ 3〜5は経路が存在する場合のみ出力
このプログラムで扱う交通手段として、(1) 徒歩、(2) 鉄道、(3) 航空機 の3種類を少なくとも用意せよ。徒歩は、出発時刻の制限が無く、移動コスト(金額)は 0 とせよ。鉄道は、普通列車(短距離のみ)、特急列車、新幹線、モノレールを用意せよ。
鉄道と航空機は、出発時刻、移動コスト、主要な駅・空港を、やや現実的な情報として設定せよ。主要な停車駅や空港として、少なくとも以下を含めること:
設問1 移動区間を表すデータの構造を説明せよ。また、全体像を図示せよ。図は、手書きで良い。
設問2 徒歩の場合、出発時刻の制限が無いことへの対処方法を説明せよ。
設問3 鳥取大学から東京駅までの計画を幾つか出力し、その意味を説明せよ。
設問4 最も安く/高く移動する方法を求める規則(find_cheap_path/find_expensive_path)を作成せよ。そして鳥取大学から東京駅までについて各実行例を示せ。
設問5 最も移動時間のかからない方法を求める規則(find_fast_path)を作成せよ。そして鳥取大学から東京駅までについて実行例を示せ。
設問6 学籍番号の1桁目に応じて以下の問いを選択して答えよ。
設問7 自身のオリジナルの問題を設定し、その解決例を示せ。
レポートは次の様式で作成せよ。
2008年8月4日(月) 9:00 から 7日(木) 17:00 までを受付期間とします。
「最終課題レポート」と「小レポート一式」をまとめて提出せよ。小レポートが7件揃っていない場合は受理しません。提出場所は、社会開発棟1階 1504 室(計算機工学講座C)です。提出時に、簡単な質問を行います。内容に不備のある場合は受理しません。
他人のレポートをコピーするなどの不正がある場合には、見せた人も、見た人も未提出扱いとします。
最終課題レポートを提出してもらった後に、レポートの採点を行います。その際、不完全なレポートは、いい点数が付きません。その結果、合計点が60点に到達しないならば、不合格になります。最終課題はとても難しいものになっています。不安なところや疑問のあるところが沢山あると思います。ささいなデバッグ相談からでも質問を受け付けています。