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

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

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

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

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

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

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

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

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

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

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

TDDC74 Programmering: Abstraktion och modellering Dugga 1, exempeldugga

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

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

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

TDDC74 - Lektionsmaterial C

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

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Lab 04 Muterbara strukturer, omgivningar

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

TDDC74 Programmering, abstraktion och modellering DUGGA 3

TDDC74 Programmering, abstraktion och modellering. Tentamen

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

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Lab 02 Listor, sammansatta strukturer

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

TDDC74 Programmering, abstraktion och modellering DUGGA 2

TDDC74 Programmering, abstraktion och modellering DUGGA 2

Tentamen i Programmering

TDDC74 Programmering, abstraktion och modellering DUGGA 1

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?

Ändringsbar (mutable compound) data. TDDC74 Programmering: abstraktion och modellering. Sätta - samman listor kopiering. Hitta sista cons-cellen

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 FÖRELÄSNING 9 ANDERS MÄRAK LEFFLER IDA/HCS

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

Tentamen i. TDDC67 Funktionell programmering och Lisp

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT037)

Institutionen för datavetenskap, DAT060, Laboration 2 2 För denna enkla simulerings skull kommer handen att representeras som ett par tal μ värdet på

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

Lära dig analysera större och mer komplicerade problem och formulera lösningar innan du implementerar.

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 9 Exempel. Intervallhalveringsmetoden. Intervallhalveringsmetoden... Intervallhalveringsmetoden...

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 9 Exempel

Tentamen Datastrukturer (DAT036)

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

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

Dugga Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

Länkade strukturer. (del 2)

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

Tentamen i. TDDA 69 Data och programstrukturer

Idag: Par och listor. Symboler. Symboler används för att uttrycka icke-numeriska data såsom namn, adress, bilregisternummer, boktitel, osv.

Idag: Par och listor. Scheme. DA2001 (Föreläsning 6) Datalogi 1 Hösten / 29

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

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.

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

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

Datalogi, grundkurs 1

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

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

729G04 Programmering och diskret matematik

729G74 - IT och programmering, grundkurs. Dugga.

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Datalogi, grundkurs 1 Övningsuppgifter i Scheme. Serafim Dahl, Carina Edlund, m.fl.

Tentamen, EDAA10 Programmering i Java

Föreläsning 8: Exempel och problemlösning

Sätt att skriva ut binärträd

HI1024 Programmering, grundkurs TEN

Datalogi, grundkurs 1

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

Grundläggande programmering med C# 7,5 högskolepoäng

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

TDIU01 / 725G

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Uppgifter till tenta i 729G04 Programmering och diskret matematik. 7 augusti 2015, kl 08:00-12:00

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

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

Övning 1 - Abstrakta datatyper

Exempelsamling Assemblerprogrammering

Tentamen i Grundläggande Programvaruutveckling, TDA548

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

OBS!! Detta är DEL 2 av tentan. För att få ut denna måste du ha lämnat in del 1. Om du inte fått ut del 1 bör du meddela skrivningsvakten. OBS!!

Programkonstruktion. Tentamen,

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

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

Dugga i Grundläggande programmering STS, åk

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Tenta (TEN3) i kursen 729G04 Programmering och diskret matematik 5 feb 2016, kl 14:00-18:00

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

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

and u = och x + y z 2w = 3 (a) Finn alla lösningar till ekvationssystemet

Transkript:

TDDC74 Programmering: Abstraktion och modellering Dugga 2, 2017-04-06, kl 17-19 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åkkkonstruktioner i Racket, om annat inte anges i uppgiftstexten. Frågor Är något otydligt i uppgifterna kan du använda meddelande-funktionen i tentaklienten för att skicka frågor till rättande lärare. Att lämna in Skicka in uppgifterna med hjälp av tentaklienten, 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. 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 funktionsnamnen som står i uppgifterna, och testa att alla körexempel i uppgiften fungerar exakt som de är inskrivna! Din totalpoäng på duggan ges som summan av lösningar du lämnat in i tid, oavsett om de hinner rättas klart inom skrivtiden eller ej. 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 50% av det totala poängen. Ett resultat man inte är nöjd med, kan plussas vid tentamenstillfället i juni. Lycka till!

