Försättsblad till skriftlig tentamen vid Linköpings Universitet Datum för tentamen 2016-03-21 Sal Tid 08:00 12: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 08-12 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 variabel deklarerad lokalt i en metod? (1p) b) Vad skulle det innebära att konstruktorn i en klass har synlighet protected? (1p) c) Vad är skillnaden mellan en abstrakt klass och ett interface? (1p) d) Vad innebär nyckelordet throws i Java? (1p) e) Varför är det bättre att sätta instans/klassvariabler till private och låta dem kommas åt m.h.a. get-metoder än att låta dem vara public?
Tentamen TDDC30 2016-03-21 kl 08-12 3 (8) 2. (6p) "Datastrukturer" a) Antag att vi har ett binärt träd BT som ser ut som i bilden nedan. I vilken ordning besöker man elementen i BT om man använder sig av i) Level-ordertraversering? ii) In-ordertraversering? 52 3 5 1 4 76 b) Antag att vi har en prioritetskö PQ med heltal som nycklar och strängar som värden. PQ är implementerad med en min-heap. Beskriv vad som händer och rita heapen efter varje steg då vi kör följande operationer (i ordningen uppifrån och ned). PQ är tom från början. PQ.insert(3, "Risk"); PQ.insert(8, "Fia"); PQ.insert(5, "Poker"); PQ.removeMin(); PQ.insert(1, "Yatzy"); PQ.removeMin(); 7 c) Fältet A har följande element: 1, 4, 5, 6, 7, 10, 15, 20. Rita upp det binära träd vars fältrepresentation motsvarar A.
Tentamen TDDC30 2016-03-21 kl 08-12 4 (8) 3. (6p) "Tidskomplexitet" a) Ange och motivera tidskomplexiteten för följande metoder för ett binärt sökträd: (3p) * Metoden add(e) som lägger till ett element e i trädet. * Metoden remove(e) som tar bort ett element ur trädet. * Metoden root() som returnerar elementet som ligger i trädets rot. 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 i = 0; i < n/2; ++i) { sum = sum + i; return sum; int looper2(int n) { int sum = 0; for (int i = 0; i < 10; ++i) { sum = sum + looper1(n); return return sum; int addsums(int n) { return looper1(n) + looper2(n); c) Förenkla följande uttryck för tidskomplexitet: (1p) O(2nlog(n) + n²) O(log(n))
Tentamen TDDC30 2016-03-21 kl 08-12 5 (8) 4. (6p) "Algoritmer" a) Sortera värdena [ 5 5 1 4 3 4 0 5 ] med shellsort med lucksekvensen 4, 2, 1. 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 shaker-sort. 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) Vad innebär det att en sorteringsalgoritm är in-place? Ge exempel på en sorteringsalgoritm som kan implementeras in-place, och en som inte kan implementeras in-place (utan att försämra tidskomplexiteten).
Tentamen TDDC30 2016-03-21 kl 08-12 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 08-12 7 (8) 5. (10p) Videobutiken Du har blivit anlitad av videobutiksbolaget Hollyvoodo AB för att skapa ett datasystem för deras verksamhet. Företaget har flera butiker ute i landet. För detta system behöver du skapa klasser för DVD-filmer, BluRay-filmer (och andra saker som går att hyra, t.ex. tv-spel) och för själva butiken. Här är ett översiktligt klassdiagram: Rentable 1..N 1 HollyvoodoStore DVD BluRay VideoGame 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 Rentable har namn (en sträng) och ett antal dagar (ett heltal) som man får hyra den. DVD:er får hyras i tre dagar. BluRay-filmer får hyras i två dagar. TV-spel får hyras i en vecka. Instanser av typen HollyvoodoStore har adresser (en sträng) och ett godtyckligt antal Rentable-objekt. Klassen behöver även en metod add som lägger till Rentable-objekt till butikens utbud. Slutligen behövs en metod rent som tar in namnet på det som kunden vill hyra och returnerar motsvarande Rentable-objekt, samtidigt skall butiken säga (skriva ut i terminalen) om hur många dagar som objektet skall lämnas tillbaka till butiken. I testprogrammet har vi skrivit kommentarer för att du skall se hur det skall se ut. (TIPS: Tänk på att strängars innehåll jämförs med metoden compare). Tänk på att hålla instansvariabler privat. Det skall inte gå att skapa instanser av typen Rentable, endast dess subtyper. Tänk på i vilken klass du lägger implementation. (5p) b) Du skall nu lägga till lite felhantering till systemet. Om man försöker hyra något som inte finns i butikens utbud skall butiken kasta ett undantag av typen NoSuchRentableException. Undantaget skall ärva från klassen Exception (ej från RuntimeException). Undataget skall på något sätt lagra namnet på det objekt som inte kunde hyras. Uppdatera testprogrammet så att det fungerar för koden som du har lagt till. (Denna deluppgift kan lösas oberoende av deluppgift c). c) För butikens stamkunder skall det nu gå att iterera över butikens utbud. Låt klassen HollyvoodoStore implementera interfacet Iteraterable. Skapa klassen HollyvoodoIterator som implementerar Iterator. Metoden hasnext() skall returnera sant så länge det finns Rentableobjekt som inte hyrts, falskt annars. Metoden next() skall hyra nästa Rentable-objekt i butiken. Metoden remove() behöver inte göra något speciellt. (Du kan t.ex. skriva ut "funkar inte"). (Denna deluppgift kan lösas oberoende av deluppgift b). (3p)
Tentamen TDDC30 2016-03-21 kl 08-12 8 (8) 6. (10p) Biltvätten En mack har anlitat dig för att göra ett datorsystem till deras biltvätt. De har själva fått ihop klassen Car (finns i mappen given_files). Du skall nu implementera klassen CarWash. Mackens biltvätt är ganska avancerad! Det är i princip en lång tunnel som klarar av godtyckligt många bilar åt gången. Det är givet att bilar kommer ut ur tvätten i samma ordning som de körs in. a) Implementera följande metoder: driveintowash(car) Tar en bil som parameter och kör in den i biltvätten längst bak. getoutofwash() Tar bilen som är längst fram i tvätten och kör ut den (returneras). noofcarsinwash() Returnerar antalet bilar i tvätten just nu. Samtliga metoder skall ha tidskomplexitet O(1). (4p) b) Macken har nu lanserat sin biltvätt på ett mer allmänt sett. De tänker nu bygga liknande tvättar för andra typer av objekt, t.ex. cyklar, gruvutrustning, pengar. För att lösa detta skall du göra en ny klass Wash (döp om din CarWash-klass) och göra denna generisk. Man skall alltså nu kunna instansiera en Wash på följande sätt: Wash<Car> mycarwash = new Wash<Car>(); (Denna deluppgift kan lösas oberoende av övriga deluppgifter.) (3p) c) Du skall nu ändra metoden driveintowash så att den även tar en heltalsparameter howdirty. Ändra strukturen i CarWash (eller Wash om du har gjort del b) så att när man anropar getoutofwash så får man ut det objekt som har minst värde på howdirty. Metoderna får inte ha högre tidskomplexitet än O(n). (3p) (Denna deluppgift kan lösas oberoende av övriga deluppgifter.)