TDP007 Konstruktion av datorspråk Hemtentamen

Relevanta dokument
Deklarativ programmering

Deklarativ programmering

Parsning. TDP007 Konstruktion av datorspråk Föreläsning 6. Peter Dalenius Institutionen för datavetenskap

Domänspecifika språk. TDP007 Konstruktion av datorspråk Föreläsning 5. Peter Dalenius Institutionen för datavetenskap

Konstruktion av datorspråk

Komponentvisa operationer,.-notation Multiplikation (*), division (/) och upphöj till (ˆ) av vektorer följer vanliga vektoralgebraiska

Konstruktion av datorspråk

Våra enkla funktioner eller procedurer

Tentamen i Introduktion till programmering

Mer om språk och Ruby

Mer om språk och Ruby

Användar- och systemdokumentation

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

kl Tentaupplägg

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

IT OCH PROGRAMMERING I SKOLAN. Jan Erik Moström Peter Vinnervik

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

TDDC74 Lab 04 Muterbara strukturer, omgivningar

Konstruktion av datorspråk

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 4. Peter Dalenius Institutionen för datavetenskap

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

F5 Introduktion till digitalteknik

F5 Introduktion till digitalteknik

Tentamen i Programmering

Föreläsning 2 Programmeringsteknik och C DD1316

kl Tentaupplägg

Laboration: Whitebox- och blackboxtesting

Imperativ programmering

Logik och kontrollstrukturer

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

Tentamen ID1004 Objektorienterad programmering October 29, 2013

729G74 IT och programmering, grundkurs. Tema 2, Föreläsning 2 Jody Foo,

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

Konstruktion av datorspråk

Digitalt lärande och programmering i klassrummet

Programmering B med Visual C

Introduktion till Ruby

Introduktion till Ruby

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

DD1361 Programmeringsparadigm. Carina Edlund

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

12. Relationer och funktioner

Grunderna i stegkodsprogrammering

JavaScript del 3 If, Operatorer och Confirm

Tentamen: INTE

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

DIGITALTEKNIK I. Laboration DE1. Kombinatoriska nät och kretsar

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

Prova på-laboration i PHP Johan Sjöholm johsj@ida.liu.se Institutionen för datavetenskap, Linköpings universitet

Skolan för Datavetenskap och kommunikation. Programmeringsteknik. Föreläsning 16

Viktiga begrepp. Algoritm. Array. Binärkod. Blockprogrammering. Bugg / fel och felsökning. Dataspel. Dator

729G04 Programmering och diskret matematik

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

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

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

TDDI16: Datastrukturer och algoritmer

kl Tentaupplägg

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

Kodexempel från Programmering 2 Tobias Wrigstad, Ph.D.

Uppgift 1 (grundläggande konstruktioner)

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

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

TDDI TDDI22 Tentaregler

PROGRAMMERINGSTEKNIK TIN212

Grundläggande datalogi - Övning 1

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

729G74 IT och programmering, grundkurs. Tema 1, Föreläsning 2 Jody Foo,

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

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

12. Relationer och funktioner

DD1314 Programmeringsteknik

TDDC74 Programmering, abstraktion och modellering DUGGA 1

Labrapport: Programmering i NXC Programmera LEGO Maindstorm med NXC

Laboration D181. ELEKTRONIK Digitalteknik. Kombinatoriska kretsar, HCMOS v 2.1

Extramaterial till Matematik X

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

KOMPLETTERANDE HEMTENTAMEN TDDB53

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Konstruktion av datorspråk

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

Linköpings universitet Innovativ Programmering TDP019 Projekt: Datorspråk. flip/flop. ett helt flippat språk

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

VHDL 1. Programmerbara kretsar

Digital- och datorteknik

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

Grundläggande datalogi - Övning 9

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

kl Tentaupplägg

Inlämningsuppgifter, EDAF30, 2015

Dugga Datastrukturer (DAT036)

Start v. Programspråk. Poäng. 03 Institution Institutionen för datavetenskap 7.5. Antal registrerade (män/kvinnor) 59 (54/5)

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

Transkript:

