第3回(10/16) ポリモーフィズム ・イテレータ、クラスメソッド、クラス変数 ・オブジェクトの格納とメソッド呼出し ☆ 図形クラス、ドキュメントのクラス ■ イテレータ ・配列変数の各要素を表示するとき、どうするか? - 配列変数の引数を使う ⇒ list0301.rb - イテレータを使う ⇒ list0302.rb ・配列変数の各要素を計算してみよう ⇒ list0303.rb □□□ 演習1 □□□ 三角形クラス Triangle を宣言せよ。初期化メソッド initialize は、引数として、底辺の長さ、および、高さを与える。面積計算メソッド menseki は、三角形の面積を返す。 メインルーチンでは、次のようにして三角形インスタンスを作る。 objs = Array.new objs << Triangle.new(2,3) objs << Triangle.new(2,4) objs << Triangle.new(3,6) この後、イテレータを使って、それぞれについて面積を計算し表示せよ。 出力例: 3.0 4.0 9.0 ⇒ prac0301.rb ■ ポリモーフィズム ・多態性、多相性 ・オブジェクトが独自のメッセージの解釈を持つこと ・共通の意味・機能には、共通のメソッド名を与える。 例:「/」は割り算の意味。 整数クラスのときは「小数点以下切捨て、で割り算する」 浮動小数点クラスのときは「小数点以下も求める」 ● 配列変数の型宣言が無いこと。 ⇒ list0304.rb をよく見ると、 配列変数 a は、C言語でいう、int 型と float 型が混在している。 int a[8]; それとも float a[8]; ? 実行結果: 1 1 2 2 1.0 1.5 2.0 2.5 整数クラスは、整数値の割り算、浮動小数点クラスは、小数値の割り算をしている。 = クラスごとに割り算の解釈が異なる。 □□□ 演習2 □□□ 図形クラスとして、長方形クラス Rectangle, 円クラス Circle を追加せよ。初期化メソッドでは、底辺の長さと高さ、半径をそれぞれ与える。そして、面積を返すメソッド menseki を作成せよ。メインルーチンでは、配列変数にそれぞれのインスタンスを格納し、各面積を表示せよ。 メインルーチンの例: objs = Array.new objs << Triangle.new(3,4) objs << Rectangle.new(2,5) objs << Triangle.new(4,4) objs << Circle.new(2) objs << Triangle.new(6,4) 以下、面積の計算と表示 ⇒ prac0302.rb ● サブルーチンの引数に型宣言が無いこと。 サブルーチン arg_hello_world! は、第一引数の s に、「Hello」、第二引数のname、「World!」を格納する機能がある。文字列クラス、配列クラス、出力クラス、には、演算子「<<」があるので、第一引数のクラスに応じて、格納の仕方が自動的に決まる。 ⇒ list0305.rb ○ クラスメソッド ・インスタンスを作らなくても使えるメソッド ・Class宣言の方法 def クラス名.メソッド名 - - - プログラムを書く - - - end ・メインルーチンなどでの呼出し方 クラス::メソッド名 【比較】インスタンスメソッドのとき、 ・Class 宣言の方法 def メソッド名 - - - プログラムを書く - - - end ・メインルーチンなどでの呼出し方 変数 x = クラス名.new まず、インスタンスを作る。 変数 x.メソッド名 ⇒ list0306.rb □□□ 演習3 □□□ Latexクラス、Htmlクラス、Emailクラスの3クラスのそれぞれについて、タイトル、日付、差出人、を標準出力に出力するクラスメソッド print_header を作れ。 たとえば、メインルーチンで、 Latex::print_header('演習レポート','2002.10.16','鳥大太郎') と実行すると、 \begin{center} {\LARGE 演習レポート}\\ 2002.10.16\\ {\large 鳥大太郎} \end{center} と出力する。 同様の呼び出しで、Htmlクラスの場合、つまり Html::print_header('演習レポート','2002.10.16','鳥大太郎') と実行すると、

演習レポート
2002.10.16
鳥大太郎

と出力せよ。 また、Emailクラスの場合、 Subject: 演習レポート Date: 2002.10.16 From: 鳥大太郎 とせよ。 メインルーチンの例: title='演習レポート' date='2002.10.16' name='鳥大太郎' Latex::print_header(title,date,name) Html::print_header(title,date,name) Email::print_header(title,date,name) ⇒ prac0303.rb □□□ 演習4 □□□ 演習3の続き。列挙型箇条書を出力するメソッド print_begin_rekkyo, print_rekkyo, print_end_rekkyo を作れ。 列挙型箇条書とは、 1. ふたを開ける。 2. 熱湯をそそぐ。 3. 3分待つ。 というように、通し番号と箇条書を並べて書く書き方である。 Latex では、 \begin{enumerate} \item ふたを開ける。 \item 熱湯をそそぐ。 \item 3分待つ。 \end{enumerate} と書く。Html では、番号順リストと呼ばれ、
  1. ふたを開ける。
  2. 熱湯をそそぐ。
  3. 3分待つ。
と書く。なお、Email クラスでは、テキストの表示であるので、通し番号を作るプログラムを埋め込む。通し番号は、クラス変数 @@rekkyonum = 0 を Email クラスの内部で使えば良い。 メインルーチンの例: op1 = 'ふたを開ける。' op2 = '熱湯をそそぐ。' op3 = '3分待つ。' Email::print_begin_rekkyo Email::print_rekkyo(op1) Email::print_rekkyo(op2) Email::print_rekkyo(op3) Email::print_end_rekkyo Latex::print_begin_rekkyo Latex::print_rekkyo(op1) Latex::print_rekkyo(op2) Latex::print_rekkyo(op3) Latex::print_end_rekkyo Html::print_begin_rekkyo Html::print_rekkyo(op1) Html::print_rekkyo(op2) Html::print_rekkyo(op3) Html::print_end_rekkyo ⇒ prac0304.rb ちなみに、もっとカッコいいメインルーチン: op1 = 'ふたを開ける。' op2 = '熱湯をそそぐ。' op3 = '3分待つ。' styles = [Email,Latex,Html] styles.each{|s| s::print_begin_rekkyo s::print_rekkyo(op1) s::print_rekkyo(op2) s::print_rekkyo(op3) s::print_end_rekkyo } ⇒ prac0305.rb ■ 宿題 ■ まず演習4を完成させよ。そして、以下のとおり動作させるには、演習4のメインルーチンをどのようにすれば良いか? メインルーチンのプログラムリストを印刷し、各行に手書きでコメントを書き提出せよ。また、3通りの実行結果も提出せよ。 動作の様子について。まず、「select style(...)」と表示し、1から3の数を入力する。もし、2 であれば、Html クラスを使って、以下のように表示する。1および3の場合も、それぞれのクラスの規定する形式で表示する。なお、規定以外の入力は無いものと仮定してよい。 キーボードからの入力は、gets を使う。 ーーー 動作の様子 ーーー select style(1=latex, 2=html, 3=email): 2

カップ麺の作り方
2002.10.16
鳥大太郎

  1. ふたを開ける。
  2. 熱湯をそそぐ。
  3. 3分待つ。
ーーー ここまで ーーー ⇒ work0301.rb