Uppgift 1, Omgivningsdiagram (3 poäng) Skriv dina svar på uppgift a-c som en textkommentar i uppg1.rkt och skicka in den. Följande sekvens av uttryck evalueras (i ordningen de står): (define n 999) (define (myprint val) (printf "~a ~n" val)) ;; printf inbyggd, ger ej ramar (define (f n) (cond [(zero? n) (myprint n) 0] [else (myprint n) (+ n (f (- n 1)))])) (f 1) a) Detta ger upphov till ett av fyra omgivningsdiagram på nästa sida. Vilket av dem? Det räcker att ange en bokstav. För att minska risken för rena gissningar ger ett felaktigt svar på just denna deluppgift (deluppgift a) 0.5p avdrag på uppgiftens totalpoäng 1. Du behöver inte motivera ditt svar. Du kan svara blankt på a- uppgiften om du vill. b) Välj ut exakt ett av de tre felaktiga omgivningsdiagrammen. Nämn kortfattat (en-två meningar) något som är fel i diagrammet, och varför det är fel. Vi har numrerat ramarna (E1...) och procedurobjekten (1...). När du hänvisar till delar av diagrammet, använd de numren. c) Välj ut exakt ett av de tre felaktiga omgivningsdiagrammen (annat än det i b- uppgiften). Nämn kortfattat (en-två meningar) något som är fel i diagrammet, och varför det är fel. Vi har numrerat ramarna (E1...) och procedurobjekten (1...). När du hänvisar till delar av diagrammet, använd de numren. 1 Den kan alltså ge som minst 0p. 2

A 2 args: (n) body: (cond ) 2 args: (n) body: (cond ) C f: myprint n : 999 GE 2 f: myprint n : 999 E1 E3 E2 E4 args: (n) 1 n: 1 n: 0 val: 1 1 val: 0 body: (cond ) args: (val) body: (printf ) B args: (val) body: (printf ) f: myprint n : 999 GE E1 E2 E3 E4 1 n: 1 val: 1 n: 0 val: 0 args: (val) body: (printf ) 2 f: myprint n : 999 GE args: (n) body: (cond ) 1 n: 1 E1 val: 1 E2 D args: (val) body: (printf ) n: 0 E3 val: 0 E4 n: 1 n: 0 E1 E3 val: 1 val: 0 GE E2 E4

Uppgift 2, Dataabstraktion (4 poäng) I matematiken stöter vi på polynom, som exempelvis p(x) = 8x 3 + 7x 2 + 6x + 5. Vi vill nu skapa en abstrakt datatyp poly som representerar ett polynom. När vi skapar polynomet anger vi helt enkelt dess lista av koefficienter, där vi börjar med konstanttermen. p ovan skulle alltså ha koefficient-listan (5 6 7 8), och polynomet q(x) = x 4 + 3x 2 + 7 skulle ha listan (7 0 3 0 1). Det sista ser vi kanske tydligare om vi skriver ut det som q(x) = 1x 4 + 0x 3 + 3x 2 + 0x 1 + 7x 0. Ett polynoms grad (en: degree) är den högsta förekommande exponenten. p(x) har grad 3, r(x) = 5 har grad 0. Lämna in dina svar i filen uppg2.rkt. Ha med raden (provide (all-defined-out)) i filen. a) Din uppgift är att implementera en datatyp för polynom, genom dessa fyra funktioner: En konstruktor make-poly som tar en lista av koefficienter och skapar ett polynom. Vi kan anta att användaren anger polynom utan avslutande nollor (så p(x) ovan skapas alltid med listan (5 6 7 8), och inte t ex (5 6 7 8 0 0 0... )). Ett predikat poly? som kontrollerar om ett objekt är ett polynom 2. poly-degree tar ett polynom och returnerar dess grad. poly-coeff tar ett polynom och en exponent k (k 0 heltal), och returnerar koefficienten framför termen x k. Så här ska det fungera: > ( define p (make - poly (5 6 7 8))) > ( poly? (5 6 7 8)) ;; var listan ett polynom? #f > ( poly? p) ;; blir det vi skapade ett polynom? #t > (poly - degree p) 3 > ( poly - coeff p 3) ;; ge mig koefficienten vid x ^3 8 > ( poly - coeff p 5) ;; ge mig koefficienten vid x ^5 0 OBS! Du kan ha hjälp av funktionen list-ref, som givet en lista och ett index i (0,...) returnerar elementet på plats i. (list-ref (a b c) 1) => b. 2 Korrekt utdata från make-poly. Du behöver inte kontrollera att användaren gjort rätt när de anropade make-poly. 4

