計算機プログラムの構造と解釈[15]

今日は, やり残しの問題を片付けておわり.

2.1.2

問題 2.3


問題は, 4つか.

  1. 平面上における長方形の表現を実装.
  2. その長方形の周囲の長さと面積を計算する手続きの作成.
  3. それができたら異なる表現で実装.
  4. その長方形の周囲の長さと面積を計算する手続きの作成.


まず1個目の表現.
縦と横の長さを引数にとってみる.
かんたん.

(define (make-rectangle x y)
  (cons x y))
(define (width x)
  (car x))
(define (height x)
  (cdr x))

(define (perimeter x)
  (* (+ (width x) (height x)) 2))
(define (area x)
  (* (width x) (height x)))

実行結果.
こんなもんかな.

gosh> (define rect (make-rectangle 4 6))
rect
gosh> (width rect)
4
gosh> (height rect)
6
gosh> (perimeter rect)
20
gosh> (area rect)
24



んで, 2個目は, ・・・うーん, いいや. 飛ばす.
やってて頭がこんがらがってきた.
あんまりよくないなあ.


あっ, できた.
色々問題ありそうだけど.
線分を引数として取るようにしてみた.

(define (make-rectangle seg1 seg2)
  (cons seg1 seg2))
(define (width rect)
  (- (x-point (end-segment (car rect)))
     (x-point (start-segment (car rect)))))
(define (height rect)
  (- (y-point (end-segment (cdr rect)))
     (y-point (start-segment (cdr rect)))))
(define (perimeter rect)
  (* 2 (+ (width rect) (height rect))))
(define (area rect)
  (* (width rect) (height rect)))

実行結果.

gosh> (define a (make-point 1 1))
a
gosh> (define b (make-point 4 1))
b
gosh> (define c (make-point 1 5))
c
gosh> (define w (make-segment a b))
w
gosh> (define h (make-segment a c))
h
gosh> (define rect (make-rectangle w h))
rect
gosh> (width rect)
3
gosh> (height rect)
4
gosh> (perimeter rect)
14
gosh> (area rect)
12

width とか height は, 結果がマイナスにならないように,
最後に abs をかけた方がよかったかも.

更新時刻

  • 1かいめ 2007年, 4月10日, 1:54
  • 2かいめ 2007年, 4月10日, 2:00