Programmeringsmetodik DV1, Programkonstruktion del 1 Tentamen,

Relevanta dokument
Programkonstruktion. 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

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

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

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

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

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

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

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

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

kl Tentaupplägg

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

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

729G04 Programmering och diskret matematik

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

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

729G04 Programmering och diskret matematik

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

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, Algoritmer och datastrukturer

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

Tentamen i Introduktion till programmering

729G74 - IT och programmering, grundkurs. Dugga.

Programmering II (ID1019) :00-12:00

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

Programmering A. Johan Eliasson

DD1361 Programmeringsparadigm. Carina Edlund

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

Tentamen i Algoritmer & Datastrukturer i Java

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

Programkonstruktion och Datastrukturer

Dugga Datastrukturer (DAT036)

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

TDDC74 Programmering, abstraktion och modellering. Tentamen

Tentamen i. TDDC67 Funktionell programmering och Lisp

Inledande programmering med C# (1DV402) Summera med while"-satsen

Datalogi, grundkurs 1

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

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

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

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

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

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

Rekursion och induktion för algoritmkonstruktion

TDDC74 Programmering, abstraktion och modellering. Tentamen

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

kl Tentaupplägg

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

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

Tentamen Datastrukturer (DAT037)

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

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

Objektorienterad programmering Föreläsning 8. Copyright Mahmud Al Hakim Agenda (halvdag)

Språket Python - Del 1 Grundkurs i programmering med Python

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

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

Tentamen Datastrukturer (DAT036)

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

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Föreläsning 3.1: Datastrukturer, en översikt

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

kl Tentaupplägg

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

DAI2 (TIDAL) + I2 (TKIEK)

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

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

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

Visual Basic, en snabbgenomgång

Tentamen TEN1 HI

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

TDIU01 - Programmering i C++, grundkurs

TDDC74 Lab 04 Muterbara strukturer, omgivningar

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

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

Tentamen, EDAA10 Programmering i Java

Referentiell transparens. Programkonstruktion. Moment 10 Om sidoeffekter In/utmatning och imperativ programmering. Sidoeffekter.

TENTAMEN OOP

Generiska konstruktioner. Kursbokens kapitel 13

Övningsuppgifter #11, Programkonstruktion och datastrukturer

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

TDDC74 Programmering, abstraktion och modellering. Tentamen

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Datalogi, grundkurs 1

tentaplugg.nu av studenter för studenter

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

Tentamen TEN1 HI

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.

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

Transkript:

Programmeringsmetodik DV1, Programkonstruktion del 1 Tentamen, 2007-08-21 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 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 VG krävs 24 poäng, för betyg 4 krävs 22 poäng och för betyg 5 krävs 28 poäng. (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 addpositives som tar som argument ett lista av heltal och har som värde summan av alla de positiva talen i listan. Finns inga positiva tal skall värdet vara 0. Exempel: addpositives [1,~2,3,~4] = 4 b) (2p.) Skriv en fullständig uppsättning testfall för funktionen addpositives 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. 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! 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 travelcard som skall användas för att representera data i ett "smartkort" för biljettlöst resande med tåg. Kortet skall kunna laddas med pengar som räknas ned när man betalar en resa (i en speciall automat). Man skall kunna lagra en "normalresa" på kortet för att slippa slå in destinationen på automaten för resor man gör ofta (t.ex. Uppsala-Stockholm om man pendlar). För att möjliggöra biljettkontroll skall kortet spara information om de resor man betalt för. Följande information skall finnas: aktuellt penningbelopp, de två platserna som ens normalresa går mellan, en förteckning på de resor som betalats med kortet. För varje resa i förteckningen anges avreseplats, destination, pris, datum och tid. Tänk noga igenom hur data representeras (representation convention), vilka invarianter som skall finnas (representation invariant) och beskriv dessa tydligt och detaljerat. b) (2p.) För att begränsa mängden information som lagras på kortet så sparar man inte alla reseköp utan bara ett antal av de senaste. Hur många som skall sparas anges i ett nytt fält i datastrukturen. Gör nödvändiga ändringar av datatypsdefinitionen. Tänk speciellt på att revidera 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 <,17,[2,42]) 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 om binding i ML och besvara (åtminstone) följande frågor: Vad innebär bindning? I vilka sammanhang sker bindning i ett ML-program? Vilka syften kan man ha med bindning? Vad menas med räckvidden för en bindning? Kan en bindning ändras? Under vilka villkor i så fall? 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 = 2+3; val b = a+2; fun foo x = let val a = b*2 in a*x end; val a = a*2; foo(a); 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(a) respektive a på slutet? b) (2p.) Följande matas in till ML: val a = ref (1+2); val b = ref (3+4); fun foo x = (a :=!b*2;!a* x); a :=!a*2; foo(!a);!a; Beskriv allt som händer med referensen som a binds till i början av exemplet. Vad är värdet som beräknas från de två uttrycken foo(!a) och!a på slutet? 8. (3p.) Antag att du har en textfil där varje rad innehåller ett heltal. Skriv ett funktion som tar ett namn på en sådan fil som argument, läser filen och ger tillbaka summan av talen i filen. Du måste summera talen allteftersom du läser filen. Du får alltså inte läsa in hela filens innehåll till (t.ex.) en lista först och därefter summera. 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. Följande biblioteksfunktion är bra att ha: Int.fromString s TYPE: string -> int option POST: SOME i om s kan konverteras till heltalet i, NONE annars. EXAMPLE : Int.fromString "47" = SOME 47 Sammanfattning av funktioner ur biblioteket TextIO som du kan behöva: openin s TYPE: 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. (Uppgiften fortsätter på nästa sida.)

inputline is TYPE: 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 TYPE: 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 TYPE: 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 TYPE: instream -> unit POST: (). SIDE-EFFECTS: Avslutar användningen av strömmen is.