構造(structure) データとデータの操作法をひとまとまりにしたも の オブジェクト指向プログラムで使うオブジェクトの 簡単なものである 構造を用いるプログラム例 グラフィックスの基本プログラムを作る 点をピクセルとよぶ ピクセルはx座標とy座標からなる ピクセルはstructureで定義されている ピクセルを表すstructureをposnと定義する グラフィックスの例 (require htdp/draw) (start 500 500) (draw-circle (make-posn 100 100) 50 'black) (sleep-for-a-while 1) (draw-solid-disk (make-posn 100 100) 50 'red) (sleep-for-a-while 1) (clear-solid-disk (make-posn 100 100) 50 'red) (draw-circle (make-posn 100 100) 50 'black) ;(sleep-for-a-while 1) (draw-solid-disk (make-posn 100 210) 50 'green) (sleep-for-a-while 1) (clear-solid-disk (make-posn 100 210) 50 'green) (draw-circle (make-posn 100 210) 50 'black) (draw-solid-disk (make-posn 100 100) 50 'red) ;; (stop) make-posn make-posnでピクセルを作る (make-posn a b)で x座標がa y座標がb のピクセルを作る 構造posnが定義されたときに, posnのフィールドをアクセスする関数 posn-x, posn-y, 構造かどうかを検査する関数posn? が同時に定義される 構造posnにアクセスする関数 (posn-x p)はピクセルpのx座標を返す (posn-y p)はピクセルpのy座標を返す (posn? obj)はobjがピクセルの時,true,さもな ければ,falseを返す ピクセルと原点の距離を求める (define (distance-to-0 apixel) (sqrt (+ (square (posn-x apixel)) (square (posn-y apixel))))) 構造の定義:posnの例 (define-struct posn (x y)) posnは構造(structure)の名前,x, yはフィール ドの名前 make-posn structure posn を作成 posn-x x座標を選択 posn-y y座標を選択 posn? posn構造を判定する distance-to-0の見直し (define (distance-to-0 apixel) (cond [(number? apixel) ] [(posn? apixel) ] )) distance-to-0の見直し(続き) (define (distance-to-0 obj) (cond [(number? obj) obj] [(posn? obj) (sqrt (+ (square (posn-x obj)) (square (posn-y obj)))) )) studentという構造を定義する studentは次の3つのフィールドからなる構造と する first 名 last 姓 teacher 姓 (define-struct student (first last teacher)) studentという構造を作る (define x (make-student 'Taro 'Suzuki 'Saito)) (define y (make-student 'Jiro 'Yamada 'Tanaka)) (student-teacher x) (student-last y) 構造を用いてプログラムをわかりやすく する 次のプログラムは時:分を時間に変換するプロ グラムであった (define min-in-hour 60) (define (h:m-to-h hour min) (+ hour (/ min min-in-hour))) mytimeというstructureを定義することにより,こ のプログラムをよりわかりやすくすることができ る 構造 timeを用いる (define-struct mytime (hour minute)) (define (time->minutes atime) (+ (* (mytime-hour atime) 60) (mytime-minute atime) )) (define (minutes->time min) (make-mytime (quotient min 60) (remainder min 60))) 構造 timeを用いる (続き) (define (time-diff time1 time2) (minutes->time (- (time->minutes time1) (time->minutes time2)))) (define t1 (make-mytime 3 20)) (define t2 (make-mytime 0 40)) (time-diff t1 t2) 様々なデータが混在したプログラム データを判別する関数が必要 number? boolean? symbol? pというstructureに対して p? p は(define-struct p (… ))で定義された構造 struct? という構造自体を判別する関数もあるが,これは使わな いでください(言語レベルで仕様が異なるため) データの種類の判別の例 (number? (make-posn 2 3)) (number? (+ 12 10)) (posn? 23) (posn? (make-posn 23 3))
© Copyright 2024 ExpyDoc