Försättsblad till skriftlig tentamen vid Linköpings Universitet Datum för tentamen 2016-03-21 Sal Tid 14:00 18:00 Kurskod Provkod Kursnamn/benämning Institution Antal uppgifter som ingår i tentamen Antal sidor på tentamen (inkl. försättsbladet) Jour/kursansvarig Samling i korridoren vid SU17/18 TDDC30, 725G82 DAT1 Programmering i Java, datastrukturer och algoritmer IDA 6 (4 teoretiska och 2 praktiska) 8 Erik Nilsson Telefon under skrivtid 013-284676 Besöker salen ca kl. - Kursadministratör (namn, telefon, mailadress) Tillåtna hjälpmedel Övrigt Åsa Kärrman, 013-285760, asa.karrman@liu.se Inga Information och frågor hanteras genom Tentaklienten. Preliminära poänggränser: 3: 22 G: 22 4: 30 VG: 33 5: 37
Tentamen TDDC30 2016-03-21 kl 14-18 2 (8) Teoretisk del Anvisningar: Uppgifterna i denna del ska lösas med penna och papper på lösa blad. Vid tentamens slut lämnas svaren till denna del in till tentamensvakterna. Du kan även lämna in till tentavakterna under tentans gång så rättar vi om vi hinner (ingen kompletteringsmöjlighet ges dock). Det är även okej att skicka in svar på teoriuppgifter via tentasystemet (i en textfil per uppgift). Uppgift 2 och 4 kräver dock att ni ritar, så där vill vi ha in svaren på papper. Då svar skrivs på lösa blad, markeras varje deluppgift tydligt markeras. Endast en sida av bladet används. Varje blad markeras högst upp med personnummer och sidnummer. Viktigt: Starta en tentaklient genom att högerklicka på skrivbordet, för att kunna ta del av allmän information och kunna ställa frågor. 1. (6p) "Snabba frågor" Alla svar motiveras väl. a) Vad är skillnaden mellan en instansvariabel och en klassvariabel? (1p) b) Hur kan man från en subklass komma åt en metod som ligger i superklassen? (1p) c) Vad innebär nyckelordet extends i Java? (1p) d) Vad är skillnaden mellan ett RuntimeException och ett Exception i Java. (1p) e) Vad är syftet med ADT:erna stack och kö, när ADT:n lista tycks göra samma sak, fast mer?
Tentamen TDDC30 2016-03-21 kl 14-18 3 (8) 2. (6p) "Datastrukturer" a) Antag att vi har en kö Q som är tom från början. Beskriv vad som händer och rita hur kön ser ut efter varje steg när man kör operationerna nedan (i ordningen uppifrån och ned). Q.enqueue(a) Q.enqueue(b) Q.dequeue() Q.enqueue(c) Q.dequeue() Q.dequeue() b) Antag att vi har ett binärt sökträd BT som ser ut som i bilden nedan. Beskriv vad som händer och rita hur trädet ser ut när man kör operationerna nedan (i ordningen uppifrån och ned). BT.add(4); BT.remove(8); 6 52 57 1 5 78 c) Rita upp ett exempel på hur elementen 1, 1, 3, 4, 5, 6, 6, 6, 8 skulle kunna ligga i en maxheap. 79
Tentamen TDDC30 2016-03-21 kl 14-18 4 (8) 3. (6p) "Tidskomplexitet" a) Ange och motivera tidskomplexiteten för följande metoder för en enkellänkad lista: (3p) * Metoden insert(e) som lägger till ett nytt element e först i listan. * Metoden remove(e) som tar bort elementet e ur listan. * Metoden iterator() som returnerar en iterator till listan. b) Ange tidskomplexiteten i värsta fallet, med avseende på n, för följande metoder. (n är alltid ett positivt heltal.) int looper1(int n) { int sum = 0; for (int k = 0 ; k < 10 ; k = k+1) { for (int j = 0 ; j < 3*n ; j = j+1) { for (int i = n ; i > 0 ; i = i-1) { sum = sum + i; return sum; int mille(int n) { return looper1(1000); int millemille(int n) { return 1000*1000*n; c) Förenkla följande uttryck för tidskomplexitet: (1p) O(3n ⁵ + n ⁷) + O(n*log(n))
Tentamen TDDC30 2016-03-21 kl 14-18 5 (8) 4. (6p) "Algoritmer" a) Sortera värdena [ 5 5 4 1 4 3 0 5 ] med mergesort. Var noga med att ange vad som sker i varje steg, så att det går att följa processen från början till slut. Sorteringen ska leda till stigande ordning, d.v.s. 1, 2, 3, o.s.v. Ange tydligt vad som sker under sorteringen. b) Sortera värdena [ 2 5 8 7 1 3 6 ] med selectionsort. Sorteringen ska leda till stigande ordning, d.v.s. 1, 2, 3, o.s.v. Ange tydligt i svaret hur hela fältet ser ut innan varje platsbyte, samt vilka index som är på väg att byta plats, med maximalt ett byte per steg. c) Hur kan en sorteringsalgoritm som har tidskomplexitet O(n²) i praktiken vara snabbare än en sorteringsalgoritm som har tidskomplexitet O(nlog(n))?
Tentamen TDDC30 2016-03-21 kl 14-18 6 (8) Praktisk del Anvisningar: Uppgifterna i denna del ska lösas på dator. När alla uppgifter är lösta ska uppgifterna skickas in via tentasystemet. Tänk på att bifoga alla filer som behövs för att köra programmet för uppgift 5 resp. 6. Du kan också exportera projektet som en zip-fil och skicka in denna. Viktigt: Starta en tentaklient genom att högerklicka på skrivbordet, för att kunna ta del av allmän information och kunna ställa frågor. Försök att lösa alla uppgifter så långt som möjligt. Om du inte kan lösa en uppgift, förenkla uppgiften. Glöm i så fall inte att beskriva förenklingen med en tydlig kommentar i koden. Poängavdrag ges beroende på förenklingens storlek. Tänk på läsbarhet och namngivning, och även på variablers och metoders synlighet. Ni behöver inte skriva javadoc för er kod. Skapa ett projekt i Eclipse för vardera uppgift. Vanligtvis finns det givna filer för uppgifterna. De givna filerna ligger i mappen given_files. Om det bara är en javafil är det enklast att kopiera in koden till ditt projekt. Om det är projektfiler så kan du importera till Eclipse, File Import, sedan General Existing projects into workspace, klicka sedan i Select archive file och välj Browse, och välj sedan arkivfilen i given_files. Därefter kan ni välja vilja projekt ni vill importera från arkivet. Här är några vanliga unixkommandon: ls cd mappnamn cd.. cp från till lista alla filer i den mappen du står byt till mapp gå upp ett steg kopiera fil BONUS: Om du har bonus från labserien så får du lika många bonuspoäng som avklarade poäng i den praktiska delen (dock maximalt 5 poäng). Om du exempelvis får 3 poäng på den praktiska delen så får du ytterligare 3 bonuspoäng. 6 poäng och mer ger alltså bara 5 bonuspoäng. Du kan förstås ej överskrida tentans maxpoäng.
Tentamen TDDC30 2016-03-21 kl 14-18 7 (8) 5. (10p) Marinan Du har blivit anlitad av en marina som vill ha ett register över sina båtar och båtägare. För detta behöver du skapa klasser för olika typer av båtar, båtägare och själva marinan. Här är ett översiktligt klassdiagram: SailBoat Boat 1..N 1 Marina 1..N 1 1..N 1 MotorBoat BoatOwner I mappen given_files finns ett litet testprogram där vi visar hur det är tänkt att man skall instansiera de olika objekten och hur man skall kunna använda dem. a) Implementera klasserna i diagrammet ovan så att första delen av testprogrammet går att köra. Alla instanser av typen Boat har ett namn (en sträng) och ett djupgående. Djupgåendet mäts i meter (ett flyttal) och mäter hur djupt båten går ner på det djupaste stället. Detta är intressant för marinan eftersom båtar med mindre djupgående kan ha en bryggplats som är närmre land. Segelbåtar har också en segelyta (ett heltal) som anger hur stor totalyta seglen har. Motorbåtar har inte segelyta utan har istället ett heltal som beskriver hur många hästkrafter motorn har. Båtägare har alltid ett namn (både för- och efternamn i en sträng). En båtägare kan äga godtyckligt antal båtar och har metoden add(boat) som lägger till en båt till ägaren. Marinan har också ett namn (en sträng) och håller koll både på alla båtägare och alla båtar. Marinan har därför en metod addowner(boatowner) som läger till en ägare och alla dess båtar till marinan. Det skall även finnas en metod add(boat) så att man kan lägga till båtar som inte har någon specifik ägare. Slutligen skall det även finnas en metod getboatswithdepthlessthan(double d) som returnerar en lista med alla båtar som har ett djupgående på d eller mindre. Tänk på att hålla instansvariabler privat. Tänk på i vilken klass du lägger implementation. (6p) b) Du skall nu lägga till metoden printownerregister() i klassen Marina. Se testprogrammet för hur vi har tänkt att utskriften skall se ut. Observera att de båtar som inte har någon ägare inte skall skrivas ut av denna metod. (Denna deluppgift kan lösas oberoende av deluppgift c). c) Du skall nu lägga till metoden getownerforboat() i klassen Marina. Metoden skall returnera en viss båts ägare. Om båten som söks inte har någon ägare så skall undantaget NoOwnerForBoatException kastas. Om båten inte finns överhuvudtaget i Marinan så skall undantaget NoSuchBoatException kastas. Undantagen skall ärva från klassen Exception (ej RuntimeException). Modifiera testprogrammet så att det fungerar med din nya kod. (Denna deluppgift kan lösas oberoende av deluppgift b).
Tentamen TDDC30 2016-03-21 kl 14-18 8 (8) 6. (10p) Släktträd Du har fått i uppdrag från släktens överhuvud att du skall börja släktforska. Till din hjälp gör du självklart ett program som klarar av detta. Du skall i denna uppgift skapa klassen FamilyMember som representerar släktträdet. En FamilyMember har följande egenskaper: namn children En sträng som representerar vad personen heter. En uppsättning FamilyMember som representerar denna persons barn. Man kan ha godtyckligt många barn. a) Implementera följande metoder i FamilyMember: FamilyMember(String) addchild(familymember) getchildren() Metoderna skall ha tidskomplexitet O(1). (Konstruktor), tar personens namn. Lägger till ett barn till personen. Hämtar en persons alla barn som en List. (4p) b) Gör nu en testklass FamilyTreeTest som testar dina metoder. Representera följande släkt i ditt program: Marielle Stefan Gunilla Emma Gustav Love Ivana c) Du skall nu lägga till följande metoder i FamilyMember: printpreorder() Gör en preorder-traverering på trädet och skriver ut dess medlemmar. d) printlevelorder() Gör en levelorder-traversring på trädet och skriver ut dess medlemmar. Metoderna i (c) och (d) skall gå i O(n). Metoderna skall skriva ut en familjemedlem per rad.