レコード class Point attr_accessor("x", "y") インスタンス変数の宣言 point.rb

Similar documents
レコード class Point attr_accessor("x", "y") インスタンス変数の宣言 point.rb

レコードとオブジェクト

レコードとオブジェクト

オブジェクト指向

GEC-Java

プログラミング入門1

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Javaプログラムの実行手順

Microsoft PowerPoint ppt

Microsoft PowerPoint - ruby_instruction.ppt

PowerPoint プレゼンテーション

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 関数とメソッド 関数とメソッド Python には関数 (function) とメソッド (method) が有る モジュール内に def で定義されて居る物が関数 クラス内に def で定義されて居る物がメソッドに成る ( 正確にはクラスが

プログラミング基礎I(再)

PowerPoint プレゼンテーション

pp2018-pp9base

のようにする 上の例では GeneralPath を new するときに コンストラクタに何も指定していないが 直線を表す Line, 四角形を表す Rectangle などを引数に与えてもよい 矢印を作成するメソッドの引数矢印を表す GeneralPath を生成するために getarrowpat

PowerPoint プレゼンテーション

Microsoft PowerPoint - lec06 [互換モード]

Microsoft PowerPoint - prog03.ppt

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

PowerPoint プレゼンテーション

JAVA入門

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

基本情報STEP UP演習Java対策

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

Prog2_9th

02: 変数と標準入出力

Processingをはじめよう

Microsoft PowerPoint - 12.ppt [互換モード]

Microsoft PowerPoint - 12.ppt [互換モード]

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

02: 変数と標準入出力

Prog2_12th

Microsoft PowerPoint ppt

Microsoft PowerPoint - 13.ppt [互換モード]

PowerPoint プレゼンテーション

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

vecrot

pp2018-pp4base

プログラミング入門1

問 1 図 1 の図形を作るプログラムを作成せよ 但し ウィンドウの大きさは と し 座標の関係は図 2 に示すものとする 図 1 作成する図形 原点 (0,0) (280,0) (80,0) (180,0) (260,0) (380,0) (0,160) 図 2 座標関係 問 2

線形代数とは

進捗状況の確認 1. gj も gjp も動いた 2. gj は動いた 3. gj も動かない 2

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

Microsoft PowerPoint - prog04.ppt

11yama

グラフィックトレーニング 概要.NET のグラフィック描画は どんなことができるのでしょうか? グラフィックオブジェクトやグラフィック環境 概念を理解するためには クラスを使って馴れることが近道です 本 書に記載されているコードをカットアンドペーストして 一つ一つの機能を体験してください 前提 グラ

第二回独習 Java ゼミ 第二章クラスとメソッド 2.1 メソッドの構造 2.2 静的メソッドと静的変数の概要 2.3 インスタンスメソッドとインスタンス変数の概要 2.4 Integerクラス 2006/04/19 神津健太

DVIOUT-exer

program7app.ppt

アスペクトの相互作用を解消するアスペクトの提案

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

教材ドットコムオリジナル教材 0から始めるiアフ リ リファレンス i アプリ簡易リファレンス ver i アプリ Java 独自のメソッド (1)iアプリの命令を使えるようにする import com.nttdocomo.ui.*; (2) 乱数を使う import java.u

Prog1_6th

Microsoft Word - 3new.doc

Microsoft PowerPoint - chap10_OOP.ppt

GEC-Java

Microsoft PowerPoint - handout07.ppt [互換モード]

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

Java言語 第1回

CG

C 資料 電脳梁山泊烏賊塾 構造体 C++ の構造体 初めに 此処では Visual Studio 2017 を起動し 新しいプロジェクトで Visual C++ の Windows デスクトップを選択し Windows コンソールアプリケーションを作成する 定義と変数宣言 C++ に

JavaプログラミングⅠ

Microsoft PowerPoint - diip ppt

2004/11/23 オブジェクト指向プログラミング - モデル図とシーケンス図の表現方法 - オブジェクト指向プログラミング (OOP:ObjectOrientedPrograming) オブジェクト指向プログラミング言語 (OOPL) Java,C++,Delphi(Pascal),Visual

情報実習Ⅱ

演習2

Microsoft PowerPoint - Ruby n

Microsoft Word - 92.doc

Microsoft PowerPoint - HITobject.ppt

cp-7. 配列

Microsoft PowerPoint - 09-object

Microsoft PowerPoint ppt

Java講座

プログラミング入門1

デザイン戦略(コンピュータアニメーション) 2009年度春学期

Microsoft PowerPoint - 11RubyIntro-No02.ppt [互換モード]

PowerPoint プレゼンテーション

JEB Plugin 開発チュートリアル 第4回

PowerPoint プレゼンテーション

Graphical User Interface 描画する

Prog1_15th

科学的モデリング 2 回 継承 2 無断転載 & 無断配布を禁じます 第 2 回 : 科学的モデリング 継承 2 継承される特性( プロパティ ) 第 2 回の話題 継承は何を継承するのか? 今回のコラムの話題は 継承される特性 ( プロパティ ) についてです そもそもサブクラスはスーパークラスか

Microsoft Word - C言語研修 C++編 3.doc

<4D F736F F F696E74202D AC C8899E D834F E >

PowerPoint プレゼンテーション

プログラミング入門1

GEC-Java

Microsoft Word - no11.docx

Microsoft PowerPoint - [150428] CMP実習Ⅰ(2015) 橋本 CG編 第2回 ベジエ曲線とフラクタル.pptx

講習No.10

Microsoft PowerPoint - prog08.ppt

スライド 1

10K

JavaScript 演習 2 1

Ruby演習テキスト1

PowerPoint プレゼンテーション

10/31 Java AWTの基本構造(Frameクラスの継承) 演習課題資料

// ステージを設定します stage.setscene(scene); stage.settitle(" キャンバス "); // ステージを表示します stage.show(); public static void main(string[] args) launch(args); キャンバス

Transcription:

レコードとオブジェクト

レコード class Point attr_accessor("x", "y") インスタンス変数の宣言 point.rb

irb(main):004:0> load ("point.rb") => true irb(main):005:0> p = Point.new() => #<Point:0x40332080> irb(main):006:0> p.x = 3 => 3 irb(main):007:0> p.y = 4 => 7 irb(main):008:0> p => #<Point:0 x40332080 @y=4, @x=3> オブジェクト (Point クラスのインスタンス ) インスタンス変数への代入

irb(main):013:0> p.y => 4 インスタンス変数の参照 irb(main):014:0> sqrt(p.x**2 + p.y**2) => 5.0 ( もちろん include(math) が必要 ) 実は Ruby では, レコードもオブジェクトの一種 ( オブジェクトについては後で説明する )

def point_make(u,v) p = Point.new() p.x = u p.y = v p レコード / オブジェクト ( への参照 ) を返す point.rb

def point_scale(p,s) point_make(p.x*s, p.y*s) 点の座標値のスカラ倍 def point_add(p,q) point_make(p.x+q.x, p.y+q.y) 点の座標値の加算 point.rb

def point_interpolate(p,q,t) point_add(point_scale(p,1-t), point_scale(q,t)) def point_draw(p,a) if 0 <= p.y+0.5 && p.y+0.5 < a.length() && 0 <= p.x+0.5 && p.x+0.5 < a[0].length() a[p.y+0.5][p.x+0.5]=1 Ruby の配列の添え字が実数でもいいことを利用している 配列 a の縦の長さ 配列 a の横の長さ 0.5 は四捨五入をするため point.rb

load("./max.rb") load("./abs.rb") def line_draw(p0,p1,a) 2 点間の差分ベクトルの x,y の大きい数 n=max(abs(p1.x - p0.x), abs(p1.y - p0.y)) for i in 0..n point_draw(point_interpolate(p0,p1,i*1.0/n), a) line.rb

def bezier_draw(p0,c,p1,a) n = 10 prev = p0 for i in 1..n t = i*1.0/n q0 = point_interpolate(p0, c, t) q1 = point_interpolate(c, p1, t) r = point_interpolate(q0, q1, t) line_draw(prev, r, a) prev = r 曲線を n 等分する prev から r まで線分を描く bezier.rb

練習 授業の Web ページから point.rb,line.rb, bezier.rb, kana.rb をダウンロードして 練習 8.1 a) の図形 kana() を描画してみなさい (abs.rb, max.rb, make1d.rb, make2d.rb などは すでに作成したものである )

