計算機プログラムの構造と解釈 第二版 P49 問題2.3

この問題は面倒くさくて2回解いた。
ちゃんと問題を読んでおけば良かった。


題意はこんな感じ。

  • 長方形の表現 rectangle を実装する。

で、それなんだが、2種類のrectangleを考えなきゃならない。
さらに、

  • 「長方形の周囲の長さ」を計算する手続き: perimeter
  • 「面積」を計算する手続き: area

も作る。
またこのperimeter、area手続きは、2種類のrectangle、どちらをパラメータとして入力しても、
通用するようにしないといけない。


ということで、rectangleの中でいろいろ操作が必要というわけだ。


まず、長方形をどういう風に表現できるか考える。


長方形は4つ辺があって、2つの辺の長さが決まれば、「面積」も、「周囲の長さ」も決まる。
長方形は4つの頂点があって、対角の2つの点が決まれば、「面積」も、「周囲の長さ」も決まる。


ぃよし。表現はきまった。


実装。

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

(define (make-point x y)
  (cons x y)) 


(define (x-point x)
  (car x)) 


(define (y-point y)
  (cdr y)) 



;;2本の線の長さを取得して長方形を表現する型
;;整数を
;;2つパラメータとして持つ
(define (make-rectangle1 x y)
  (cons x y))


;;対角の2点を指定して長方形を表現する型
;;make-pointの返り値を
;;2つパラメータとして持つ
(define (make-rectangle2 p1 p2)
  (cons (abs (- (x-point p1) (x-point p2)))
        (abs (- (y-point p1) (y-point p2)))))



;;rectangleの返り値をパラメータとして持つ。
(define (perimeter r)
  (* 2
     (+ (car r) (cdr r))))

;;rectangleの返り値をparamaterとして持つ。
(define (area r)
  (* (car r) (cdr r)))



;; main
(define (main args)

  (display "2の線の長さをとり、長方形を定義する場合。")(newline)
  (display "長さ2と長さ6の ")(newline)
  (display "長方形の周囲の長さは?")(newline)
  (display
    (perimeter
      (make-rectangle1 2 6)))
  (newline)


  (display "2の線の長さをとり、長方形を定義する場合。")(newline)
  (display "長さ2と長さ6の ")(newline)
  (display "長方形の面積は?")(newline)
  (display
    (area
      (make-rectangle1 2 6)))
  (newline)
  (newline)

  (display "2点をとり、長方形を定義する場合。")(newline)
  (display "始点(x=1, y=7) ")(newline)
  (display "終点(x=3, y=1) の周囲の長さは?")(newline)
  (display
    (perimeter
      (make-rectangle2
        (make-point 1 7)
        (make-point 3 1))))
  (newline)

  (display "始点(x=1, y=7) ")(newline)
  (display "終点(x=3, y=1) の面積は?")(newline)
  (display
    (area
      (make-rectangle2
        (make-point 1 7)
        (make-point 3 1))))
  (newline)
0)


実行

2の線の長さをとり、長方形を定義する場合。
長さ2と長さ6の 
長方形の周囲の長さは?
16
2の線の長さをとり、長方形を定義する場合。
長さ2と長さ6の 
長方形の面積は?
12

2点をとり、長方形を定義する場合。
始点(x=1, y=7) 
終点(x=3, y=1) の周囲の長さは?
16
始点(x=1, y=7) 
終点(x=3, y=1) の面積は?
12

多分できてる。