Försättsblad till skriftlig tentamen vid Linköpings Universitet Datum för tentamen 2015-03-19 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 DAT1 Programmering i Java, datastrukturer och algoritmer IDA 6 (4 teoretiska och 2 praktiska) 8 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-03-19 kl 14 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. 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) Ge ett exempel på ett kodstycke som orsakar ett NullPointerException. (1p) b) Vad är syftet med en konstruktor? (1p) c) Vad innebär det att en metod är överlagrad? (1p) d) Varför används Ordo-notationen för att jämföra tidskomplexitet hos algoritmer, istället för att t.ex. jämföra tiden de olika algoritmerna tar att köra? (1p) e) Vad är syftet med UML? (1p) f) Vad är skillnaden mellan en abstrakt datatyp (ADT) och dess implementation? (1p) 2. (6p) "Datastrukturer" a) Ett binärt sökträd har skrivits ut med en postorder-traversering, vilket resulterade i [ 2 4 3 6 5 1 ]. Rita upp hur det binära sökträdet såg ut. (3p) b) Fältet [ 9 2 7? 4 1 3?? 6??? 5 8 ] representerar ett träd. Frågetecken representerar ett odefinierat värde. Rita upp hur det motsvarande trädet ser ut. (2p) c) Ange i vilken ordning noderna i trädet nedan besöks av en levelorder-traversering och en inorder-traversering. (1p) 1 5 4 2 3
Tentamen TDDC30 2015-03-19 kl 14 3 (8) 3. (6p) "Tidskomplexitet" a) Sortera följande sorteringsalgoritmer med avseende på deras tidskomplexitet i värsta fallet: Selectionsort, Mergesort, Shakersort, Countsort, Heapsort. Svara ordnat med lägst tidskomplexitet först. (2p) b) Ange tidskomplexiteten i värsta fallet, med avseende på n, för följande metoder. (n är alltid ett positivt heltal.) (2p) void foo(int n) { for (int i = 0; i < n; ++i) { System.out.println( Foo! + n); void bar(int n) { if (n % 5 == 0) { for (int i = 0; i < n; ++i) { foo(i); void extrabar(int n) { for (int i = n; i > 0; --i) { bar(i); c) Förenkla följande tre uttryck för tidskomplexitet: (2p) 1) O(nlog(n)) O(10n²) 2) O(n² + 10n + 2) O(3n ⁷) 3) O(n³) + O(167n²)
Tentamen TDDC30 2015-03-19 kl 14 4 (8) 4. (6p) "Algoritmer" a) Sortera värdena [ 6 1 2 7 5 4 3 ] med shellsort, med lucktalen [ 4 2 1 ]. 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) b) Sortera värdena [ 5 4 3 2 1 ] med shakersort. 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) Kan de två sorteringsalgoritmerna ovan implementeras stabila? Ange separat svar för varje algoritm, samt motivera varför. (2p)
Tentamen TDDC30 2015-03-19 kl 14 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. 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, 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 deluppgift, om inget annat anges i uppgiften. Som en bilaga finns även en lista över vanliga unixkommandon.
Tentamen TDDC30 2015-03-19 kl 14 6 (8) 5. (8p) Att organisera uppgifter Mitt bland alla planer för öde öar och annat kul har Stefan hamnat efter i sitt skolarbete och har nu en del att ta igen. Eftersom det är ganska tight med tid så måste han också prioritera det viktigaste först, så att han hinner med allt så gott det går. Dock finns det alltid tid för lite studieflykt i sista minuten, och ett välskrivet Java-program för att klura ut i vilken ordning han ska hantera sina uppgifter vore väl intressant? En heap vore nog bra, där de olika uppgifterna han har gett sig själv kan sorteras efter hur viktiga de är. En uppgift med större viktighet är viktigare än andra med mindre. Om han sedan använder en maxheap så kommer han ju alltid kunna hämta ut den mest viktiga uppgiften från den. Strålande! (Obs, beskrivningen ovan är inte tydlig med att viktigheten uttrycks i en siffra där en mindre siffra är viktigare, dvs uppgift 1, uppgift 2, etc. Information med förtydling gick ut under tentans gång.) En nod från Stefans heap: Värde Importera Stefans projekt från given_files, och hjälp honom med programmet enligt nedan. a) Att lägga till saker i heapen har Stefan redan ordnat, men att ta bort saker har han inte hunnit fixa. Hjälp Stefan skriva sin removetop-metod, och var noggrann med att den uppdaterar heapen i övrigt så att den fortsätter vara en korrekt heap. Vid borttagning så behöver du här inte bevara att heapen är ett fullständigt träd. (6p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.) b) Obs: Har du har bonus på labb 3 och 4 tillgodoräknas du deluppgift 5b och 6b. Just nu kan Stefans heap bara lagra strängar och dess viktighet. Det vore egentligen smidigt om den kunde lagra godtyckliga datatyper med viktighet, och det vore ju en lätt sak att fixa med hjälp av generiska typer. Hjälp Stefan med att uppdatera hans kod så att testprogrammet för del b fungerar. Var noga med att eliminera alla varningar som dyker upp när du gör konverteringen, så att allt blir som det ska! (2p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.)
Tentamen TDDC30 2015-03-19 kl 14 7 (8) 6. (10p) Båt-listan Anna har hört om Stefans planer att köpa sin egen öde ö, och även om det verkar intressant verkar det också lite väl ambitiöst. Något mer realistiskt vore nog att ta en seglar-semester någonstans varmt i ett år eller så. Ju mer Anna tänker på det, desto intressantare verkar det. Men det är ganska mycket som måste ordnas för att det här ska gå vägen, hon måste hitta en båt, rusta upp den och köpa in all kringutrustning som behövs, diverse provision och ha pengar öronmärkta för framtida påfyllningar och reparationer. Det givna sättet att få struktur på situationen är så klart ett välskrivet Java-program! De inköp som måste göras är ju mer eller mindre viktiga, t.ex. så är ju en båt mycket viktigare än matprovisionerna, men matprovisionerna i sin tur mycket viktigare än de skönlitterära böckerna som sedan måste köpas in. Likaså kanske en del saker är lika viktiga för resan, men kostar olika mycket, och då vore det ju vettigast att prioritera den dyraste saken först, för att eliminera de stora hindren först. En prioritetskö borde kunna hjälpa här, tänker Anna.. Importera Annas projekt från given_files, och hjälp henne med programmet enligt nedan. a) Annas prioritetskö behöver en add-metod, som tar in en båtpryl och sorterar in den i kön enligt dess prioritet. Prylens prioritet bestäms i första hand av prioritetsattributet, där lägre är mer prioriterat, och i andra hand av prylens kostnad, där högre är mer prioriterat. När allt är sagt och gjort ska Anna kunna stoppa in saker i prioritetskön i godtycklig ordning och sedan plocka ut dom i prioritetsordningen, så hon vet vad hon måste fixa först. Hjälp henne skriva klart add-metoden. (6p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.) b) Obs: Har du har bonus på labb 3 och 4 tillgodoräknas du deluppgift 5b och 6b. Det här ser ju lovande ut, men det vore smidigt om Anna kunde återanvända den här koden i andra projekt. För att det ska bli riktigt bra borde koden var vettigt och konsekvent namngiven med rätt synligheter. För att strukturera upp hur hon har tänk sig ritar Anna ihop UML-diagrammen nedan, som representerar hur hon vill att hennes klasser ska se ut. Uppdatera Annas klasser så att de följer UML-diagrammen till punkt och pricka. (4p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.) PriorityQueue - Node first + int size() + void insert(...) + Item dequeue() + boolean isempty() Node - Item data # Node next # Node(...) + Item getdata()
Tentamen TDDC30 2015-03-19 kl 14 8 (8) 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