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))

第二种方式

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

(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 ""