進捗状況の確認 1. kana() が表示できた ( できた時点で投票してください ) できた人は 教科書 168 ページの練習 8.2 に挑戦してみてください

Line や Bezier もレコードにできる class Line attr_accessor("p0", "p1") class Bezier attr_accessor("p0", "c", "p1")

load("./max.rb") load("./abs.rb") def line_draw(l, a) 2 点間の差分ベクトルの x,y の大きい数 n=max(abs(l.p1.x l.p0.x), abs(l.p1.y l.p0.y)) for i in 0..n point_draw(point_interpolate(l.p0,l.p1,i*1.0/n), a) line.rb

レコードの意義 一まとまりの複数のデータを表す変数が 1 個ですむ Point の場合,x 座標と y 座標をまとめて扱える Line の場合, 始点と終点をまとめて扱える 4 つの座標をまとめて扱えている Bezier の場合, 始点と終点, 第 3 点をまとめて扱える 6 つの座標をまとめて扱えている このようなデータのまとまりを値として扱える 関数の値として返すことができる 4 つの座標を一度に返すことは通常の関数では難しい

しかし, レコードのままだと クラス ( レコードの種類 ) ごとに操作を定義 Pointクラス Lineクラス Bezierクラス point_draw line_draw bezier_draw これらが混在している場合, if figure が Point クラスのオブジェクト point_draw(figure,a) else if figure が Line クラスのオブジェクト line_draw(figure,a) else if figure が Bezier クラスのオブジェクト bezier_draw(figure,a)

