Försättsblad till skriftlig tentamen vid Linköpings Universitet Datum för tentamen 2015-08-28 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) 7 Jonas Lindgren Telefon under skrivtid 013-281403 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: 20 4: 28 5: 36
Tentamen TDDC30 2015-08-28 kl 08-12 2 (7) 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. Alla svar skrivs på lösa blad, där 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 syftet med ett interface? (1p) b) Vad är skillnaden mellan en instansvariabel och en klassvariabel? (1p) c) Vad innebär polymorfi? (1p) d) Varför anses program skrivna i Java vara plattformsoberoende? (1p) e) Vad är skillnaden mellan en abstrakt klass, en vanlig klass och ett interface? (2p) 2. (6p) "Datastrukturer" a) Värdena 7 1 3 2 6 4 5 ligger i en perfekt minheap. Rita upp hur heapen ser ut och hur värdena ligger i den. (2p) b) Organisera om siffrorna i trädet nedan så att trädet utgör ett binärt sökträd. (2p) ( Organisera om siffrorna innebär att pilarna och noderna förblir på samma plats, endast siffrorna får byta plats i bilden.) 9 52 57 5 8 71 4 73 76 c) Ett binärt träd har skrivits ut med en levelorder-traversering samt en inorder-traversering. Rita upp hur det motsvarande trädet ser ut. (2p) Levelorder-traversering: 3 5 2 4 1 Inorder-traversering: 5 4 3 1 2
Tentamen TDDC30 2015-08-28 kl 08-12 3 (7) 3. (6p) "Tidskomplexitet" a) Antag att en enkellänkad lista har tre olika insert-metoder. Ange tidskomplexiteten, samt motivera varför, för: (3p) * En insert-metod som alltid stoppar in elementet först i listan. * En insert-metod som alltid stoppar in elementet sist i listan. * En insert-metod som stoppar in det nya elementet på den x'te platsen i listan, där x är en parameter som anges när metoden körs. b) Ange tidskomplexiteten i värsta fallet, med avseende på n, för följande metoder. (n är alltid ett positivt heltal.) (2p) int foo(int n) { int x = n*n; return x*x; int foofoo(int n) { for (int i = 0; i < 5; i = i+1) { foo(n); return 5; int sum(int n) { int sum = n*n; for (int i = 0; i < n; ++i) { sum += foofoo(i); return sum; c) Förenkla följande uttryck för tidskomplexitet: (1p) O(5 + 2n + 2n²) O(n) + O(n 7 ) 4. (6p) "Algoritmer" a) Sortera värdena [ 5 5 1 4 3 4 0 5 ] 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. Ange tydligt vad som sker under sorteringen. (2p) b) Sortera värdena [ 2 5 8 7 1 3 6 ] 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. (2p) 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. (2p)
Tentamen TDDC30 2015-08-28 kl 08-12 4 (7) 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. Testprogrammet till varje deluppgift ska fungera utan förändringar när tillhörande deluppgift är löst, om inget annat anges i uppgiften. 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, klicka sedan i Select archive file och välj Browse, och välj sedan arkivfilerna för det projekt du vill ha i given_files. Skapa ett nytt projekt i Eclipse för varje deluppgift, om inget annat anges i uppgiften. Gör detta genom att döpa om det gamla projektet till något lämpligt, t.ex. svar_uppgift_a, och sedan importera projektet på nytt för att göra del b. Om du vill fortsätta arbeta med en tidigare lösning kan du även kopiera ditt existerande projekt och arbeta vidare på kopian. Som en bilaga finns även en lista över vanliga unixkommandon.
Tentamen TDDC30 2015-08-28 kl 08-12 5 (7) 5. (8p) Bokhögen Skolstarten har krypt på Anna och hon har fortfarande många bra böcker kvar att läsa. För att hinna klart med åtminstone de allra viktigaste innan nyår så måste hon prioritera! En maxheap där hon kan stoppa in alla sina böcker med en prioritet, och sedan plocka ut dom igen, en och en, när det är dags att läsa dom, vore..egentligen kanske overkill, men lite studieflykt är alltid välkommet! I det här fallet låter hon t.ex. favoritboken få prioritet 100 så att den är mest prioriterad, och sedan kommer de övriga in därefter. En nod från Annas heap: Värde Importera Annas projekt från given_files, och hjälp henne med programmet enligt nedan. a) Implementera färdigt Annas size-metod, så att den räknar antal element i heapen. Den ska implementeras iterativt! (3p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.) b) Det vore smidigt om Anna kunde ändra sin bok-klass så att den kan lagra godtycklig data istället för bara en sträng. Då kan hon göra en datastruktur där hon t.ex. lagrar saker som bokens titel, författare och årtal. Uppdatera all relevant kod så att del b fungerar som den ska. Var noga med att eliminera alla varningar som dyker upp när du gör konverteringen! (2p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.) c) Implementera färdigt Annas depth-metod, så att den räknar ut djupet av heapen. Den ska implementeras rekursivt! Kom ihåg att rotnoden, om den finns, är på djup 0. (3p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.)
Tentamen TDDC30 2015-08-28 kl 08-12 6 (7) 6. (10p) Trädets två aspekter Stefan har knackat ihop ett binärt sökträd, eller åtminstone skelettet till vad som ska bli ett binärt sökträd. Det finns dock mer att göra, och det är där ni kommer in i bilden. En nod från Stefans binära träd: Värde Importera Stefans projekt från given_files, och hjälp honom med programmet enligt nedan. a) Ett binärt sökträd måste ha en add-metod. Stefan har förberett hur metoden ska se ut, men det är upp till er att implementera den. (8p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter, men kan vara svår att testa utan den övriga funktionaliteten.) b) För att kontrollera add-metoden vore en printinorder-metod på sin plats. Stefan har förberett även den. Ni får implementera den på valfritt vis, så länge den bygger på strukturen i det binära sökträdet. (2p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter, men kan vara svår att testa utan den övriga funktionaliteten.)
Tentamen TDDC30 2015-08-28 kl 08-12 7 (7) Intressanta terminal-kommandon eclipse & mkdir målkatalog rmdir målkatalog cd målkatalog cd cp källfil målfil mv källfil målkatalog ls cat filnamn Starta Eclipse Skapa målkatalog Ta bort målkatalog 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 Skriver ut alla filer i aktuell katalog Skriver ut innehållet i filen filnamn