b) Vi vill också kunna skala om ett polynom. Om vi har ett polynom p(x) och en skalär (en siffra) λ så vill vi kunna skapa det nya polynomet q(x) = λp(x). Skriv en funktion (poly-scale p l) som returnerar ett nytt polynom q(x) enligt beskrivningen. Så här ska det fungera: > (define p (make-poly (7 8))) ;; p(x) = 8x + 7 > (define q (poly-scale p 3)) ;; q(x) = 3p(x) = (3*8)x + (3*7) = 24x + 21 > (eqv? (poly-degree p) (poly-degree q)) ;; samma grad #t > (poly-coeff p 0) 7 > (poly-coeff q 0) 21 > (poly-coeff p 1) 8 > (poly-coeff q 1) 24 > (define r (poly-scale p 0)) ;; OBS. r(x) = 0 > (eqv? (poly-degree p) (poly-degree r)) #f > (poly-degree r) 0 > (poly-coeff r 0) 0 OBS! Du måste använda abstraktionen (från a-uppgiften). Du kan inte anta något mer om polynomet än att funktionerna ovan (make-poly...) fungerar. 5

Uppgift 3, Tillståndsmodellering med objekt, closures (4 poäng) Vi vill (som minimalt exempel på objekt med tillstånd) representera knappar. De kan vara antingen på eller av, och ska hantera hantera kommandona flip (som växlar om knappen är på eller av, och returnerar det nya tillståndet), och status som returnerar tillståndet. Procedurerna ska ta exakt ett argument. Om de får något annat än flip eller status ska inget hända. För att skapa en knapp kör vi make-switch. Lämna in dina svar i filen uppg3.rkt. Ha med raden (provide (all-defined-out)) i filen. Så här ska det fungera: > (define switch_a (make-switch)) > (define switch_b (make-switch)) > (switch_a status) #f > (switch_b status) #f > (switch_a flip) #t > (switch_a some-other-arg) ;; inget händer > (switch_a status) #t > (switch_b status) ;; verifierat oberoende #f a) Skriv kod för make-switch. b) Vad är det som gör att switch a och switch b är oberoende? Vad i din kod är det som gör att de inte råkar nå varandras tillstånd? Förklara kortfattat (max en-två meningar). Svara som en kommentar i koden. 6

Uppgift 4, Muterbara struturer (4 poäng) Du får två dataabstraktioner, en för en struktur som heter Triple och en för Deque. Elementen i en deque representeras som en Triple. Din uppgift är att använda den givna dataabstraktionen för att skriva en procedur deq-insert-end! som tar två argument (deq-insert-end! dq value) och lägger andra argumentet som ett nytt element i slutet av dequen dq. Din procedur ska ändra i själva dequen (snarare än att returnera en ny deque med liknande innehåll). Om du är osäker på hur det hela fungerar, se bifogad skiss över deque-strukturen. Dessutom har tentavakterna kladdpapper om du vill göra egna skisser. Du ska inte lämna in dina papper. Till din hjälp har du en del kod given, som beskriver hur abstraktionen ska fungera. Du får inte ändra i den. Koden finns i filen uppgift4-y.rkt på din tentadator, så du kan kopiera därifrån. Den finns också bifogad sist i tentan. Lämna in dina svar i filen uppg4.rkt, där du inkluderar all den givna koden. Ha med raden (provide (all-defined-out)) i filen. 7