TDP007 Konstruktion av datorspråk Hemtentamen 2008-08-20 Hemtentamen är kompletterings- och omexaminationstillfälle för de studenter som missat hela eller delar av inlämningar och seminarier, moment LAB1, 2 hp. Allmänna instruktioner och filer som behövs finns på http://www.ida.liu.se/~tdp007/material/hemtenta/ Lösningar på denna hemtentamen ska skickas via e-post till Peter Dalenius, petda@ida.liu.se, senast torsdag 21 augusti kl 12.00. Uppgifter markerade med Inlämning är avsedda att komplettera inlämningar. Dessa uppgifter är konstruktionsuppgifter som innebär att du ska producera programkod, enhetstester och programmeringsdagbok. Samma förutsättningar som för inlämningarna gäller, dvs du kan bli godkänd även om programmet inte är helt perfekt om du har gjort en tillräcklig bearbetning av problemställningen. Uppgifter markerade med Seminarie är avsedda att komplettera seminarierna. Dessa uppgifter går oftast ut på att du ska sätta dig in i programkod och förklara vad den gör, eller kommentera olika möjliga lösningar. För varje uppgift kommer du få en eller flera uppgifter som ska besvaras i text. Du behöver alltså inte lämna in någon programkod. Inlämning 1: Grundläggande Ruby Vi har sett hur man i Ruby kan skicka kodblock som ett slags extra argument till många metoder. Vi kan också själva skapa metoder som kan ta hand om kodblock. Jämför t.ex. följande två metoder: def f1 &a a.call def f2 a a.call Den första varianten kan vi anropa med ett kodblock som vanligt genom t.ex. f1 {puts "Hej"} men detta funkar inte för den andra varianten. Eftersom a i det fallet är en vanlig parameter måste vi se till att blocket omvandlas till ett Proc-objekt. Det kan vi göra genom att låta det föregås av Proc.new eller lambda. Vi kan alltså skriva era av f2 Proc.new {puts "Hej"} f2 lambda {puts "Hej"} Den här tekniken kan vi använda oss av om vi vill skicka flera olika block till en metod. Som ytterligare stöd för detta behöver vi metoder som kan operera på Proc-objekt. Mer specifikt vill vi i den här uppgiften ha två metoder repeated och compose. 1 (5)

Den första metoden repeated ska ta ett Proc-objekt samt ett positivt heltal och skapa ett nytt Proc-objekt som innebär att man upprepar den givna funktionen så många gånger som angivits. Om man skickar in funktionen f(x) ska alltså resultatet bli f(f(f( f(x)))) dvs funktionen upprepad n gånger. Följande två testfall kan tjäna som utgångspunkt. repeated(lambda { x x*x}, 2).call(5) # ger svaret 625 repeated(lambda { x x+1}, 7).call(5) # ger svaret 12 Den andra metoden compose ska ta två Proc-objekt och utföra funktionskomposition. Om de två funktionerna är f(x) och g(x) ska resultatet alltså vara f(g(x)). Följande testfall kan tjäna som utgångspunkt. compose(lambda { x x+1}, lambda { y y*2}).call(3) # ger svaret 7 Glöm inte att bifoga enhetstester (som även testar andra fall utöver ovanståe) samt programmeringsdagbok. Seminarie 1: Grundläggande Ruby Följande metod gör något med talen i intervallet a till b, men vad? Förklara vad poängen är med programkoden och vad man kan ha den till. Koden finns också i en fil på hemsidan. def acc comb, null_value, term, a, succ, b if a > b null_value else comb.call(term.call(a),acc(comb,null_value,term,succ.call(a),succ,b)) Du kan eventuellt behöva läsa igenom föregåe uppgift. Du kan också använda följande testfall för att köra koden. acc(lambda { x,y x+y}, 0, lambda { x x}, 1, lambda { x x+1}, 6) Inlämning 2: Reguljära uttryck och XML Antag att vi har en textfil som innehåller information om ett antal personer. Formatet framgår av följande exempel: marma112:martin:malmström:800113-1234:tnccc_1:tddb46 TDDB80: urbuv120:urban:uv:800121-1234:tnccc_1:tddb46 TDDB80: berbe101:bertil:bertilsson:800102-1234:tnccc_1:tddb46 TDDB80: Vi vill kunna läsa in sådana textfiler så att informationen hamnar i en array av objekt, där varje objekt innehåller information om en person. Inläsningen ska ske med hjälp av reguljära uttryck och vi vill även anpassa utskriftrutinerna så att informationen skrivs ut som XML. Det hela ska fungera enligt följande körexempel: irb(main):1:0> a = StudentList.new <students> </students> irb(main):2:0> a.read("c:/studenter.txt") nil 2 (5)

