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

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

TDDC74 Programmering: Abstraktion och modellering Datortenta

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

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

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

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 Dugga 3, kl 8 10, 7 april 2016

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

TDDC74 Programmering: Abstraktion och modellering Dugga 1, exempeldugga

TDDC74 Programmering, abstraktion och modellering. Tentamen

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

TDDC74 Lab 04 Muterbara strukturer, omgivningar

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

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

TDDC74 Programmering, abstraktion och modellering DUGGA 3

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

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Programmering, abstraktion och modellering. Tentamen

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

TDDC74 Lab 02 Listor, sammansatta strukturer

TDDC74 Programmering, abstraktion och modellering. Tentamen

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

TDDC74 - Lektionsmaterial C

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:

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?

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

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)

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

TDDC74 Programmering, abstraktion och modellering DUGGA 1

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

TDDC74 Programmering, abstraktion och modellering DUGGA 2

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

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

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

Tentamen i. TDDC67 Funktionell programmering och Lisp

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

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

Idag: Dataabstraktion

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

Programmering II (ID1019) :00-17:00

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

TDDC74 Programmering, abstraktion och modellering DUGGA 2

Föreläsning 9 Exempel

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

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Datalogi, grundkurs 1

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

Datalogi, grundkurs 1

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

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å

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

BEGREPP HITTILLS FÖRELÄSNING 2 SAMMANSATTA UTTRYCK - SCHEME DATORSPRÅK

Uppgift 6A - Frekvenstabell

Rekursiva algoritmer sortering sökning mönstermatchning

Tentamen Datastrukturer (DAT037)

Programmering II (ID1019) :00-12:00

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

Språket Scheme. DAT 060: Introduktion till (funktions)programmering. DrScheme. uttryck. Jacek Malec m. fl. evaluering av uttryck.

Datalogi, grundkurs 1

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

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

Objektorienterad programmering

TDDC74 FÖRELÄSNING 9 ANDERS MÄRAK LEFFLER IDA/HCS

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

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

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

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

Symbolisk data. quote. (define a 1) (define b 2) (jacek johan david) (list a b)

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Tentamen i. TDDA 69 Data och programstrukturer

Börja med att kopiera källkoden till din scheme-katalog (som du skapade i Laboration 1).

Funktionell programmering DD1361

Programkonstruktion och Datastrukturer

Länkade strukturer. (del 2)

Tentamen i Introduktion till programmering

Rekursion och induktion för algoritmkonstruktion

Dagens föreläsning Programmering i Lisp Fö 7. Sammanfattning funktionell programmering Exempel på funktionella programspråk

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Procedurer och villkor

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

Dugga Datastrukturer (DAT036)

Imperativ programmering. Imperativ programmering konstruktioner i Lisp. Datastrukturer (kap ) arraystruktur poststruktur

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Idag: Dataabstraktion

TDIU01 / 725G

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

Våra enkla funktioner eller procedurer

Tentamen Datastrukturer (DAT036)

International Olympiad in Informatics July 2011, Pattaya City, Thailand Tävlingsuppgifter Dag 2 Svenska 1.3. Papegojor

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

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

729G04 Programmering och diskret matematik

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Föreläsning 6: Introduktion av listor

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

Transkript:

TDDC74 Programmering: Abstraktion och modellering Datortenta - 2018-06-07, 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 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 3:a räcker ca 50% av det totala poängen. För en 4:a räcker ca 65% och för en 5:a ca 80%. Ett resultat man inte är nöjd med, kan plussas vid ett senare tentamenstillfälle. Lycka till!

Uppgift 1, Rekursiva och iterativa processer (4p) Ett så kallat triangeltal (1, 3, 6, 10,...) är ett tal som är lika med summan av alla naturliga tal i ett intervall som börjar med 1. Talet 6 är exempelvis ett triangeltal eftersom det är lika med summan (1+2+3). Det fjärde triangeltalet är 10 (1+2+3+4). Det n:te triangeltalet är då lika med summan 1 + 2 +... + n. 1 a) Skriv en funktion triangle-r som tar ett heltal n > 0 och beräknar det n:te triangeltalet med hjälp av en rekursiv process. b) Skriv en funktion triangle-i som tar ett heltal n > 0 och beräknar det n:te triangeltalet med hjälp av en iterativ process. Skriv dina lösningar i filen uppg1.rkt. Inkludera raden (provide (all-defined-out)) Uppgift 2, Relationen mellan let och lambda (1 poäng) Skriv om följande let-uttryck i termer av lambda. Ett korrekt svar ger samma värde som let-uttrycket. (let ((x 17)) (let ((x 42) (y x)) (+ x (- y 6)))) Skriv din lösning i filen uppg2.rkt. Inkludera raden (provide (all-defined-out)) 1 Visst är 1 + 2 +... + n lika med n(n+1) 2 men funktionerna ni skriver skall inte baseras på detta. 2

