Teknillinen korkeakoulu Tik-76. 1 01 Ohjelmoinnin pitkä peruskurssi

Tietojenkäsittelyopin laboratorio Tentti 17.08.1995

Peltonen, Saikkonen, Syrjänen, Tiusanen 1

Merkitse jokaisen vastauspaperisi vasempaan yläreunaan selvästi allekkain:

* Tik-76.101 Ohjelmoinnin pitkä peruskurssi

* tentti 17.08.1995

* sukunimi, etunimet

* koulutusohjelma, opintokidan numero

1 . Tutkitaan kahden kokonaislukuargumentin, x:n ja y:n kokonaislukuarvoisia funktioita, jotka kasvavat aidon monotonisesti x:n suhteen, kun y säilyy vakiona ja vähenevät aidon monotonisesti y:n suhteen, kun x säilyy vakiona. Ohjelmoi yleinen proseduuri "level", joka annetulle funktiolle f laskee neliömäiseltä alueelta 0..N, 0..N, niiden kokonaislukupisteiden lukumäärän, joilla f saa annetun kokonaislukuarvon v. Tehtävä tulee ratkaista vain proseduuri-abstraktiota käyttäen. Ratkaisusi tulisi olla vaativuudeltaan 0(N).

2 . Oletetaan, että eräitä geometrisia olioita esitetään Lisp-olioina, joilla on

tarkoituksenmukaiset ominaisuudet. Esim.

Olio Ominaisuus Arvo

y tyyppi ympyra

sade 4

N tyyppi nelio

sivu(npituus) 2

K tyyppi kolmio

kanta 3

korkeus 2

Määrittele kullekin ym. tyypille (ympyra, nelio, kolmio) konstruktori ja tarvittavat

selektorit sekä geneerinen funktion pinta-ala, joka sovellettuna olioon, joka on

jotain yo. tyypeistä (esim. Y, K tai N), palauttaa ko. olion pinta-alan. Voit olettaa, että

tarvitsemasi apuproseduurit (attach-type, type, contents, ... ) ovat käytettävissä.

3 . Kirjoita proseduuri

(make-moving-average n)

joka palauttaa olion, joka laskee liukuvaa keskiarvoa. Oliolle on käytettävissä seuraavat toiminnot:

reset

Nollaa olion tilan. Palauttaa arvon NIL.

add <luku>

Lisää uuden luvun liukuvaan keskiarvoon. Palauttaa sarnan kuin "average" (ks. alla). average

Palauttaa keskiarvon viimeisistä n:stä luvusta (n proseduurin "make-moving-average" parametri), jotka on lisätty add-proseduurilla. Jos yhtään lukua ei ole lisätty, palauttaa NIL. Jos on lisätty alle n lukua, palauttaa niiden keskiarvon.

Esimerkki:

(define x (make-moving-average )))

(x 'average)

--> NIL

((x 'add) 1 0)

--> 10

(x 'average)

--> 10

(( x 'add) 12)

-->11 ;(10+12)/2

(x 'add) 5)

--> 9 ; (10+12+5)13

(x 'add) 1)

--> 6 ; (12+5+1)13

(x 'add) 15)

--> 7 ; (5+1+15)13

(x 'reset)

-->NIL

((x 'add) 7)

-->7

4 . (a) Piirrä selkeä kuva siitä, mikä on tutkittujen proseduurien ympäristöjen muodostama rakenne lausekkeen (sum 3) suorituksen jälkeen kirjassa annetussa Schemen metasirkulaarisessa evaluaattorissa, kun sum on määritelty evaluaattorille lausekkeilla

(define (sum-aux i result)

(cond ((= 0 i) result)

(else (sum-aux (- i 1) (+ result 1)))))

(define (sum n) (sum-aux n 0))

Selitä kuvaasi! (Oleta, että roskan kerääjä ei ole ollut aktiivinen.) (4p)

(b) Anna perusteita dynaamisen sidonnan käytöstä (vastakohtana staattiselle), puolesta

ja vastaan. (2p)

5. Anna ja perustele lyhyesti (ei-rekursiivinen) rekisterikonetoteutus seuraavalle funktiolle

(sivu 98 kirjassa): (Sp)

(define (countatoms x)

(cond ((null? x) 0)

((atom? x) 1)

(else (+ (countatoms (car x))

(countatoms (cdr x))))))