TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Relevanta dokument
TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12

TDDC74 Programmering: Abstraktion och modellering Dugga 1, kl 14-16

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 08-12

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

TDDC74 Programmering: Abstraktion och modellering Dugga 1, exempeldugga

TDDC74 Programmering: Abstraktion och modellering Datortenta

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 14-16

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 19 oktober 2016, kl 14 18

TDDC74 Programmering: Abstraktion och modellering Tenta, kl 14 18, 11 juni 2014

TDDC74 Programmering: Abstraktion och modellering Dugga 3, kl 8 10, 7 april 2016

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

TDDC74 Lab 02 Listor, sammansatta strukturer

TDDC74 Programmering: Abstraktion och modellering Dugga 3, kl 14 16, 25 mars 2015

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Programmering, abstraktion och modellering DUGGA 2

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

TDDC74 Lab 04 Muterbara strukturer, omgivningar

TDDC74 Programmering: Abstraktion och modellering Dugga 2, kl 8 10, 5 mars 2015

n Detta för att kunna koncentrera oss på n Tal: number? n Symboler: symbol? n Strängar: string? n Tecken: char? n Boolskt: boolean?

Instruktioner - Datortentamen TDDE24 och TDDD73 Funktionell och imperativ programmering (i Python)

TDDC74 - Lektionsmaterial C

Tentamen i. TDDC67 Funktionell programmering och Lisp

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Implementering av tabellen. Operationer på tabellen

TDDC74 Programmering, abstraktion och modellering. Tentamen

Lösningsförslag. TDDC74 Programmering: Abstraktion och modellering. Dugga 3 (provkod TEN1), Tid: kl 14-16, Datum:

TDDC74 Programmering: Abstraktion och modellering. Provkod TEN1, Tid: kl 14-18, , Kåra

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 8 Om abstrakta datatyper och binära sökträd

TDDC74 Programmering, abstraktion och modellering DUGGA 2

Programmering II (ID1019) :00-17:00

Tentamen, Algoritmer och datastrukturer

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

TDDC74 Programmering, abstraktion och modellering DUGGA 1

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2

Tentamen Datastrukturer (DAT036)

TDDC74 Programmering, abstraktion och modellering. Tentamen

TENTAMEN I DATAVETENSKAP

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Rekursiva algoritmer sortering sökning mönstermatchning

Föreläsning 9 Datastrukturer (DAT037)

Tillämpad Programmering (ID1218) :00-13:00

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Specifikationer för tabellfunktionerna. Operationer på tabellen

Självbalanserande träd AVL-träd. Koffman & Wolfgang kapitel 9, avsnitt 1 2

Föreläsning 13. Träd

Tentamen TEN1 HI

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Datastrukturer. föreläsning 10. Maps 1

TDDC74 Programmering: Abstraktion och modellering Dugga 2, kl 8 10, 3 mars 2016

Programmering II (ID1019) :00-11:00

Lösningar Datastrukturer TDA

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Lösningsförslag till tentamen Datastrukturer, DAT037,

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDIU01 / 725G

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 9 Innehåll

Signalflödesmodellen. Två (gamla) exempel: Kvadratera alla jämna löv.

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Tentamen Datastrukturer D DAT 035/INN960

Tentamen Datastrukturer (DAT036)

TDDC74 Programmering: Abstraktion och modellering Dugga 2, Tid: kl 08-10, Datum:

Programmering II (ID1019) :00-12:00

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Tentamen Datastrukturer (DAT037)

Algoritmer och datastrukturer 2012, fo rela sning 8

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Tentamen Datastrukturer, DAT037 (DAT036)

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 2

Tentamen, EDAA10 Programmering i Java

Dagens föreläsning Programmering i Lisp Fö 5

Föreläsning Datastrukturer (DAT036)

TDDC74 Programmering, abstraktion och modellering DUGGA 3

DAI2 (TIDAL) + I2 (TKIEK)

Tentamen TEN1 HI

