TDDC74 Programmering: Abstraktion och modellering Dugga 1, exempeldugga Läs alla frågorna först och bestäm dig för i vilken ordning du vill lösa uppgifterna. Uppgifterna är inte nödvändigtvis i svårighetsordning. Använd väl valda namn på parametrar och indentera din kod. Väl valda namn inkluderar konsekvent språk med mera. Om det är naturligt, definiera gärna hjälpfunktioner! Hjälpfunktioner ska som vanligt lösa tydliga och lättförklarade uppgifter. Du behöver inte skriva kodkommentarer, om det inte är en väldigt svårförklarad hjälpfunktion. Namngivning ska vara tillräcklig (och följa konventioner). Du får använda alla tillgängliga primitiver och språkkkonstruktioner, om annat inte anges. Skriv inte onödigt komplicerade lösningar. Det kan, i värsta fall, ge avdrag. Att lämna in Skicka in uppgifterna med hjälp av exam-klienten, när du är klar med dem! Du får svar via klienten när din uppgift är rättad. Vänta inte på att alla uppgifter är klara med att lämna in. Du har en inlämning per uppgift. Följ angivna namn, och testa att alla körexempel i uppgiften fungerar exakt som de är inskrivna! Betyg Det finns två duggor i kursen. På varje dugga kan man få som mest 15p. Totalpoängen avgör slutbetyget i kursen. För trea räcker ca 50%. Ett resultat man inte är nöjd med, kan plussas vid tentamenstillfället i juni. Lycka till!
Uppgift 1, Länkade strukturer (2p) Skriv kod som ger upphov till följande strukturer och bindningar. Skriv dina lösningar i uppg1.rkt. 2
Uppgift 2, Teori och semantik (1+1+1p) I dessa uppgifter svarar ni genom enkel textinlämning. Skriv era svar som kodkommentarer i uppg2.rkt och lämna in så. Lämna in uppgift a, b och c (eller de du svarar på) samtidigt, i samma fil. a) Vi skriver in koden nedan, i exakt den ordning som den står. Fungerar detta? Varför/varför inte? Svara kortfattat (max en-två meningar) som kodkommentar. (define n m) (define m 1) b) Skriv en funktion g som gör att detta returnerar 1: <din kod där du definierar funktionen g> (define (f f) (f 13)) (f g) c) Ger denna procedur upphov till en iterativ eller rekursiv process? Varför? Svara kortfattat (max en-två meningar) som kodkommentar. (define (f3 n) (if (= n 0) 112 (if (= 112 (f3 (- n 1))) 112 (f3 (- n 1))))) (f3 100) 3
Uppgift 3, Enkelrekursion Skriv dina svar i filen uppg3.rkt. Det är viktigt att alla funktioner som anges nedan har exakt samma namn som i uppgiften. a) Skriv en funktion translate, vilken givet ett ord och en ordlista med översättningar, returnerar översättningen på ordet. Om ordet inte finns i ordboken skall #f returneras. Du får inte använda inbyggda funktioner för associationslistor (som assoc eller assq). Följande exempel visar hur funktionen skall fungera: > (define dictionary ((broder. bar^adar) (fader. pedar) (du. to) (jag. man) (moder. m^adar) (människa. ^adam) (namn. n^am) (tak. t^aq) (vacker. zib^a) (vän. dust))) > (translate jag dictionary) man > (translate mamma dictionary) #f > (translate moder dictionary) m^adar b) Definiera en funktion add-word som returnerar en ordbok med ett extra/ombundet ord i. Så här ska det fungera: > (define dict0 (add-word katt kot dictionary)) ;; dict0 är som dictionary, men med ett extra ord > (define newdictionary (add-word fader otets dict0)) > (translate katt newdictionary) kot > (translate moder newdictionary) m^ad^ar > (translate fader newdictionary) otets Det spelar ingen roll om det finns dubbletter i listan, uppslagningen ska använda den senast tillagda. 4
Uppgift 4, Dubbelrekursion Skriv dina svar i filen uppg4.rkt. Det är viktigt att alla funktioner som anges nedan har exakt samma namn som i uppgiften. Varje parstruktur kan speglas. Så (1. 2) speglat blir (2. 1). Listan (1) är (1. ()) och speglas till ( (). 1 ). Din uppgift är att skapa en funktion reflect som tar en parstruktur eller ett atomärt värde, och returnerar speglingen av den. Alla delträd eller deluttryck måste också speglas. Så här ska den fungera: > (reflect 5) 5 > (reflect ()) () > (reflect (1. 2)) (2. 1) > (reflect ((a. b). (c. d))) ((d. c) b. a) Notera att det sista är DrRackets sätt att skriva ut ((d. c). (b. a)). Vill man testa, kan man jämföra de båda uttrycken med equal?-proceduren. > (equal? ((d. c) b. a) ((d. c). (b. a))) #t 5
Uppgift 5, Högre ordningens funktioner (och rekursion) Skriv dina svar i filen uppg5.rkt. Det är viktigt att alla funktioner som anges nedan har exakt samma namn som i uppgiften. a) I laboration 2 har du definierat en egen map-variant, som fungerar på vanliga listor. Nu ska du generalisera den, till en funktion som fungerar på valfria parstrukturer och atomära värden. Så här ska funktionen fungera: > (define (square x) (* x x)) > (tmap square 5) ;; OBS! Atomärt värde! Det är OK! 25 > (tmap null? 5) #f > (tmap null? ()) ;; vi applicerar aldrig funktionen på tomma listan () > (tmap square (5 10 15)) (25 100 225) > (tmap square (5. (3. 10))) (25 9. 100) Notera att det sista är DrRackets sätt att skriva ut (25. (9. 100)), vilket kan testas lätt: > (equal? (25 9. 100) (25. (9. 100))) #t b) Definiera en funktion replace som tar en struktur t (som ovan), ett atomärt värde old och ett atomärt värde new. Funktionen ska returnera en likadan struktur, förutom att old bytts ut mot new. Du måste använda tmap i lösningen, så din kod kommer att se ut som (define (replace t old new) (tmap????????? t)) 6