2.3

练习 2.3 请实现一种平面矩形的表示(提示:你有可能借用练习2.2的结果)。基于你的构造函数和选择函数定义几个过程,计算给定矩形的周长和面积等。现在请再为矩形实现另一种表示方式。你应该怎样设计系统,使之能提供适当的抽象屏障,使同一个周长或者面积过程对两种不同表示都能工作?

这里只给出了简化的两种方式,只支持边与坐标轴平等的矩形

第一种方式

通过定义左上角、右下角两个点,来确定一个矩形。

 
(define (make-point x y) (cons x y))
(define (x-point p) (car p))
(define (y-point p) (cdr p))
 
(define (make-segment start end)
    (cons start end)
)
(define (start-segment segment) (car segment))
(define (end-segment segment) (cdr segment))
 
(define (print-point p)
    (newline)
    (display "(")
    (display (x-point p))
    (display ", ")
    (display (y-point p))
    (display ")"))
 
(define (print-segment segment)
    (newline)
    (print-point (start-segment segment))
    (display " ---- ")
    (print-point (end-segment segment))
)
 
(define (rect left-top-point right-bottom-point) (cons left-top-point right-bottom-point))
 
(define (print-rect rect)
    (newline)
    (display "Rectange: ")
    (print-segment rect)
)
 
(define r (rect (make-point 0 0) (make-point 5 10)))
(print-rect r)
 
(define left-top-point car)
(define right-bottom-point cdr)
 
(print-point (left-top-point r))
(print-point (right-bottom-point r))
 
(define (length rectangle) (abs (- (x-point (left-top-point rectangle)) (x-point (right-bottom-point rectangle)))))
 
(newline)
(display "length of the rectangle is ")
(display (length r))
 
(define (width rectangle) (abs (- (y-point (left-top-point rectangle)) (y-point (right-bottom-point rectangle)))))
 
 
(newline)
(display "width of the rectangle is ")
(display (width r))
 
(define (area rectangle) (* (length rectangle) (width rectangle)))
 
(newline)
(display "area of the rectangle is ")
(display (area r))

Rectange:

(0, 0) ----
(5, 10)
(0, 0)
(5, 10)
length of the rectangle is 5
width of the rectangle is 10
area of the rectangle is 50

第二种方式

通过定义一个底边线段,再加上一个高度值,来确定一个矩形:

 
 
(define (print-point p)
    (newline)
    (display "(")
    (display (x-point p))
    (display ", ")
    (display (y-point p))
    (display ")"))
 
(define (print-segment segment)
    (newline)
    (print-point (start-segment segment))
    (display " ---- ")
    (print-point (end-segment segment))
)
 
(define (make-point x y) (cons x y))
(define (x-point p) (car p))
(define (y-point p) (cdr p))
 
(define (make-segment start end)
    (cons start end)
)
(define (start-segment segment) (car segment))
(define (end-segment segment) (cdr segment))
 
 
(define (rect2 bottom-segment height) (cons bottom-segment height))
(define r (rect2 (make-segment (make-point 5 10) (make-point 10 10)) 8))
 
(define (print-rect2 r)
    (newline)
    (print-segment (car r))
    (display "*")
    (display (cdr r))
)
 
(display "The rectangle is ")
(print-rect2 r)
 
(define side car)
(newline)
(display "The side of the rectangle is ")
(print-segment (side r))
 
(define (length r) (abs (- (x-point (start-segment (side r))) (x-point (end-segment (side r))))))
 
(newline)
(display "The length of the rectangle is ")
(display (length r))
 
(define width cdr)
 
(define (area r) (* (length r) (width r)))
 
(newline)
(display "The area of the rectangle is ")
(display (area r))

这里的抽象屏障即是 length 和 width 过程,它屏蔽了具体的矩形的表示,从而对于上层的 area 过程来说,只需要调用 length 和 width 过程即可。无论具体的矩形表示是怎样的,在两种情况下,area = length * width。

results matching ""

    No results matching ""