Föreläsning 9 Innehåll

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tentamen TEN1 HI

Obs! Inget ur Javas standardbibliotek får användas i ett svar (om det inte står att man får det).

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Programmering II (ID1019)

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Självbalanserande AVL-träd Weiss, avsnitt 4.4

Tentamen Datastrukturer (DAT036)

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Teoretisk del. Facit Tentamen TDDC (6)

Föreläsning 5. Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning

Symboliska konstanter const

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

HI1024 Programmering, grundkurs TEN

Transkript:

TDDC74 Programmering: Abstraktion och modellering Datortenta - 017-10-7, kl 14-18 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 bland annat konsekvent språk. Du behöver inte skriva kodkommentarer, annat än för väldigt svårförklarade hjälpfunktioner (som bör undvikas). Namngivning ska vara tillräcklig (och följa konventioner). Skriv inte onödigt komplicerade lösningar. Om det är naturligt, definiera gärna hjälpfunktioner! Hjälpfunktioner ska som vanligt lösa tydliga och lättförklarade uppgifter. Du får använda alla tillgängliga primitiver och språkkonstruktioner i Racket, om annat inte anges i uppgiftens text. Frågor Är något otydligt i uppgifterna kan du använda meddelande-funktionen i tentaklienten för att skicka frågor till jourlärare. Att lämna in Döp dina filer till uppg1.rkt, uppg.rkt,.... Filändelsen är relevant. Skicka in uppgifterna med hjälp av tentaklienten, när du är klar med dem! Vänta inte på att alla uppgifter är klara med att lämna in. När du har lämnat in en uppgift, fortsätt arbeta på nästa. Du har en inlämning per uppgift (så skicka inte ev a- och b-uppgifter separat). Följ angivna namn, och testa att alla körexempel i uppgiften fungerar exakt som de är inskrivna! Betyg: För trea räcker ca 0% av det totala poängen. För en fyra räcker ca 6% och för en femma ca 80%. Ett resultat man inte är nöjd med, kan plussas vid ett senare tentamenstillfälle. Lycka till!

Uppgift 1, Teori och semantik (3 poäng) Lämna in dina svar som kommentar i fil uppg1.rkt. 1. Antag att vi har följande kod: ( define ( return -if -non - zero n val ) (if ( zero? n) 0 val )) ( define ( slowpoke ) ;; some calculation that takes 4 h to complete 999) Vi evaluerar uttrycket (return-if-non-zero 0 (slowpoke)). När (om) det hela är slut, får vi tillbaka siffran noll (eftersom n = 0). Kan vi säga från början att evalueringen av det uttrycket kommer att ta ca 4h? Varför? Svara kortfattat (max en-två meningar). 1 (1p). Vi startar DrRacket, skriver in koden nedan (utan att ha skrivit något annat först) och försöker köra den. Det fungerar inte. Varför inte? Svara kortfattat (max en-två meningar). (1p) ( define n (+ n 1)) 3. Vissa språk, bland annat Racket, kan optimera funktioner som ger upphov till en iterativ process. Funktionen nedan är antingen linjärrekursiv eller iterativt rekursiv. Vilken av dem? Varför? Svara kortfattat (max en-två meningar). (1p) ( define (f1 n) (if (= n 0) 11 (f1 (- n 1)))) (f1 100) 1 Skriv gärna testfall för att övertyga dig själv.

