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

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

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

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

Data- och programstrukturer

Tentamen i Algoritmer & Datastrukturer i Java

Symboliska konstanter const

Inlämningsuppgift MiniPlotter

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

Tentamen Datastrukturer (DAT036)

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

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

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

Föreläsning 4 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

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

DAI2 (TIDAL) + I2 (TKIEK)

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

TDDC30 Programmering i Java, datastrukturer och algoritmer

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

PROGRAMMERING-Java Omtentamina

Tentamen i. TDDA 69 Data och programstrukturer

Programmering II (ID1019) :00-12:00

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen Datastrukturer för D2 DAT 035

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

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

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Tentamen i Algoritmer & Datastrukturer i Java

tentaplugg.nu av studenter för studenter

Föreläsning Datastrukturer (DAT036)

TDDC30 Programmering i Java, datastrukturer och algoritmer

Tentamen Datastrukturer, DAT037 (DAT036)

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

Tentamen Datastrukturer (DAT036)

Kompilatorer och interpretatorer

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

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

Tentamen ges för: Tentamensdatum: Tid:

Föreläsning 1 Datastrukturer (DAT037)

public boolean containskey(string key) { return search(key, head)!= null; }

Tentamen i. TDDC67 Funktionell programmering och Lisp

Tentamen Datastrukturer D DAT 035/INN960

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

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.

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Programmering II (ID1019) :00-12:00

Föreläsning 9 Innehåll

Tentamen, Algoritmer och datastrukturer

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Programmering II (ID1019) :00-11:00

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

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

Föreläsning 14 Innehåll

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Dugga Datastrukturer (DAT036)

Abstrakta datastrukturer

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

Tentamen Datastrukturer D DAT 035/INN960

Tentamen *:58/ID100V Programmering i C Exempel 3

Tentamen Datastrukturer (DAT037)

Programmering II (ID1019) :00-17:00

Algoritmer och datastrukturer

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

Föreläsning 5. Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Programmering II (ID1019) :00-11:00

Tentamen Programmeringsteknik 2 och MN Skrivtid: Inga hjälpmedel.

Föreläsning 9 Innehåll

Algoritmer. Två gränssnitt

Fredag 10 juni 2016 kl 8 12

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

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

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.

Obligatorisk uppgift 5

Programkonstruktion och. Datastrukturer

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

Programmering för språkteknologer II, HT2011. Rum

TDDC30/725G63. Objektorienterad programmering i Java, datastrukturer och algoritmer

OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

Föreläsning 4 Datastrukturer (DAT037)

Rekursion och induktion för algoritmkonstruktion

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

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

DD1361 Programmeringsparadigm. Carina Edlund

Föreläsning 3. Stack

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

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

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

Grundläggande programmering med C# 7,5 högskolepoäng. Provmoment: Ladokkod: Tentamen ges för: TEN1 NGC011 ADAEK17, ASYST17 samt öppen för alla

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

Föreläsning 3. Stack

Programmering II (ID1019)

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Transkript:

Data- och Programstrukturer Provmoment: Ladokkod: Tentamen ges för: Omtentamen NDP011 Systemarkitektprogrammet 7,5 högskolepoäng Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: 2014-11-17 Tid: 09.00 13.00 Hjälpmedel: Inga hjälpmedel Totalt antal poäng på tentamen: För att få respektive betyg krävs: G >= 22 VG >= 34 45 poäng Allmänna anvisningar: Numrera sidorna samt börja varje ny uppgift på nytt blad. Skriv personnummer på försättsblad och alla inlämnade sidor. Var tydliga, kortfattade och konkreta i era svar. Skriv tydligt (oläsligt = fel)! På programmeringsuppgifterna är principen viktigare än syntaxen. Poängavdrag kan ges för onödigt komplicerade eller ostrukturerade lösningar. Kommandon från bibliotek (även Roberts genlib och strlib) får normalt användas fritt. Om du är osäker skriv ner vad kommandot förväntas göra. Inkluderingar behöver aldrig anges om det inte framgår av frågan. Rättningstiden är som längst tre veckor Viktigt! Glöm inte att skriva namn på alla blad du lämnar in. Lycka till! Ansvarig lärare: Anders Gidenstam Karl Jansson Telefonnummer: 033 435 4214 033 435 4399

1. En symboltabell har ett gränssnitt med operationerna: void Insert(symtabADT table, string key, void *value) Sätter in angivet nyckel, värde par (key, value) i symboltabellen. Om nyckeln redan finns så uppdateras det associerade värdet till value. void* Lookup(symtabADT table, string key) Slår upp nyckeln (key) i symboltabellen och returnerar värdet som hör ihop med nyckeln eller konstanten NOT_FOUND om värdet inte finns. a) Symboltabeller kan implementeras med ett antal olika datastrukturer. Två möjliga datastrukturer är hashtabell och binärt sökträd (utan balansering). Förklara i ord och bild hur symboltabbellen fungerar med respektive datastruktur (hashtabell och binärt sökträd) som underliggande implementation. (4p) c) Förklara begreppen lastfaktor (eng. load factor) och balansering i kontexten av en hashtabell respektive ett binärt sökträd. (2p) d) Tidskomplexitet har använts under kursen för att beskriva hur algoritmer och datastrukturer skalar. Ange tidskomplexiteten för Insert och Lookup när en hashtabell med closed hashing respektive ett balanserat binärt sökträd används för den underliggande implementationen. (4p) 2