8

# lang racket ; Double ended queue implementation ( print -as - expression #f) ; Elements of a deque will be triples so they can point left and right ( define ( triple - make left middle right ) ( mcons left ( mcons middle right ))) ( define ( triple - left triple ) ( mcar triple )) ( define ( triple - middle triple ) ( mcar ( mcdr triple ))) ( define ( triple - right triple ) ( mcdr ( mcdr triple ))) ( define ( triple -set - left! triple element ) (set - mcar! triple element )) ( define ( triple -set - middle! triple value ) (set - mcar! ( mcdr triple ) value )) ( define ( triple -set - right! triple element ) (set - mcdr! ( mcdr triple ) element )) ; Handling double ended queues ( define (make - deque ) ( mcons deque ( mcons () ()))) ( define ( deque - content dq) ; fetch contents of dq ( mcdr dq)) ( define ( deque - empty? dq) ; deque has no elements? ( null? ( mcar ( deque - content dq)))) ( define ( deque - singleton? dq) ; deque has only one element? (eq? ( deque - front dq) ( deque - end dq))) 9

( define ( deque - front dq) ; fetch first element in the queue ( mcar ( deque - content dq))) ( define ( deque -set - front! dq element ) ; let front of deque point to element (set - mcar! ( deque - content dq) element )) ( define ( deque - end dq) ; fetch last element in the queue ( mcdr ( deque - content dq))) ( define ( deque -set - end! dq element ) (set - mcdr! ( deque - content dq) element )) ( define ( deque - insert - front! dq value ) ( let (( new - element ( triple - make () value ())) ( front - element ( deque - front dq))) ( cond (( deque - empty? dq) ( deque -set - front! dq new - element ) ( deque -set - end! dq new - element )) ( else ( triple -set - right! new - element front - element ) ( triple -set - left! front - element new - element ) ( deque -set - front! dq new - element ))))) ( define ( deque - insert - end! dq value ) ; Din kod som svar till uppgift 4 ) ( define ( deque - delete - front! dq) ; remove front element and return its value ( cond (( deque - empty? dq) ( error " Deque empty!?") ) ( else ( let (( value ( triple - middle ( deque - front dq)))) ( cond (( deque - singleton? dq) ( deque -set - front! dq ()) ( deque -set - end! dq ())) ( else ( deque -set - front! dq ( triple - right ( deque - front dq))) ( triple -set - left! ( deque - front dq) ()))) value )))) ( define ( deque - delete - back! dq) ; remove back element and return its value 10

( cond (( deque - empty? dq) ( error " Deque empty!?") ) ( else ( let (( value ( triple - middle ( deque - end dq)))) ( cond (( deque - singleton? dq) ( deque -set - front! dq ()) ( deque -set - end! dq ())) ( else ( deque -set - end! dq ( triple - left ( deque - end dq ))) ( triple -set - right! ( deque - end dq) ()))) value )))) ( define ( deque -> list dq) ; convert deque to a list ( define ( iter elements ) ( cond (( null? elements ) ()) ( else ( cons ( triple - middle elements ) ( iter ( triple - right elements )))))) (if ( deque - empty? dq) () ( iter ( deque - front dq)))) ;; The following examples show how you use these functions. ;( define deque (make - deque )) ;( deque - insert - front! deque eva ) ;( deque - insert - end! deque adam ) ;( deque -> list deque ) ; gives ( eva adam ) ;( deque - insert - front! deque helena ) ;( deque - insert - end! deque carl ) ;( deque -> list deque ) ;( deque - insert - end! deque lisa ) ;( deque - delete - front! deque ) ;( deque - delete - back! deque ) 11