Uppgift, Enkelrekursion, högre ordningens procedur ( poäng) Lämna in dina svar i fil uppg.rkt. I matematiken kan vi se en funktion f : X Y som någon form av regel som knyter ihop varje element i X med exakt ett element i Y.. Ett exempel på en funktion kan - lite slarvigt - vara f(1) = 10, f() = 10, f(17) = 8 (och 1,, 17 är de enda tillåtna indata). Vi skulle kunna beskriva denna ändliga funktion genom indata: (1 17), utdata (i samma ordning): (10 10 8).. a) Din uppgift är att skriva en funktion eval-fun som tar en lista med möjliga indata, en lista med motsvarande utdata, och en punkt x där vi vill ta reda på funktionsvärdet f(x). Första elementet i indata-listan hör ihop med första elementet i utdata-listan, och så vidare. Du kan anta att listorna är lika långa, ändliga, och att alla olika indatavärden är unika. Om x inte finns med bland tillåtna indata ska funktionen returnera strängen undefined. Värdena ska jämföras med eqv?. Så här ska det fungera: > (eval-fun (1 17) (10 10 8) ) 10 > (eval-fun (1 17) (10 10 8) 17) 8 > (eval-fun (1 17) (10 10 8) 999) ;; 999 ej bland tillåtna indata! "undefined" > (eval-fun (9 3 100) (hunden katten glassen) 3) ;; valfri ordning av indata katten b) Nu vill vi generera Racket-funktioner utifrån en funktionsbeskrivning som den ovan. Skriv en funktion make-procedure som tar en in- och utdatalista, och returnerar en funktion av en variabel x som returnerar funktionens värde i x. Så här ska den fungera: > (define f (make-procedure (1 17) (10 10 8))) ;; in- och utdata som ovan > f #<procedure> > (f ) 10 > (f 999) "undefined" OBS! Du får anropa din kod från a-uppgiften. Har du inte svarat på a-uppg., antag att en sådan funktion finns. Vi gör vissa förenklingar här; exempelvis struntar vi i vad målmängden Y är. Vi antar också att X är ändlig. Det är OK. 3

Uppgift 3. Dubbelrekursion, generella mönster (6p) Lämna in dina svar i fil uppg3.rkt. Skriv en procedur replace-all som tar en liststruktur seq av godtyckligt djup, och ersätter alla förekomster av symbolen old med symbolen new. seq kan innehålla såväl symboler som underlistor (som kan innehålla nya listor, och så vidare). Du kan anta att alla listor är äkta listor, som uppfyller predikatet list?. 3 Så här ska det fungera: > ( replace - all (a b c d e) a foo ) ( foo b c d e) > ( define deep (a dog ((((((( dog fish )) dog )))) dog ) )) > ( replace - all deep dog cat ) (a cat ((((((( cat fish )) cat )))) cat ) ) > ( replace - all deep 999 snake ) ;; no 999 in deep (a dog ((((((( dog fish )) dog )))) dog ) ) a) Redovisa kod för replace-all. Koden i a-uppgiften får inte innehålla anrop till map. (3p) b) En stor del av koden du skrivit ovan utför mönstret för varje element, gör något och samla upp resultatet. Just den biten är precis vad den klassiska inbyggda funktionen map gör. Skriv en funktion ram som fungerar exakt som replace-all, men är skriven på formen (define (ram seq old new) (map... din kod... seq)) Självklart får ram inte anropa replace-all (eller liknande). Du behöver inte skriva hela... din kod... på en rad! Redovisa kod för ram. (3p) 3 Alltså inga par som (head. tail). 4

Uppgift 4, Liststrukturer, grafisk representation (3 poäng) Lämna in dina svar i fil uppg4.rkt. a) (1,p) Skriv Schemeuttryck som skapar följande struktur. Du får inte använda set-mcar! och set-mcdr! för denna deluppgift eftersom de skall inte behövas. Använd gärna define, let och/eller let* för att tillfälligt benämna delstrukturer som du skall använda flera gånger. b) (1,p) Skriv Schemeuttryck som skapar följande struktur. Du får använda set-mcar! och set-mcdr! vid behov. Använd gärna define, let och/eller let* även här.