Uppgift 3, Användande av högre ordningens procedurer (3 poäng) I många fall kan man se att våra lösningar innehåller en variant av något mer allmänt mönster. Gå igenom en lista och samla upp alla jämna tal är till exempel en variant av gå igenom en lista och ta ut vissa element där man har valt att det som ska behållas är de jämna talen. I kursen har vi använt högre ordningens procedurer till en del sådant. Din uppgift är att genom anrop till högre ordningens funktioner som (till exempel) map, filter, foldr etc för att lösa uppgifterna. Du behöver såklart inte använda alla dessa, om det inte behövs. a) (2p) Skriv en procedur evens-squared som tar en lista av heltal och returnerar en lista där de jämna talen har upphöjts till två (de udda är kvar som de var). > (evens-squared (1 2 3 4)) (1 4 3 16) Din procedur får i denna deluppgift inte anropa sig själv (eller någon annan procedur som du har skrivit). b) (1p) Skriv en procedur reverse-simple som tar en lista av listor, och returnerar en lista där alla underlistor vänts: > (reverse-simple ((1 2) (3 4))) ((2 1) (4 3)) > (reverse-simple ((1 2) (3 (vänd inte mig) 4))) ((2 1) (4 (vänd inte mig) 3)) Som syns ovan ska du inte gå ned i ytterligare listor-i-listor-nivåer. Du kan anta att det bara är listor i indata. Du får använda Rackets reverse. Din procedur får i denna deluppgift inte anropa sig själv (eller någon annan procedur som du har skrivit). Skriv dina lösningar i filen uppg3.rkt. Inkludera raden (provide (all-defined-out)) Uppgift 4, Högre ordningens procedurer och dubbelrekursion (3 poäng) Skriv en procedur deep-reverse som tar en lista L och returnerar en ny lista med dess element i omvänd ordning. Alla L:s underlistor (och deras underlistor, och så 3

vidare) måste också komma i omvänd ordning. Vi förutsätter att vi bara använder äkta listor (inga rena cons-par som t ex (4. 5)). Så här ska den fungera: > (deep-reverse (1 2 3)) ;; även översta listnivån vänds (3 2 1) > (deep-reverse (a (b (c d) e) f)) (f (e (d c) b) a) Din kod ska ha följande form: (define (deep-reverse L) (reverse (map??? L))) Till skillnad från förra uppgiften får funktionen anropa sig själv (om det behövs). Skriv dina lösningar i filen uppg4.rkt. Inkludera raden (provide (all-defined-out)) 4

Uppgift 5, Liststrukturer, grafisk representation (3 poäng) a) (1,5p) Skriv Schemeuttryck som skapar följande struktur. Använd bara set-mcar! och set-mcdr! om det behövs! b) (1,5p) Skriv Schemeuttryck som skapar följande struktur. Använd bara set-mcar! och set-mcdr! om det behövs! OBS! Pilar i strukturerna ovan alltid pekar på hela paret, inte delar. Skriv dina lösningar i filen uppg5.rkt. Inkludera raden (provide (all-defined-out)) 5

Uppgift 6, Dataabstraktion, muterbara stukturer (6 poäng) En stack är en så kallad LIFO-datastruktur - last in first out (sist-in-först-ut) med två huvudoperationer: push och pop. push lägger ett element högst upp på stacken, pop tar bort det senast tillagda (översta) elementet och returnerar det. Nedan ser vi hur en stack kan byggas upp genom en sekvens av instruktioner. En möjlig fysisk representation av stacken ovan, efter insättning av talen 1, 2, 3 kan se ut som a) (3p) Implementera stackabstraktionen. Skriv följande procedurer: make-stack - skapar och returnerar en tom stack. stack-empty? - tar en stack, och returnerar #t om stacken är tom, och #f annars. stack-push! - Tar en stack och ett element, och lägger elementet överst på stacken. stack-pop! - Tar en stack, det översta elementet tas bort från stacken och returneras Om stacken är tom ska (error "Empty stack!") evalueras. stack-peek. Tar en stack och returnerar det översta elementet, eller ger fel som ovan. Peek tar inte bort elementet från stacken. Så här ska den fungera: > (define mystack (make-stack)) > (stack-empty? mystack) #t > (stack-push! mystack 1) > (stack-empty? mystack) 6