2. Betrakta följande rekursiva funktion: public void func(string a, int length) { if (length == 1) { printf(a); return; } for (int i = 0; i < length; i++) { swap(a, i, length-1); func(a, length-1); swap(a, i, length-1); } } public void swap(string a, int i, int j) { char c; c = a[i]; a[i] = a[j]; a[j] = c; } a) Visa i ord och bild hur resultatet av följande anrop till void func(string a,int length) beräknas. func("abc",3); En lämplig nivå är att visa vilka funktionsanrop som sker, deras argument och returvärden. (3p) b) Vad är det för problem som funktionen ämnar lösa? Och vad är den rekursiva ideen som funktionen använder för att lösa problemet? (2p) 3

3. I denna uppgift skall en rekursiv funktion implementeras som vänder på en sträng som skickas som parameter till funktionen. Om ABCD skickas till funktionen så skall funktionen exempelvis returnera DCBA : Skriv en funktion med prototypen string ReverseString(string str); som returnerar en bakvänd version av str. En eller flera hjälpfunktioner och eller wrapperfunktioner kan behövas. För full poäng behöver funktionen även vara svansrekursiv (tail-recursive). (5p) 4

4. En prioritetskö (eng. priority queue) är en abstrakt samlingsdatatyp (ADT) med operationerna void Enqueue(pqueueADT pqueue, int newvalue) Sätter in angivet värde (newvalue) i prioritetskön. Alla heltalsvärden är giltiga datavärden. int DequeueMax(pqueueADT pqueue) Tar bort och returnerar elementet med högst prioritet i prioritetskön. En möjlig implementation av en prioritetskö är en hög (eng. heap) lagrad i ett fält (eng. array) likt den i laboration 2 men som här är av en förbestämd storlek. Nedan följer typdeklarationer för en sådan: typedef struct pqueuecdt *pqueueadt; #define MAXSIZE 128 struct pqueuecdt { int numelements; int elements[maxsize]; }; a) Implementera funktionen void Enqueue(pqueueADT pqueue, int newvalue) för en prioritetskö implementerad som en hög (eng. heap) i C. b) Implementera funktionen int DequeueMax(pqueueADT pqueue) för en prioritetskö implementerad som en hög (eng. heap) i C. (4p) (4p) c) Ange och förklara respektive operations tidskomplexitet (worst-case) uttryckt i antalet element i prioritetskön, N. (2p) 5

5. Som du förmodligen minns från laboration 3 så är MFL ett minimalt lat funktionellt språk som kan köras i en interpretator. Ett uttryck i språket parsars då till en abstrakt syntaxträd som sedan evalueras av en evalueringsfunktion, valueadt Eval(expADT exp, environmentadt env). Eval-funktionen kan brytas ner i underfunktioner utifrån typen på rotnoden i uttrycket exp. I den här uppgiften skall du implementera ett par av dessa underfunktioner i C. Grammatiken/syntaxen för MFL och användbara delar av gränssnitten till interpretatorns övriga delar listas nedanför denna uppgift. Du kan anta att funktionerna i gränssnitten fungerar som de skall (förutom de delar av Eval som du skall implementera själv, förstås). Om ett fel som omöjliggör evaluering av noden upptäcks skall funktionen void Error(string msg) anropas vilken antas avbryta evalueringen. a) Implementera underfunktionen till Eval static valueadt EvalCompound(expADT exp, environmentadt env) i C som evaluerar en nod i syntaxträdet av typen CompoundExp (dvs. heltalsuttryck med operator). Alla deluttryck som evalueras, evalueras i den aktuella miljön. Funktionen skall arbeta mot gränssnitten för expadt, environmentadt och valueadt utan kännedom om den faktiska implementationen. (5p) b) Implementera underfunktionen till Eval static valueadt EvalFuncCall(expADT exp, environmentadt env) i C som evaluerar en nod i syntaxträdet av typen CallExp (dvs. ett funktionsanrop). För att beräkna värdet på ett funktionsanrop måste uttrycket i funktionens kropp evalueras i en miljö där det formella argumentet (en identifierare) är satt till det faktiska argumentet i anropet. För att kunna göra det måste först funktionsvärdet som anropet görs på beräknas. Sedan måste en ny miljö skapas som innehåller funktionens formella argument definierat som uttrycket för det faktiska argumentet samt de definitioner som var synliga där funktionsvärdet skapades. Notera också att miljön som det faktiska argumentet skall evalueras i (när/om det behövs) är den där funktionsanropet sker, vilket man får ta hänsyn till när det formella argumentet definieras. Därefter kan funktionsanropet evalueras genom att beräkna värdet på uttrycket i funktionens kropp i den nya miljön. Funktionen skall arbeta mot gränssnitten för expadt, environmentadt och valueadt utan kännedom om den faktiska implementationen. (5p) Vänd för uppgift c)! 6

