Programkonstruktion. Tentamen,

Relevanta dokument
Programmeringsmetodik DV1, Programkonstruktion del 1 Tentamen,

Programkonstruktion. Tentamen,

Programkonstruktion. Tentamen,

Omtentamen (del 1, 6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Tentamen 1 (6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Tentamen (del 2) (4 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

SI-möte #10, Programkonstruktion och Datastrukturer

"Referentiell transparens"

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

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

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

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 4 Om rekursion. PK1&PM1 HT-06 moment 4 Sida 1 Uppdaterad

Programkonstruktion och datastrukturer. Formell verifiering eller hur man bevisar att program gör rätt utan att testa dem

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

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2010/11 moment 9 Sida 1 Uppdaterad

Summera godtyckligt antal tal. Programkonstruktion. Moment 4 Om rekursion. Fullständigt resonemang för summeringen. Analys av summeringsproblemet

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 9 Om högre ordningens funktioner. PK1&PM1 HT-06 moment 9 Sida 1 Uppdaterad

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

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

729G04 Programmering och diskret matematik

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

Uppgifter till tenta i 729G04 Programmering och diskret matematik. 17 december 2015, kl 14:00-18:00

Programkonstruktion. Moment 11 Om sidoeffekter In/utmatning och imperativ programmering. PKD 2011/12 moment 11 Sida 1 Uppdaterad

729G04 Programmering och diskret matematik

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

Kryptokorsordslösare Programmeringsmetodik DV (period 2) Inlämningsuppgift 1

Korsordlösare Sara Hedbrandh Strömberg Programkonstruktion VT 10 Inlämninsguppgift

kl Tentaupplägg

Produktionsplanering. Programkonstruktion. Ett programutvecklingsexempel. Programutvecklingsprocessen. Exempel produktregister. 2.

Programkonstruktion och Datastrukturer

Tentamen, EDAA10 Programmering i Java

729G74 - IT och programmering, grundkurs. Dugga.

Tentamen i Introduktion till programmering

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

TDDC74 Programmering, abstraktion och modellering. Tentamen

Tentamen i. TDDC67 Funktionell programmering och Lisp

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

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

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2011/12 moment 9 Sida 1 Uppdaterad

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

Tentamen i Algoritmer & Datastrukturer i Java

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

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

Tentamen, Algoritmer och datastrukturer

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

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

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

TDDC74 Lab 04 Muterbara strukturer, omgivningar

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

Tentamen TEN1 HI

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

DAI2 (TIDAL) + I2 (TKIEK)

DD1361 Programmeringsparadigm. Carina Edlund

kl Tentaupplägg

Programmering C: Tentamen of 5 Prioritet och associativitet hos operatorerna i C De viktigaste operatorerna: Prioritet Kategori Operator

kl Tentaupplägg

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

Tentamen i. för D1 m fl, även distanskursen. lördag 26 februari 2011

Tentamen Datastrukturer (DAT036)

Datalogi, grundkurs 1

tentaplugg.nu av studenter för studenter

Programmering A. Johan Eliasson

Programmering II (ID1019) :00-12:00

TDDC74 Programmering, abstraktion och modellering. Tentamen

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

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

Tentamen i. Programmering i språket C

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

Tentamen Datastrukturer (DAT037)

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.

Föreläsning 3-4 Innehåll

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

Tentamen i Programmering grundkurs och Programmering C

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Rekursion och induktion för algoritmkonstruktion

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

Tentamen i Programmering

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

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öreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

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

Kompilatorer och interpretatorer

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

Övning från förra gången: readword

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Övningsuppgifter #11, Programkonstruktion och datastrukturer

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

729G04 Programmering och diskret matematik. Python 2: Villkorssatser, sanningsvärden och logiska operatorer

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Tentamen i Grundläggande programmering STS, åk 1 fredag

F6: Högre ordningens funktioner. Mönster för rekursion (1) Mönster för rekursion (1b) Mönster för rekursion (2) Högre Ordningens Funktioner

TENTAMEN OOP

Dugga Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

TENTAMEN I. OBJEKTORIENTERAD PROGRAMMERING för Z1. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Datalogi, grundkurs 1

Transkript:

Programkonstruktion (Programmeringsmetodik DV1) Tentamen, 2008-06-12 Lars-Henrik Eriksson Institutionen för informationsteknologi Uppsala Universitet Tid: 0900-14:00. Börja med att läsa igenom alla frågorna för att se om något är oklart. Jag kommer förbi någon gång klockan 10-11 för att svara på frågor. Om du får problem med tolkningen av en fråga efter att jag kommit förbi så gör rimliga antaganden och redovisa dem. Du måste använda det speciella försättsbladet som förstasida för dina svar. Använd inte rödpenna! Lämna marginal på bladen för kommentarer. Det bästa är om du använder blad med förtryckta marginaler. Behöver du inbyggda funktioner/biblioteksfunktioner som du inte förutsätts kunna utantill så beskrivs de kortfattat i uppgiften. Maximala antalet poäng som du kan få är 32. För godkänt (betyg 3) krävs 16 poäng, för betyg 4 krävs 22 poäng och för betyg 5 krävs 28 poäng. Tenterar du en äldre variant av kursen med betygskala U-G-VG så krävs 24 poäng för VG. (Poänggränserna är uppskattningar som kan ändras.) Viktig information om hur man svarar. Om du inte följer dem kan din tenta bli rättad senare och/eller så får du poängavdrag. Besvara inte mer än en uppgift per blad (flera deluppgifter är ok)! Din handstil skall vara lätt och läsa och svaren lätta att förstå. Du skall följa kodningsstandarden från kursen när du svarar med programkod (en sammanfattning av kodningsstandarden finns på nästa sida). Du får inte programmera imperativt (med sidoeffekter) om det inte framgår av uppgiften att det är avsikten. Lycka till! Lars-Henrik

Kodkonvention (sammanfattning.) Varje funktion skall föregås av en specifikation. Det gäller oavsett om den är deklarerad lokalt eller globalt, är angiven i uppgiften eller påhittad av dig. Det enda undantaget från ovanstående gäller anonyma funktioner som ges som argument till en annan funktion. Där slipper du skriva specifikation, men å andra sidan skall en sådan funktion vara mycket enkel. Om den inte är det så skall du inte använda en anonym funktion utan namnge den. Specifikationen skall vara utformad på följande sätt: funktionsnamn argument TYPE: argumenttyp -> resultattyp PRE:... förvillkor på argumenten... POST:... eftervillkor på resultatet... SIDE-EFFECTS:... om det finns några... EXAMPLES:... där det behövs... Observera att eftervillkoret bara i rena undantagsfall kan vara riktigt om inte samtliga argument förekommer i det. Rekursiva funktioner För varje rekursiv funktion (med undantag av sådana där du inte kan förutse antalet rekursiva anrop t.ex. en funktion som läser från fönster) skall du ange en rekursionsvariant, så här: VARIANT:... Definierade datatyper För varje definierad datatyp (datatype och abstype) skall du ange representation och invarianter, t.ex. så här: REPRESENTATION CONVENTION :...förklaring av hur data representeras... REPRESENTATION INVARIANT :...beskrivning av datastrukturinvarianter... Varje (ickefunktions-)värde du definierar inuti en abstrakta datatyp skall ges en specifikation enligt följande mall: värdenamn TYPE: värdetyp VALUE:... beskrivning av vad värdet representerar... Indentering Layout och indentering av if-then-else- respektive let-uttryck skall göras på följande vis: if booleanexpression then expression1 else expression2 let declarations in expression end

Uppgifter 1. a) (2p.) Skriv en funktion countoccurrences som tar som argument ett element och en lista. Värdet skall vara antalet gånger det givna elementet förekommer i listan. Exempel: countoccurrences("får",["far","får","får","får","?","inte", "får","får","får","--","får","får","lamm"]) = 8 b) (2p.) Skriv en fullständig uppsättning testfall för funktionen countoccurrences enligt de riktlinjer vi givit i kursen. Ange för de olika testfallen varför du har tagit med dem. Det skall tydligt framgå att de testfall som du givit täcker in de olika slag av testfall som vi talat om på kuren. 2. a) (3p.) Skriv en algoritm (i tydlig klartext, pseudokod, flödesschema eller på annat lämpligt sätt) för att lösa följande problem: Man har en tidtabell för en busslinje, tågförbindelse eller liknande och vill hitta den förbindelse som avgår från en viss plats efter viss tid. Tidtabellen representeras som en lista av förbindelser. Varje förbindelse representeras som en lista av tider för varje hållplats/station. Dessutom finns en separat "rubriklista" som innehåller namnen på de olika platserna i förbindelserna. Exempel: Antag att vi tittat på tågtider för pendeltågen från Uppsala till Stockholm. Rubriklistan kan då vara ["Uppsala","Knivsta","Märsta","Stockholm"]. Ett urval (!!) av förbindelser kan ge tidtabellen [[0809,0820,0828,0849],[1209,1220,1228,1249], [1609,1620,1658,1649],[2009,2020,2028,2049]] Tiderna represeneras som heltal med timmar som hundratal. 1220 representerar alltså klockan 12:20. En fördel med denna representation är att man kan jämföra tider genom att göra en heltalsjämförelse. Tidtabellen anger alltså bl.a. att det går ett tåg från Uppsala kl. 08:09 som passerar Knivsta 08:20, Märsta 08:28 och kommer till Stockholm 08:49. Om man kör algoritmen med denna rubriklista och tidtabell samt platsen "Knivsta" och tiden 1100, så skall algoritmen ge svaret SOME 1220. Om det inte finns någon förbindelse efter den givna tiden så skall svaret bli NONE. Algoritmen kan förutsätta att den plats man anger finns i rubriklistan. Tänk på att syftet med en algoritm är att ge en precis och "mekanisk" beskrivning av hur något skall beräknas. Luddighet ger poängavdrag! (Uppgift 2 fortsätter på nästa sida.)

