Försättsblad till skriftlig tentamen vid Linköpings Universitet Datum för tentamen 2014-03-18 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 DAT1 Programmering i Java, datastrukturer och algoritmer IDA 6 (4 teoretiska och 2 praktiska) 8 Jonas Lindgren Telefon under skrivtid 013-282490 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: 10 4: 14 5: 18
Tentamen TDDC30 2014-03-18 2 (8) Teoretisk del Anvisningar: Uppgifterna i denna del ska lösas med penna och papper. Vid tentamens slut lämnas svaren till denna del in till tentamensvakterna. 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. (3p) "Snabba frågor" Alla svar motiveras väl. a) Varför kan man tänkas vilja dölja metoder och variabler med private? (0.5p) b) Vad är syftet med undantag/exceptions? (0.5p) c) Vad är skillnaden mellan en abstrakt datatyp (ADT) och dess implementation? (0.5p) d) Om en algoritm har tidskomplexiteten O(n) och en annan O(n 2 ), vad innebär det här för skillnad mellan algoritmerna? (0.5p) e) I Animal myanimal = new Animal() sker två separata saker. Vad innebär Animal myanimal och vad innebär new Animal()? (0.5p) f) Vad skiljer en statisk variabel (dvs. en klass-variabel) från en icke-statisk? (0.5p) 2. (3p) "Datastrukturer" a) Ett binärt sökträd har skrivits ut med en preorder-traversering, vilket resulterade i [ 4 2 1 3 7 6 5 9 8 ]. Rita upp hur det binära sökträdet såg ut. (1.5p) b) Är trädet nedan en heap av något slag? Ange svar samt motivera varför/varför inte med minst en heap-egenskap. (0.5p) 2 3 1 5 6 8 7 4 c) Ange i vilken ordning värdena i trädet ovan skulle lagras i fältet, om hela trädet representerades som ett fält. Markera odefinierade värden i fältet med ett frågetecken. (1p)
Tentamen TDDC30 2014-03-18 3 (8) 3. (3p) "Tidskomplexitet" a) Förenkla följande tre uttryck för tidskomplexitet: (1p) 1) O(2n) + O(n 2 ) 2) O(n) O(2n + n) 3) O(2) O(3n 3 ) + O(n) b) Ange tidskomplexiteten i värsta fallet, med avseende på n, för följande metoder. (n är alltid ett positivt heltal.) (1p) void foo(int n) { for (int i = 0; i < n; i = i+1) { for (int j = 0; j < 2*n; j = j+1) { System.out.println(i + " x " + j); void branch(int n) { // is n evenly divisible by 2? if (n % 2 == 0) { bar(n * n * n); void bar(int n) { foo(n); for (int i = 0; i < 5; i = i+1) { foo(i); c) Ange tidskomplexiteten i bästa fallet, med avseende på n, för metoderna ovan. (n är alltid ett positivt heltal.) (1p)
Tentamen TDDC30 2014-03-18 4 (8) 4. (3p) "Algoritmer" a) Sortera värdena [ 5 1 2 7 6 2 4 ] med insertionsort. Gör detta genom att byta plats på värden inom fältet, dvs. in-place. Sorteringen ska leda till stigande ordning, dvs 1, 2, 3, osv. 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. (1p) b) Sortera värdena [ 4 0 1 6 5 1 3 ] med countsort. 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, dvs 1, 2, 3, osv. (1p) c) Vad innebär det att en sorteringsalgoritm är stabil? Ge exempel på en sorteringsalgoritm som kan implementeras stabil, och en som inte kan implementeras stabil. (1p)
Tentamen TDDC30 2014-03-18 5 (8) Praktisk del Anvisningar: Uppgifterna i denna del ska lösas på dator. När alla uppgifter är lösta ska alla filer som ska examineras lämnas kvar på kontot. Uppgifterna ska alltså inte skickas in via tentamenssystemet. 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. För att importera projekt i Eclipse, File Import, sedan General Existing projects into workspace, sedan Browse, och välj projekt i given_files. Viktigt: Glöm inte att kryssa i Copy projects into workspace! Skapa ett nytt projekt i Eclipse för varje uppgift. Det kan även vara en god idé att göra en säkerhetskopia av projektet när man går från t.ex. deluppgift a till deluppgift b. Som en bilaga finns även en lista över vanliga unixkommandon.
Tentamen TDDC30 2014-03-18 6 (8) 5. (4p) Jobb-högen Snart är sommaren här, och denna sommar har Stefan bestämt sig för att han ska ut i arbetslivet och börja arbeta på kontakterna. Det vore trevligt med lite extra pengar i fickan efter sommarens slut, men att få in en fot på rätt företag vore inte heller en dålig idé. Efter en stunds sökande inser Stefan att det finns väldigt många möjliga arbetsplatser att ta ställning till, och han kan ju inte söka jobb hos alla, det skulle ta för lång tid. Han måste prioritera! För att lösa detta tar Stefan alla potentiella arbetsplatser han kan tänka sig och representerar dem som en klass i Java, med de egenskaper han anser relevanta som attribut. Tanken är att han därefter kan använda sig av en väl vald datastruktur för att sortera dessa jobb, och plocka fram de som han bör prioritera när det väl är dags att söka jobb! Importera Stefans projekt från given_files, och hjälp honom med programmet enligt nedan. a) Stefan har nästan skrivit klart sin JobOpportunity-klass, och nu vill han berätta för en kompis om sina planer och hur han har lagt upp sin kod. Det är dock svårt att förklara upplägget med ord och kompisen är inte intresserad nog att vilja läsa Stefans kod. För att kunna glänsa här behöver Stefan något som underlättar förklarandet, han behöver ett UML-diagram som beskriver upplägget! Rita ett klassdiagram för klasserna i data-paketet som anger attribut, metoder och relationer. (1p) (Denna uppgift besvaras skriftligt tillsammans med övriga skriftliga svar.) b) Obs: Har du har bonus på labb 3 och 4 tillgodoräknas du deluppgift 5b och 5c. Stefan har en implementation av en heap sen tidigare som han vill använda för att prioritera de arbetsplatser han väljer mellan. Dock kräver den existerande koden att Stefans JobOpportunity implementerar ett särskilt interface, MyComparable, så att heapen vet hur den ska sortera de här objekten. Gör de förändringar som krävs i JobOpportunity så att heapen sorterar arbetsplatserna i första hand efter lön (sjunkande) och i andra hand prestige (sjunkande). Detta ska göras utan att ändra något i heap-paketet. (2p) c) Obs: Har du har bonus på labb 3 och 4 tillgodoräknas du deluppgift 5b och 5c. Vid närmare eftertanke inser Stefan att det vore trevligt att lägga till en depth-metod till heapen. Lägg till metoden depth, och låt den returnera ett heltal som är det maximala djupet i trädet. (1p) (Då djupet är avståndet från roten har roten alltså djup 0. Träd med mindre än ett element anses ha det maximala djupet 0.)
Tentamen TDDC30 2014-03-18 7 (8) 6. (5p) De ordnade jobben Anna är inne på samma spår som Stefan med att organisera sommarens arbetsmöjligheter, men hon har valt att lägga upp det på ett lite annat sätt. Istället för en heap så har Anna skrivit en cirkulärt dubbellänkad listan för att lagra arbetsplatserna. Hon har kommit en bit på vägen, men är inte riktigt klar än. Importera Annas projekt från given_files, och hjälp henne med programmet enligt nedan. En cirkulärt dubbellänkad lista: a) En annan tanke Anna har är att det vore trevligt om hon kunde använda sin lista till annat än bara JobOpportunity, som nu är fallet. Gör de ändringar som behövs för att göra Annas lista och relaterade delar generisk, så att testprogrammet för del b fungerar. Inga varningar ska finnas kvar. (1p) b) Anna har redan en removefirst-metod för att ta bort det första värdet ur listan, men det vore även bra med en removelast-metod, resonerar Anna. Lägg till den metoden, så att testprogrammet för del c fungerar. (1p) c) Anna har sin add-metod sen tidigare, men den stoppar bara in det nya värdet först i listan för tillfället. Anna vill istället att det JobOpportunity som ska stoppas in läggs till på rätt plats direkt i listan, vid instoppningstillfället. Hon vill sortera arbetsplatserna på möjlig lön, så rätt plats är ordnad på lön (sjunkande). När allt är sagt och gjort ska alltså arbetsplatserna som tas ur listan komma med högst lön först, i testprogrammet för del c. (3p) (Lös denna uppgift som ett separat projekt, då det finns en potentiell konflikt mellan denna deluppgift och deluppgift a.)
Tentamen TDDC30 2014-03-18 8 (8) Vanliga Unix-kommandon mkdir katalognamn rmdir katalognamn cd katalognamn cd cp källfil målfil mv källfil målkatalog mv orgnamn nyttnamn ls cat filnamn Skapa katalog Ta bort katalog Byt aktuell katalog till målkatalog Byt aktuell katalog till din hemkatalog Kopiera fil från källfil till målfil Flytta källfil till målkatalog Byt namn på filen orgnamn till nyttnamn Skriver ut alla filer i aktuell katalog Skriver ut innehållet i filen filnamn