Copyright © 2005 Suradet Jitprapaikulsarn
สงวนลิขสิทธิ์ 2548 สุรเดช จิตประไพกุลศาล

Homework 4 (Due Monday 4 July 2548)

1. Write a data definition of a rectangle. Solution.

;-----------------
; Data Definition
;-----------------
; A rectangle is a structure consisting of
;   - width as number
;   - height as number
;------------------------------------------------------------------------------
(define-struct rectangle (width height))

;--------------
; Data Example
;--------------
(define rect-1 (make-rectangle 4 5))
(define rect-2 (make-rectangle 2 7))
(define rect-3 (make-rectangle 9 6))

;-------------
; Code Pattern
; ------------
;(define (F r)
;  ... (rectangle-width r) ...
;  ... (rectangle-height r) ...
;******************************************************************************

2. Write a function, area,  to calculate the area of  the rectangle.

;------------------------------------------------------------------------------
; @description calculate the area of a rectangle
; @param r a rectangle
; @return the area of the rectangle r
; @contract area: rectangle -> number
; @example (area (make-rectangle 3 7)) = 21
; @example (area rect-1) = 20
; @example (area rect-2) = 14
; @example (area rect-3) = 54
;------------------------------------------------------------------------------
(define (area r)
  (* (rectangle-width r)
     (rectangle-height r)))

;------
; Test
;------
"(area (make-rectangle 3 7)) = " (area (make-rectangle 3 7))
"(area rect-1) = " (area rect-1)
"(area rect-2) = " (area rect-2)
"(area rect-3) = " (area rect-3)

3. Write a function, perimeter,  to calculate the perimeter of the rectangle.

;------------------------------------------------------------------------------
; @description calculate the perimeter of a rectangle
; @param r a rectangle
; @return the perimeter of the rectangle r
; @contract perimeter: rectangle -> number
; @example (perimeter (make-rectangle 3 7)) = 20
; @example (perimeter rect-1) = 18
; @example (perimeter rect-2) = 18
; @example (perimeter rect-3) = 30
;------------------------------------------------------------------------------
(define (perimeter r)
  ( + (* (rectangle-width r) 2)
      (* (rectangle-height r) 2) ) )

;------
; Test
;------
"(perimeter (make-rectangle 3 7)) = " (perimeter (make-rectangle 3 7))
"(perimeter rect-1) = " (perimeter rect-1)
"(perimeter rect-2) = " (perimeter rect-2)
"(perimeter rect-3) = " (perimeter rect-3)

4. Write a function, transpose,  to transpose the rectangle.

;------------------------------------------------------------------------------
; @description perform a transpose of a rectangle
; @param r a rectangle
; @return the transpose of the rectangle r
; @contract transpose: rectangle -> rectangle
; @example (transpose (make-rectangle 3 7)) = (make-rectangle 7 3)
; @example (transpose rect-1) = (make-rectangle 5 4)
; @example (transpose rect-2) = (make-rectangle 7 2)
; @example (transpose rect-3) = (make-rectangle 6 9)
;------------------------------------------------------------------------------
(define (transpose r)
  (make-rectangle (rectangle-height r)
                  (rectangle-width r) ) )

;------
; Test
;------
"(transpose (make-rectangle 3 7)) = " (transpose (make-rectangle 3 7))
"(transpose rect-1) = " (transpose rect-1)
"(transpose rect-2) = " (transpose rect-2)
"(transpose rect-3) = " (transpose rect-3)