c) Parsermodulen för MFL interpretatorn exporterar funktionen expadt ParseExp(scannerADT scanner) som i sin tur består av ett antal underfunktioner för var och en av grammatikens regler: static expadt ReadE(scannerADT scanner); static expadt ReadT(scannerADT scanner); static expadt ReadC(scannerADT scanner); static expadt ReadF(scannerADT scanner); Din uppgift är att implementera underfunktionen till ParseExp, static expadt ReadT(scannerADT scanner); som är ansvarig för att tolka sin input enligt reglerna för symbolen T i grammatiken (som följer nedanför uppgiften) i C. Funktionen skall arbeta mot gränssnittet för expadt utan kännedom om den faktiska implementationen. Om ett syntaxfel upptäcks skall funktionen void Error(string msg) anropas vilken antas avbryta parsningen. Du skall också anta att de andra funktionerna (reade, readc och readf) är färdiga och kan användas vid behov. (5p) 7

MFL Grammatik/Syntax Def ::= identifier = E E ::= T + E E ::= T E E ::= T // Only in files and in the // :define command. T ::= C * T T ::= C / T T ::= C C ::= F (E) C ::= F F ::= (E) F ::= if E RelOp E then E else E F ::= func (identifier) { E } F ::= integer F ::= identifier // Call to function. // If expression // Function expression RelOp ::= = RelOp ::= < RelOp ::= > MFL Kodexempel Definitioner: # Example definitions x = 42 zero = 0 id = func (x) { x } fac = func (n) { if n = 0 then 1 else n*fac(n-1) } Beräkning av uttryck: MFL interpreter (type ":help" for help) > 1+3*4 13 > :load test.mfl > x 42 > fac(4) 24 > fac <function with one argument> > func (x) { 2*x } <function with one argument> > func (x) { 2*x }(3) 6 > 8

MFL Modulgränssnitt för exp-modulen typedef struct expcdt *expadt; typedef enum { FuncExp, IfExp, CallExp, ConstExp, IdentifierExp, CompoundExp } exptypet; /* expadt constructor functions */ expadt NewFuncExp(string arg, expadt body); expadt NewIfExp(expADT lhs, char relop, expadt rhs, expadt ifpart, expadt elsepart); expadt NewCallExp(expADT func, expadt arg); expadt NewIntegerExp(int n); expadt NewIdentifierExp(string id); expadt NewCompoundExp(char op, expadt lhs, expadt rhs); /* expadt selector functions */ exptypet ExpType(expADT exp); /* For FuncExprExp */ string GetFuncFormalArg(expADT exp); expadt GetFuncBody(expADT exp); /* For IfExp */ expadt GetIfLHSExpression(expADT exp); expadt GetIfRHSExpression(expADT exp); char GetIfRelOp(expADT exp); expadt GetIfThenPart(expADT exp); expadt GetIfElsePart(expADT exp); /* For FuncCallExp */ expadt GetCallExp(expADT exp); expadt GetCallActualArg(expADT exp); /* For ConstExp */ int ExpInteger(expADT exp); /* For IdentifierExp */ string ExpIdentifier(expADT exp); /* For CompoundExp */ char ExpOperator(expADT exp); expadt ExpLHS(expADT exp); expadt ExpRHS(expADT exp); 9

MFL Modulgränssnitt för env-modulen typedef struct environmentcdt *environmentadt; environmentadt NewEnvironment(); environmentadt NewClosure(environmentADT parent); valueadt GetIdentifierValue(environmentADT env, string name); void DefineIdentifier(environmentADT env, string name, expadt exp, environmentadt context); MFL Modulgränssnitt för value-modulen typedef enum { FuncValue, IntValue } valuetypet; typedef struct valuecdt *valueadt; /* valueadt constructor functions */ valueadt NewFuncValue(string formalarg, expadt body, environmentadt closure); valueadt NewIntegerValue(int val); /* valueadt selector functions */ valuetypet ValueType(valueADT value); /* For IntValue */ int GetIntValue(valueADT value); /* For FuncValue */ environmentadt GetFuncValueClosure(valueADT value); string GetFuncValueFormalArg(valueADT value); expadt GetFuncValueBody(valueADT value); Modulgränssnitt för scanneradt scanneradt stöder (bl.a.) följande operationer: string ReadToken(scannerADT scanner); bool MoreTokensExist(scannerADT scanner); void SaveToken(scannerADT scanner, string token); 10