2.0 KiB
2.0 KiB
Zapiski in vaje #6 srečanja programerskega bralnega krožka SICP
Teme
Grajenje abstrakcij s podatki
Prvo poglavje, v katerem smo operirali s preprostimi števili, drugo poglavje nadgrajuje s podatkovnimi struktura oz. kombiniranjem podatkovnih objektov v sestavljene podatkovne modele.
Torej ustvarili bomo podatkovne abstrakcije in definirali funkcije ki lahko operirajo nad njimi. Preprost primer je recimo racionalno število, ki ga sestavlja par števca in imenovalca.
(define (ustvari-rac s i)
(cons s i))
(define (stevec x) (car x))
(define (imenovalec x) (cdr x))
(define (izpisi-rac x)
(newline)
(display (stevec x))
(display "/")
(display (imenovalec x)))
(define polovica (ustvari-rac 1 2))
(izpisi-rac polovica)
(izpisi-rac (ustvari-rac 6 3))
Uporabimo funkcijo za najvecji skupni imenovlec, da poenostavimo recimo 6/3 v 2/1.
(define (gcd a b)
(if (= b 0)
a
(gcd b (remainder a b))))
(define (ustvari-rac s i)
(let ((g (gcd s i)))
(cons (/ s g) (/ i g))))
(izpisi-rac (ustvari-rac 6 3))
vaje
2.1 bolji ustvari-rac
(define (ustvari-rac s i)
(cons
(if (< i 0)
(* -1 s)
s)
(abs i)))
2.2 polovica daljice
(define make-point cons)
(define x-point car)
(define y-point cdr)
(define make-segment cons)
(define (print-point p)
(newline)
(display "(")
(display (x-point p))
(display ",")
(display (y-point p))
(display ")"))
(define (avg a b) (/ (+ a b) 2))
(define start-segment car)
(define end-segment cdr)
(define (midpoint-segment s)
(let ((start (start-segment s))
(end (end-segment s)))
(make-point (avg (x-point start) (x-point end))
(avg (y-point start) (y-point end)))))
3.3 obseg in ploscina kvadra