AID-nummer: Datum: 2011-01-11 1 Tekniska högskolan vid Linköpings universitet Institutionen för datavetenskap Anders Haraldsson TDDC74 Programmering, abstraktion och modellering Tentamen Tisdag 11 januari 2011 kl 14-18 Uppgifterna löses direkt på denna uppgiftslapp, som lämnas in i sedvanligt tentamensomslag. Skriv tydligt så att inte dina lösningar missförstås. Använd väl valda namn på parametrar etc. Du får gärna använda extra blad om du behöver mer utrymme för svaren. Även om det i uppgiften står att du skall skriva en funktion, så får du gärna skriva ytterligare hjälpfunktioner, som kan vara nödvändiga. På uppgifterna kan halva poäng utdelas. Totalt kan 24p erhållas. Betygsgradering: 12-16,5 betyg 3 17-20,5 betyg 4 21-24 betyg 5 Lycka till Observera: För studenter som gått kursen före vt 2010. Från och med PRAM-kursen vt 2010 har en ny standard för Scheme använts. Enda skillnaderna är att när man gör pekarändringar i cons-celler måste dessa ha skapats med mcons, och delarna tas ut med mcar och mcdr, samt att ändringar görs med set-mcar! resp set-mcdr!. Vi tillåter i denna tenta även den gamla konventionen där ni bara använder cons, car, cdr, set-car! samt set-cdr!. Man kallar dessa ändringsbara cons-celler för muterbara, därav m et i namnet. De nya namnen används i första hand i uppgift 2.
AID-nummer: Datum: 2011-01-11 2 Uppgift 1. Beräkning av uttryck (2 poäng) Vi ger följande uttryck för beräkning. Vilket värde skrivs ut eller om det blir fel, beskriv typen av fel. > (define x (cons 1 (+ 2 3)))) > x = > (quote x) = > (x) = > (define y (list x x (- 6 3))) > y = > (define z (lambda (x) (+ (car x) (cdr (car y))))) > z = > (z (car y)) = > (define f list) > (define (h g k) (g g k)) > (h f 10) = > (h h 10) = Poäng: 0-1 rätt 0p 2-3 rätt 0,5p 4-5 rätt 1,0p 6-7 rätt 1,5p 8 rätt 2,0p
AID-nummer: Datum: 2011-01-11 3 Uppgift 2. Listor, cons-celler och pekare (3 poäng) 2a. (1p) Vad blir värdet i parentesformat av följande uttryck. Rita även upp värdet med den grafiska representationen med cons-celler och pekare (box and pointer notation). > (define test (list (cons 1 (2)) (list 3 4))) > test = 2b. (1p) Skriv Scheme-uttryck som skapar följande struktur. Vilket värde skrivs ut i parentesformat? p () a b () 2c. (1p) Utgående från strukturen i 2b. Vad blir värdet av p och q efter att följande uttryck har beräknats. > (define q (mcar p)) > (set-mcar! (mcdr q) x) > p = > q = > (set-mcdr! q (mcdr p)) > p = > q = Visa nedan hur strukturen ser ut efter ändringarna. Rita pilar och lägg in värden. p q e 1
AID-nummer: Datum: 2011-01-11 4 Uppgift 3. Rekursiva funktioner med tal (5 poäng) Skriv två rekursiva funktioner (kapital startkapital antal-år ränte-sats), som dels gör en rekursiv processlösning och dels en iterativ (linear) processlösning, som beräknar hur kapitalet ökar med ränta på ränta efter ett antal år, givet startkapital i kronor, antal år (>= 0) och räntesats (i procent). Startkapitalet 1000:- efter 2 år med 10% ränta. Efter 1 år är det 1100:-. Efter två år 1210:- > (kapital 1000 2 10) = 1210 Funktionen får ej definieras så att man med ett enda uttryck direkt beräknar kapitalet, utan skall ske steg för steg med en rekursiv modell. (1p) Beskriv först vad som är skillnaden mellan en rekursiv resp. iterativ processlösning. (2p) Rekursiv processlösning: (define (kapital-rec kap år ränta) (2p) Iterativ processlösning (define (kapital-iter kap år ränta)
AID-nummer: Datum: 2011-01-11 5 Uppgift 4. Rekursiva och högre ordningens procedurer på sekvenser (7 poäng) 4a.(2p) Skriv en rekursiv funktion (stigande-ordning? lista), som tar en lista med tal och undersöker om dessa kommer i stigande ordning, dvs minsta talet först. Listan innehåller minst ett element. > (stigande-ordning? (1 3 6 9)) = #t > (stigande-ordning? (3)) = #t > (stigande-ordning? (2 3 6 4 5)) = #f ; 6 och 4 kommer i fel ordning. (define (stigande-ordning? lista) 4b. (1,5 p) Skriv en högre ordningens funktion ordning?, som tar en lista och en ordningsfunktion, som skall ange önskad sorteringsordningen mellan elementen. Ordningsfunktionen tar två värden, som skall jämföras. Om första parameterns värde skall komma före den andra parameterns värde returnerar ordningsfunktionen #t, annars ett #f. Med ordningsfunktionen < sorterar man i stigande ordning, dvs ett mindre tal kommer före ett större. > (ordning? (2 4 7) <) = #t ; elementen kommer i stigande ordning > (ordning? (10 8 2 5) >) = #f ; elementen kommer ej strikt i fallande ordning (define (ordning? lista ord-fn) Ge ett uttryck för??? så att vi kan undersöka om sista siffran i en lista med tal kommer i stigande ordning. Definiera lämpligen en funktion sista-siffran. > (ordning? (14 4327 238 9)???)) = #t ; dvs sista siffran i varje tal kommer i stigande ordning??? =
AID-nummer: Datum: 2011-01-11 6 Uppgift 4. Rekursiva och högre ordningens procedurer på sekvenser, forts 4c. (1,5 p) Vi önskar en funktion skapa-ordningsfunktion, så att man med hjälp av ordning? från uppgift 4b, kan skapa en specialiserad ordningsfunktion, t ex > (define stigande? (skapa-ordningsfunktion <)) > (stigande? (2 4 6)) = #t (define (skapa-ordningsfunktion ord-fn) Med hjälp av ovanstående funktion definiera en funktion längd-fallande?, som undersöker om dellistorna i en lista kommer i fallande längd. > (längd-fallande? ((1 2 3 4 5) (a b c d) (x y) ())) = #t (define längd-fallande?
AID-nummer: Datum: 2011-01-11 7 Uppgift 4. Rekursiva och högre ordningens procedurer på sekvenser, forts 4d. (2p) Skriv en funktion (ta-bort-tal lista) som tar bort alla talen i en godtycklig lista, dvs elementen i listan kan i sin tur vara listor. Inga punkterade par ingår. > (ta-bort-tal ((1) 2 a (b (3 c) 4) d 5)) = (() a (b (c)) d) (define (ta-bort-tal lista)
AID-nummer: Datum: 2011-01-11 8 Uppgift 5. ADT Abstrakt datatyp och objektorientering (4p) En stack är en datastruktur där man lägger till ett element överst och man kommer åt det översta elementet, som kan tas bort. Stack = sist in först ut. Vi önskar en abstrakt datatyp stack med följande primitiva operationer: skapa-stack : -> stack lägg-in : element x stack -> stack toppen : stack -> element ta-bort : stack -> stack tom-stack? : stack -> sanningsvärde stack-längd : stack -> heltal Vi kan nu skapa en stack s och använda operationerna: > (define s (skapa-stack)) > (set! s (lägg-in kalle s)) > (set! s (lägg-in lisa s)) > (stack-längd s) = 2 > (toppen s) = lisa > (set! s (ta-bort s)) > (toppen s) = kalle > (tom-stack? s) = #f > (set! s (ta-bort s)) > (tom-stack? s) = #t Vi kan representera stacken som en vanligt lista, där första element är en typmärkning stack, och definiera de primitiva operationerna. > (define (skapa-stack) (cons stack ())) > (define (lägg-in e stack) (cons stack (cons e (cdr stack)))) > (define (toppen stack) (car (cdr stack))) > (define (ta-bort stack)???) > (define (tom-stack? stack)???) > (define (stack-längd stack)???) 5a. (2p) Komplettera koden för de tre sista primitiva operationerna ovan.
AID-nummer: Datum: 2011-01-11 9 Uppgift 5. ADT Abstrakt datatyp och objektorientering, forts 5b. (2p) Gör en objektorienterad packetering av denna abstrakta datatyp. Inför metoder med samma namn. Nu skall vi kunna skriva något i stilen med följande: Exakt hur det ser ut kan bero på hur du gör din packetering. > (define s (skapa-stack)) > ((s lägg-in) kalle) > ((s lägg-in) lisa) > (s stack-längd) = 2 > (s toppen) = lisa > (s ta-bort) > (s toppen) = kalle > (s tom-stack?) = #f > (s ta-bort) > (s tom-stack?) = #t
AID-nummer: Datum: 2011-01-11 10 Uppgift 6. Procedurobjekt och omgivningsdiagram (3p) 6a. (0,5p) Använd omgivningsdiagram för att visa om följande i Scheme är korrekt eller ej. Kan en formell parameter ha samma namn som själva proceduren? > (define (a a) (+ a 1)) > (a 2) =? 6b. (0,5p) Använd omgivningsdiagram för att visa om följande i Scheme är korrekt eller ej. Kan en formell parameter ha samma namn som en funktion och vi kan göra rekursiva anrop av funktionen. > (define (b b) (if (= b 0) () (cons x (b (- b 1))))) > (b 3) =? 6c. (2p) Förklara vad nedanstående funktion gör. Rita upp omgivningsdiagrammet när följande uttryck ges till Scheme. Du skall ange i vilken ordning ramar, bindningar och procedurobjekt skapas. Efter beräkningarna skall du ange vilka ramar som ej längre behövs. > (define (minne fn) (let ((arg-värde-lista ())) (lambda (ett-arg) (if (assq ett-arg arg-värde-lista) (cdr (assq ett-arg arg-värde-lista)) (let ((värdet (fn ett-arg))) (set! arg-värde-lista (cons (cons ett-arg värdet) arg-värde-lista)) värdet))))) > (define (f n) (display "n= ") (display n) (newline) (+ n 5)) > (define fm (mine f)) > (fm 3) =? > (fm 3) =? > (fm 10) =? > (fm 10) =?