オブジェクト指向では オブジェクト ( ここではレコードのこと ) に自分に対する操作の仕方を覚えさせる Point のレコードに, スカラー倍, ベクトル和などの操作を覚えさせる クラス定義の中で操作法 ( メソッド ) を定義する カプセル化 (encapsulation) 継承 (inheritance) 多相性 (polymorphism)

class Point attr_accessor("x", "y") def initialize(u,v) self.x = u self.y = v 自分自身の x @x でもよい 初期化メソッド クラス def scale(s) Point.new(self.x * s, self.y * s) def add(q) Point.new(self.x + q.x, self.y + q.y) scale メソッド 自分の操作法をクラス定義の一部としメソッドと呼ぶ カプセル化 oo- point.rb

irb(main):005:0> p = Point.new(3,4) => #<Point:0x7ffa3ed8 @x=3, @y=4> irb(main):006:0> p.x => 3 irb(main):007:0> q = p.scale(2) => #<Point:0x7ffa3e84 @x=6, @y=8> irb(main):008:0> p.add(q) => #<Point:0x7ff9b0f8 @x=9, @y=12> irb(main):009:0> p.add(q).scale(0.5) 初期化メソッドの引数 新しいオブジェクト 新しいオブジェクト => #<Point:0x7ff94ca8 @x=4.5, @y=6.0> 新しいオブジェクト

練習 授業のページから oo-point.rb をダウンロードして 練習 8.5 b), c) を追加したら line_draw.rb で直線を描画してみなさい 進捗状況の確認 1. 直線が描画できた時点で投票してください その後 練習 8.5 a), d) も定義してください

isrb(main):001:0> load("line_draw.rb") true isrb(main):002:0> load("make2d.rb") true isrb(main):003:0> a=make2d(200,200) : ( 省略 ) isrb(main):004:0> show(a) : ( 省略 ) isrb(main):005:0> line_draw(point.new(50,50),point.new(100,170),a) 0..120 isrb(main):006:0> line_draw(point.new(40,150),point.new(180,70),a) 0..140

進捗状況の確認 1. 直線が描画できた時点で投票してください 2. drawメソッドはできた 3. interpolateメソッドはできた 4. どちらもできていない

( 抽象的な ) クラス Figure load("oo-point.rb") load("line_draw.rb") class Figure def draw(a) pnts = self.points() for i in 0..(pnts.length()-2) line_draw(pnts[i], pnts[i+1], a) draw メソッドの定義 Figure の種類によらず points メソッドで点列が得られる カプセル化 多相性 oo- figure.rb

load("oo-figure.rb") class Line < Figure attr_accessor("p0", "p1") Figure オブジェクトの継承 draw メソッドを使える 継承 def initialize(q,r) self.p0 = q self.p1 = r def points() [self.p0, self.p1] points メソッドは両端点を返す カプセル化 oo- line.rb

load("oo-line.rb") class Bezier < Line attr_accessor("p0", "c", "p1") def initialize(q,r,s) super(q,s) self.c = r def points() n = 16 pnts = Array.new(n+1) pnts[0] = self.p0 pnts[n] = self.p1 for i in 1..(n-1) t = i*1.0/n q0 = self.p0.interpolate(c, t) q1 = self.c. interpolate(p1, t) pnts[i] = q0.interpolate(q1, t) pnts Line オブジェクトの継承 draw メソッド (ini@alize メソッド ) Line クラスの ini@alize メソッドを呼び出す points メソッドは t=0 1 の点列 (16+1 個 ) カプセル化 最初と最後の点は self.p0 と self.p1 線形補間を 2 段階して曲線上の点を求める 点列を返す oo- line.rb

練習 授業のページから oo-figure.rb, oo-line.rb, oo-bezier.rb, drawall.rb をダウンロードして drawline() と drawground() を実行してみなさい 進捗状況の確認 1. drawground() ができたら投票してください その後は oo-circle.rb を完成させて drawmoon() を実行してください ただし 練習 8.5 d) の rotate メソッドが必要です

カプセル化, 継承, 多相性 カプセル化 もの を表すデータとメソッドをまとめ, 決められたインスタンスメソッドを通してのみインスタンス変数にアクセスをさせ, インスタンス変数に直接触らせないこと 継承 他のクラスのインスタンス変数やメソッドを受け継いで新しいクラスを作ること新しいクラスをサブクラス, 元のクラスをスーパークラスと呼ぶ 多相性 同じ名前のインスタンスメソッドを呼び出しても, 適用されたオブジェクトによって異なるメソッドを呼び出すこと実行時にメソッドを探す動的結合で実現する