計算機プログラムの構造と解釈 第二版 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
多分できてる。