Uppgift. Abstrakt datatyp, högre ordningens procedur (6p) Vi vill implementera en dataabstraktion som kallas för binärträd. Ett binärträd kan här vara ett tomt binärträd eller en struktur som består av tre delar: ett värde, samt vänster och höger delträd (barnen). När vi har en enstaka nod, representerar vi den som ett binärträd med ett värde och tomma delträd till vänster och höger. Nedan ser du grafisk representation av ett litet binärträd. Noden har två barn. Vänster delträd är noden 1, och höger delträd är noden 3 (och allt under det). Såväl vänster och höger delträd för noden med värde 1 är det tomma binärträdet. 1 3 4 -------------------------------------------------- Till B: Exempel på insättning i binärt sök träd. Efter insättning av : Efter insättning av : Efter insättning av 3: 3 19 Efter insättning av 19: 3 6

Lämna in dina svar i fil uppg.rkt. Uppgift a) Representation (p) Du får själv välja hur den interna representationen av binärträdet ser ut. Följande ska dock implementeras (bt står för binärträd): Konstruktorn (make-bt left value right) som skapar en inre nod. left, right antas vara delträd. Predikatet (empty-bt? tree) som testar om ett binärträd är det tomma trädet eller ej. Konstanten null-bt som representerar det tomma trädet. Även här får du välja hur du representerar det internt. Följande getters: (bt-left node), (bt-right node), (get-value node) för inre noder. Se på binärträdet i figuren ovanför, där den översta noden har värde. Vi skapar det (och knyter ihop namnet mytree med det) med uttrycket (define mytree (make-bt (make-bt null-bt 1 null-bt) ;; vänster delträd ;; noden har värde (make-bt null-bt 3 (make-bt null-bt 4 null-bt)))) ;; höger delträd 7

Uppgift b) Binära sökträd, användning (4p) Vi kan beskriva ett binärt sökträd som ett binärt träd där värdena ordnats på ett särskilt vis. Om värdet av en nod är n, kommer alla värden i vänster delträd att vara mindre än n, och alla värden i höger delträd att vara större. Detta gäller för alla noder. Exempelträdet på bilden ovan är ett binärt sökträd. Alla värden i vänster delträd från rotnoden är mindre än, alla i höger delträd är större. Alla värden i höger delträd från nod med värdet 3 är större. Din uppgift är att definiera (insert-value bst val) som tar ett binärt sökträd, ett värde, och returnerar ett nytt binärt sökträd som innehåller värdet på rätt plats. 4 (contains? bst val) som tar ett binärt sökträd, ett värde, och returnerar #t om värdet finns i trädet. Lösningen måste utnyttja att det är ett binärt sökträd. Använd abstraktionen beskriven i a. Vi kan anta att alla värden är tal, som kan jämföras med <. Så här ska det fungera. Eftersom insert-val inte ändrar något i trädet (utan skapar ett nytt träd) får vi spara undan värdet under namnet stree i varje steg: > ( define stree null - bt) > ( set! stree ( insert - val stree )) > ( set! stree ( insert - val stree )) ;; ingen skillnad > ( set! stree ( insert - val stree )) > ( set! stree ( insert - val stree 3)) > ( set! stree ( insert - val stree 19) ) > (get - value stree ) > (get - value (bt - left stree )) > (get - value (bt - right (bt - left stree ))) 3 > ( contains? stree ) #t > ( contains? stree 11) #f 4 Om du har läst vidare: notera att vi inte ställer några krav på att trädet ska vara balanserat. 8

Uppgift 6, Bindningar, omgivningsmodellen (3 poäng) Lämna in dina svar som kommentarer i fil uppg6.rkt. Vi skriver följande kod: (define (double! x) (set! x (* x )) x) (define val 100) Därefter evaluerar vi uttrycket (double! val). a) Vad händer och varför? Vad för värde returneras? Vad har val för värde efteråt? Besvara även om det hade ändrat något om vi skrivit x istället för val (det vill säga, skrev (define x 100), och anropade med (double! x)). (p) b) Ett av omgivningsdiagrammen nedan illustrerar vad som händer. Vilket? Motivering behövs ej. Korrekt svar ger 1p, felaktigt ger avdrag om 1p. Minsta total poäng på uppgift 6 är 0p. 9

10