b) (3p.) Skriv en funktion lookuptimetable som implementerar algoritmen du skrev i deluppgift a)! Har du inte löst den deluppgiften får du försöka skriva funktionen ändå. lookuptimetable skall ha fyra argument: en plats, en tid, en rubriklista och en tidtabell enligt deluppgift a). Exempel: lookuptimetable("knivsta",1100, ["Uppsala","Knivsta","Märsta","Stockholm"], [[0809,0820,0828,0849],[1209,1220,1228,1249], [1609,1620,1658,1649],[2009,2020,2028,2049]] = SOME 1220 Tips: Du kommer sannolikt att behöva en hjälpfunktion eller kanske två. 3. a) (2p.) Skriv en lämplig definition av en ny datatyp cart som skall användas för att representera data om en "kundvagn" i en webbutik. Kundvagnen skall innehålla uppgifter om vilka varor du köpt samt antal och styckepris för varje vara. Tänk på att skriva tydliga och precisa Representation convention och Representation invariant!!! b) (2p.) För att snabbare kunna komma åt det totala värdet av varorna i kundvagnen lägger man till ett heltalsvärde i datatypen ovan som innehåller just detta totala värde! Gör nödvändiga ändringar till Representation convention och även Representation invariant. 4. Betrakta följande funktion: fun fullmetal(_,elric,[]) = [elric] fullmetal(alchemist,elric,mustang::bradley) = if alchemist(elric,mustang) then elric::mustang::bradley else mustang::fullmetal(alchemist,elric,bradley) a) (2p.) Ge en steg-för-steg beskrivning av hur ML beräknar uttrycket fullmetal(op <,"bertil",["adam","kalle"]) Skriv varje steg på ny rad. Hoppa inte över några steg! b) (2p.) Lista ut vad fullmetal gör för något och skriv en fullständig funktionsspecifikation enligt kodningsstandarden för den. Ange även en variant. Tänk på att när du beskriver vad funktionen gör så skall du inte ge en översättning av programkoden till svenska! Istället skall du tala om vad funktionen beräknar. c) (0p.) Vad har namnen på identifierarna gemensamt? (Utom tävlan, behöver alltså inte besvaras, rätt svar ger inga poäng men en guldstjärna i mina tankar.) 5. (4p.) Skriv en förklaring av typbegreppet i ML som besvarar (åtminstone) följande frågor: Vad menas med en typ? Hur konstrueras typen för en funktion? Vad innebär typkontroll (typhärledning)? Vad är polymorfi? 6. (3p.) Lös uppgift 1a) igen, men utan att använda rekursion. Använd istället en inbyggd högre ordningens funktion som map, filter, foldl e.dyl.

