1 Tekniska högskolan vid Linköpings universitet Institutionen för datavetenskap Anders Haraldsson TDDC74 Programmering, abstraktion och modellering DUGGA 3 Torsdag 4 mars 2010 kl 8-10 Namn: Personnummer: Skriv även ditt namn på varje uppgiftssida. 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. Skriv lagom stort, en del skriver så smått så att vi har svårt att tolka texten och en del skriver så stort så at det inte ryms på raden. Börja raden så långt till vänster som möjligt. Även om det i uppgiften står att du skall skriva en funktion, så får du gärna skriva ytterliggare hjälpfunktioner, som kan vara nödvändiga. På uppgifterna kan halva poäng utdelas. Betygsgradering: Det är tre duggor. Varje dugga ger 12p, dvs totalt 36p. För att passera en dugga krävs minst 3p på duggan. Totalt skall du på de tre duggorna för betyget 3 ha minst 20p. För betyget 4 minst 25p och för betyget 5 minst 30p. Om du har tid: Denna dugga kan ge extrapoäng, som räknas in i totalpoängen. Se uppgift 3. Lycka till
2 Uppgift 1. Strukturändrande operationer på listor (3 poäng) 1a. (1,5p) Vad blir värdet av p och q efter att följande uttryck har beräknats. Rita även upp vilka cons-cellerna med boxar och pilar (box-and-pointer diagrams) som skapats och markera vilka ändringar som gjorts med pekarna. Gör ändringarna i samma cons-cells-struktur. (define p (mcons (mcons 1 ()) (mcons 2 ()))) p (define q (mcons 3 (mcdr p))) (set-mcar! (mcdr p) x) p = q = q (set-mcdr! (mcar p) (mcdr p)) p = q = 1b. (1,5p) Vi vill kunna ändra värdet i ett par i en associationslista genom att ändra pekare. al () a 10 20 b 30 c Definiera en funktion (nytt-värde! alista nyckel nytt-värde). Vi kan antaga att ett par med den givna nyckeln finns i associationslistan. Du får ej använda Scheme-funktioner som arbetar med associationslistor (t ex assoc, assq). Pekarna i paren är ändringsbara, så dessa cons-celler definieras som muterbara. Den överordnade strukturen är vanliga cons-celler. (define al (list (mcons 'a 10) (mcons 'b 20) (mcons 'c 30))) (nytt-värde! al b 50) ; al har nu värdet ({a. 10} {b. 50} {c. 30}) (define (nytt-värde! alista nyckel nytt-värde)
3 Uppgift 2. Omgivningsdiagram (4 poäng) 2a. (2p) Förklara följande begrepp i samband med omgivningsdiagram: bindning (binding) ram (frame) omgivning (environment) Förklara sedan hur omgivningsdiagrammet används då man i Scheme ger följande uttryck: Definition:(define x ) i en omgivning En Tilldelning: (set! x ) i en omgivning En Lambda-uttryck:(lambda formella-parametrar kropp) i en omgivning En Proceduranrop/procedurapplikation: (procedur aktuella-parametrar) i en omgivning En
4 Uppgift 2. Omgivningsdiagram, forts 2b. (2p) Vi har följande definitioner: (define n 10) (define (f n) (define (h x) (g (+ x n))) (h (+ n 5))) (define (g x) (+ x n)) Sedan beräknar vi uttrycket (f (+ n 5)) Rita upp omgivningsdiagrammet efter att dessa 4 uttrycket beräknats, Visa i vilken ordning de olika ramarna och procedurobjekten har skapats.
5 Uppgift 3. Procedurobjekt med tillstånd (2p) Vi önskar en funktion (fib n), som beräknar fibonacci-talen enligt följande fib 0 = 0 fib 1 = 1 fib n = fib n-1 + fib n-2 Funktionen skall minnas tidigare beräknade fibonaccital för att inte behöva räkna om samma fibonaccital mer än en gång. Detta kan göras så att man har en associationslista, där man lagrar n, som nyckel och fib n, som värde. Komplettera nedanstående definition av fib. (define fib (let ((tidigare-värden '())) (lambda (n) (let ((n-värde-par (assq 1 (if (pair? n-värde-par) (cdr n-värde-par) ; komplettera med kod här n tidigare-värden))) ; tidigare beräknat ))))) Extrauppgift (1p): Gör ett omgivningsdiagram, som visar hur fib är definierad och vad som händer då du beräknar (fib 3). Använd sid 8 om inte platsen här räcker till. 1 Proceduren assq returnerar det par i en associationslista, som har en given nyckel. Annars returneras #f.
6 Uppgift 4. Objektorienterad modellering (3 poäng) Nedan följer en objektorienterad modellering av personer med sina leksaker. Varje sak har ett namn och kan ha en färg samt varje person har ett namn och en leksakslista. (define (skapa-sak namn) (let ((färg 'ingen-färg)) (lambda (medd. arg-lista) (cond ((eq? medd 'namn) namn) ((eq? medd 'färg?) färg) ((eq? medd 'ny-färg) (set! färg (car arg-lista))) (else "fel meddelande"))))) (define (skapa-person namn) (let ((leksaker '())) (define (lägg-till-leksak sak-obj) (set! leksaker (cons (cons (sak-obj 'namn) sak-obj) leksaker)) (void)) (define (skriv-ut-leksaker) (map (lambda (par) (display (car par)) (display " ")) leksaker) (newline)) (define (leksaker-färg färg) ; se uppgift 4c (define (dispatch msg) (cond ((eq? msg 'namn) (lambda () namn)) ((eq? msg 'lägg-till-leksak) lägg-till-leksak) ((eq? msg 'skriv-ut-leksaker) skriv-ut-leksaker) ((eq? msg 'alla-med-viss-färg) leksaker-färg) (else (error "fel meddelande")))) dispatch)) (define min-docka (skapa-sak "dockan-lisa")) ; Ge dockan-lisa! färgen gul, se uppgit 4a (define min-bil (skapa-sak "brandbil")) ; ge brandbil färgen röd, se uppgit 4a (define min-boll (skapa-sak "tennisboll")) ; ge tennisboll färgen gul, se uppgit 4a (define lilla-lisa (skapa-person "Lisa")) ; se uppgifter i 4b
7 Uppgift 4. Objektorienterad modellering, forts 4a. (1p) Skriv Scheme-uttryck, som ger de tre sakerna en färg. 4b. (1p) Skriv Scheme-uttryck, som lägger in de tre sakerna i Lisa. 4c. (1p) Komplettera koden för leksaker-färg, som ger en lista med namnen på de leksaker som har en given färg. Vi kan då t. ex. få reda på att dockan-lisa och tennisboll är gula.
8