#f > (stack-push! mystack 2) > (stack-push! mystack 3) > (stack-peek mystack) 3 > (stack-pop! mystack) 3 > (stack-pop! mystack) 2 > (stack-pop! mystack) 1 > (stack-pop! mystack) Empty stack! b) (3p) Skriv en procedur stack-extract-contents! som tar en stack och returnerar en lista med dess innehåll, i samma ordning som de sattes in. Stacken skall vara tom efteråt. > (define mystack (make-stack)) > (stack-push! mystack 1) > (stack-push! mystack 2) > (stack-push! mystack 3) > (stack-extract-contents! mystack) (1 2 3) > (stack-empty? mystack) #t Skriv dina lösningar i filen uppg6.rkt. Inkludera raden (provide (all-defined-out)) 7

Uppgift 7, Procedur med tillstånd (closure) (6 poäng) Svaren till denna uppgift ska skrivas i filen uppg7.rkt. Inkludera raden (provide (all-defined-out)). OBSERVERA även att a- och b-uppgifterna nedan kan lösas oberoende av varandra. Vi ges följande kod för att beräkna Pascals triangel: (define pascal (lambda (r c) (cond [(= r c) 1] [(or (= r 1) (= c 1)) 1] [else (+ (pascal (- r 1) c) (pascal (- r 1) (- c 1)))]))) Koden finns också i filen pascal.rkt på tentasystemet. Den fungerar, men är väldigt långsam. Anrop som (pascal 50 20) blir ohanterliga. a) (3p) Mätning, tolkning. Vi evaluerar uttrycket (pascal 10 5). Hur många anrop till just (pascal 3 2) kommer att ske? Skriv antalet i en kodkommentar, och beskriv kortfattat (max en-två meningar) varför ett enda (pascal 10 5)-anrop ger upphov till såpass många anrop. Du måste använda pascal-koden ovan, men kan lägga till några kodrader (eller argument) som hjälper dig att räkna. Lämna in din modifierade kod också. b) (3p) Memoisering. Vi vill nu använda en teknik som kallas memoisering för att snabba upp beräkningarna. Memoisering går till så att man har ett minne för värden som redan har beräknats. Om man redan har beräknat vad pascal anropet med r=3, c=2 blir en gång, används det värdet istället för att beräkna det på nytt. Din uppgift är att definiera pascal-memo som är en memoiserad pascal-funktion. Funktionen ska vara kopplad till sitt eget minne. I denna deluppgift får det inte finnas några fler globala bindningar utanför funktionen. Så här ska den fungera: > (pascal-memo 5 3) 6 Tips Du får använda vilken datastruktur du vill för att skapa själva minnet - det är inte fokus för uppgiften. Ett exempel kan vara att använda hash-tabeller. Användbara kommandon kan vara hash-set!, make-hash, hash-ref, hash-has-key?. Vill du istället använda associationslistor kan assoc vara praktisk. Dessa är exemplifierade på sista sidan. 8

Några vanliga inbyggda funktioner i Racket Ett urval av Racketfunktioner som kan användas listas nedan. Listan är naturligtvis minimal - det finns många andra funktioner i Racket. Att en procedur eller operation finns med på denna lista betyder inte nödvändigtvis att den behöver användas. Arbete med tal + - * / = < > >= =< number? even? odd? remainder quotient expt negative? positive? zero? random Arbete med listor och cons-strukturer car cdr cons mcar mcdr mcons set-mcar! set-mcdr! eq? eqv? equal? list? null? pair? append length list first second rest Diverse funktioner, operationer och språkkonstruktioner and not or cond define if let let* require provide Trace för att spåra processer (require racket/trace) ;För att spåra en funktion f, skriver vi (trace f) Sekvenshantering map filter foldr foldl In- och utmatning display newline printf error (error "Value does not exist" arg) (printf "Course Code ~a, Course Name ~a~n" TDDC74 PRAM) 9

Hashtabeller > (define myhash (make-hash)) ;; skapa en hashtabell > (hash-set! myhash (3. 3) 1) ;; koppla nyckeln "(cons 3 3)" till värdet 1 > (hash-set! myhash (7. 8) 64) ;; koppla nyckeln "(cons 7 8)" till värdet 64 > (hash-has-key? myhash (7. 8)) ;; Finns något lagrad under nyckeln (cons 7 8)? #t > (hash-ref myhash (7. 8)) ;; Hämta det värde i minnet som är associerad 64 ;;med nyckeln (7. 8) > (hash-has-key? myhash (3. 2)) #f Associationslistor Associationslistor är listor som avbildar tabeller där varje element relaterar en nyckel till ett värde. Funktionen assoc används för att hitta element som har en viss nyckel. Om inget element med given nyckel hittas, returneras #f. assoc använder equal? för att jämföra det vi söker med elementnycklarna. > (define a-list (((3. 3). 1) ;; Nyckeln (3. 3) är relaterad till värdet 1 osv. ((3. 5). 4))) > (assoc (3. 5) a-list) ((3. 5). 4) > (assoc (4. 4) a-list) #f