7. a) (2p.) Följande matas in till ML: val a = 1+3; val b = 2+4; fun foo a = let val a = a*2 in a+b end; foo(b); a; Beskriv allt som händer med bindningen av a i exemplet. Vad är värdet som beräknas från de två uttrycken foo(b) respektive a på slutet? b) (2p.) Följande matas in till ML: val a = ref (1+3); val b = ref (2+4); fun foo a = (a :=!a*2;!a+!b); foo(b);!a; Beskriv allt som händer med referensen (ref (1+3)) som binds till a i början av exemplet. Vad är värdet som beräknas från de två uttrycken foo(b) och!a på slutet? (Tentan fortsätter på nästa sida.)

8. (3p.) Skriv ett funktion som tar som argument namnen på två filer. Funktionen skall läsa filerna och ge tillbaka ett heltal som anger radnumret för den första rad där innehållet i filerna skiljer sig åt. Antag att raderna numreras från 1 och uppåt. Om filerna är helt lika skall funktionen returnera 0. Om en av filerna (A) har färre rader än den andra (B) men de rader som finns i filen A är samma som motsvarande rader i B så skall funktionen returnera numret på den första rad i B som inte motsvaras av någon rad i A. (Eller, om man så vill, antalet rader i A + 1.) Ett sätt att förstå detta är att programmet fungerar som om den kortare filen fortsatte med rader som var olika mot raderna i den längre filen. Du måste jämföra raderna allteftersom du läser filen. Du får alltså inte t.ex. först läsa in alla rader i filerna till en lista för respektive fil och därefter jämföra elementen i listorna. Du måste också se till att du stänger alla strömmar som du öppnar. Du får programmera imperativt i denna uppgift, men programmet blir knappast bättre eller enklare om du gör det. Sammanfattning av biblioteksrutiner ur biblioteket TextIO som du kan behöva: openin(s) : string -> instream PRE: s skall vara namnet på en fil som finns. POST: En instream kopplad till filen s. EXAMPLE : openin("frithiof.txt") SIDE-EFFECTS: Olika anrop till openin ger olika strömmar. inputline(is) : instream -> string POST: Nästa rad från strömmen is avslutad med #"\n", eller tom sträng om inget kunde läsas (t.ex. filslut) SIDE-EFFECTS: Läspekaren för is flyttas fram. input1(is) : instream -> char option POST: SOME c om nästa tecken i strömmen är c, NONE om inget tecken kunde läsas (t.ex. EOF). SIDE-EFFECTS: Läspekaren för is flyttas fram. endofstream(is) : instream -> bool POST: true om läsningen av strömmen is har nått till slutet av filen, false annars. SIDE-EFFECTS: inga. closein(is) : instream -> unit POST: (). SIDE-EFFECTS: Avslutar användningen av strömmen is.