irb(main):3:0> a[0] <student id="marma112"> <name>martin Malmström</name> <number>800113-1234</number> irb(main):4:0> a <students> <student id="marma112"> <name>martin Malmström</name> <number>800113-1234</number> <student id="urbuv120"> <name>urban Uv</name> <number>800121-1234</number> <student id="berbe101"> <name>bertil Bertilsson</name> <number>800102-1234</number> </students> Redovisa programkod som löser problemet. På kursens webbsidor finns en exempelfil som kan användas för testning. Seminarie 2: Reguljära uttryck och XML I uppgiften ovan förekom två olika format för att lagra information om personer: ett kompakt format med en person per rad samt XML. I vilka situationer kan det ena formatet vara att föredra framför det andra? Varför? Diskutera för- och nackdelarna med respektive format. Hitta gärna på exempel på situationer eller system där för- och nackdelarna illustreras. Ditt svar bör vara omkring 300 ord. Inlämning 3: Parsning, grammatiker och DSL När man står inför uppgiften att på något sätt bearbeta en textfil med data är ett vanligt tillvägagångssätt att använda t.ex. reguljära uttryck. Ett annat sätt, som vi diskuterat i kursen, är att istället betrakta datafilen som programkod och försöka skriva en parser. Vi betraktar alltså datafilen som om den var skriven i ett begränsat domänspecifik språk (DSL). Det finns en del olika tekniker för att göra detta som är särskilt användbara i Ruby. För den här uppgiften ska du bearbeta en textfil som kan se ut så här: flower "Geranium sylvaticum" swedish "Skogsnäva" height 50 color "Purple" petals 5 Filen innehåller information om ett antal växter. Varje växt inleds med en rad med nyckelordet flower. Därefter kan det följa en eller flera rader med olika nyckelord som ger ytterligare information. Dessa kan komma i vilken ordning som helst, ha olika många argument samt börja med vilka nyckelord som helst (förutom flower). Målet är att skapa en array med information om blommorna i filen, där varje blomma ska representeras som en hashtabell med nyckelorden som nycklar. Det finns en längre exempelfil på kurshemsidan att utgå från. 3 (5)

Seminarie 3: Parsning, grammatiker och DSL Beskriv översiktligt vilka olika tekniker i Ruby för att implementera DSL som vi har gått igenom i kursen. Ditt svar bör vara omkring 300 ord. Inlämning 4: Constraint propagation networks Det första exemplet på constraint networks som vi tittade på i samband med seminarium 4 handlade om logiska grindar. Vi hade programkod för AND-, OR- och NOT-grindar och kunde spåra hur de logiska värdena sant och falskt propagerade genom nätverk som vi byggde upp av dessa. När man använder logiska kretsar i praktiken, inom digitaltekniken, är det vanligt att man använder sig av en särskild typ av grindar som kallas NAND. Man kan se det som en kombination av en NOT- och en AND-grind. Sanningstabellen för NAND ser ut så här, där A och B är indata och Q är utdata: A B Q 0 0 1 0 1 1 1 0 1 1 1 0 Bredvid tabellen ser du också symbolen för en NAND-grund. NAND-grinden ger alltså värdet sant (1) för alla indata, utom när A och B båda är sanna. Det fiffiga med NAND-grinden är dels att den är lätt att bygga i hårdvara, dels att man genom att kombinera NAND-grindar på olika sätt kan bygga upp nätverk som motsvarar alla andra grindar. NAND-grindar är alltså det a man behöver ta med sig till en öde ö. Följande tabell visar hur man kan bygga nätverk som motsvarar våra vanligaste grindar, enbart med hjälp av NAND: För att bygga en NOT-grind AND-grind kombinerar man NAND-grindar så här: Kommentar Man låter det a indatat till NOT-grinden gå till båda portarna på NAND-grinden. Man kombinerar två NANDgrindar på detta sätt. OR-grind Man kombinerar tre NANDgrindar (där de två första i praktiken motsvarar NOT). Du ska nu utgå från koden från seminarium 4 (se kurshemsidan) och utöka den med en NANDgrind. Därefter ska du skrota de gamla implementationerna av AND-, OR- och NOT-grindarna och istället implementera dem genom att bygga upp nätverk av NAND-grindar. Utåt sett ska det funka precis som förut, dvs det ska finnas en klass per grindtyp som man ska kunna instansiera med en eller två indatakanaler, samt en utdatakanal. Bifoga också kod och körexempel som visar att du testat koden. 4 (5)

Seminarie 4: Constraint propagation networks För denna uppgift ska du besvara följande frågor: Vad är deklarativ programmering? Förklara begreppet för någon som kan programmera, men aldrig hört talas om det förut, gärna med exempel. Varför är constraint propagation networks ett exempel på deklarativ programmering? Ge en tydlig motivering. 5 (5)