Försättsblad till skriftlig tentamen vid Linköpings Universitet Datum för tentamen 2013-06-05 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 SU18 TDDC30 DAT1 Programmering i Java, datastrukturer och algoritmer IDA 6 (4 teoretiska och 2 praktiska) 7 Jonas Lindgren Telefon under skrivtid 013-282490 Besöker salen ca kl. - Kursadministratör (namn, telefon, mailadress) Tillåtna hjälpmedel Övrigt Anna Grabska Eklund, 013-282362, anna.grabska.eklund@liu.se Inga Information och frågor hanteras genom Tentaklienten. Preliminära poänggränser: 3: 10 4: 14 5: 18
Tentamen TDDC30 2013-06-05 2 (7) 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) Vad skiljer en statisk metod från en icke-statisk? (0.5p) b) Vad är syftet med ett interface? (0.5p) c) Klasser kan placeras i paket. Varför gör man det? (0.5p) d) Vad är syftet med en konstruktor? (0.5p) e) Vad innebär det att en algoritm har tidskomplexiteten O(n)? (0.5p) f) I Car mycar = new Car() sker två separata saker. Vad innebär Car mycar och vad innebär new Car()? (0.5p) 2. (3p) "Datastrukturer" För dessa tre separata binära träd: I 0 II 7 III 4 1 2 9 6 8 3 5 a) Ange vilka av dessa träd, om några, som är: (1p) 1) Fulla 2) Perfekta 3) Fullständiga b) Ange i vilken ordning värdena skulle skrivas ut genom en postorder-traversering för vart och ett av dessa träd. (0.5p) c) Organisera värdena [ 0 1 2 3 4 5 6 7 8 9 ] i en binär maxheap av minimalt djup. Visa med en bild. (0.5p) d) Organisera valfritt antal av värdena [ 0 1 2 3 4 5 6 7 8 9 ] i ett fullt binärt sökträd av så stort djup som möjligt. Visa med en bild. (1p)
Tentamen TDDC30 2013-06-05 3 (7) 3. (3p) "Tidskomplexitet" a) Förenkla följande tre uttryck för tidskomplexitet: (1p) * O(n) O(3n) + O(5n) * O(3n 2 + n) * O(2n) + O(5 + 4n) b) Ange tidskomplexiteten i värsta fallet, med avseende på n, för följande två metoder. (n är alltid ett positivt heltal) (2p) void foo(int n) { for (int i = 0; i < 5; i = i + 1) { for (int j = 0; j < 2*n; j = j + 1) { System.out.println("foo: "+i+" x "+j+": "+(i*j)); void bar(int n) { System.out.println("bar: "+n); if (n!= 0) { foo(n); bar(n/2); 4. (3p) "Algoritmer" a) Sortera värdena [ 1 5 2 6 7 2 4 ] med shellsort med lucksekvensen [ 3 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 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 [ 2 5 2 6 7 1 4 ] med selectionsort. 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 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) c) Kan de två sorteringsalgoritmerna ovan implementeras stabila? Ange separat svar för varje algoritm, samt motivera varför. (1p)
Tentamen TDDC30 2013-06-05 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. 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 2013-06-05 5 (7) 5. (4p) Ko-Klassikern Stefan har fått besked att en av hans fjärran släktingar har avlidit, och lämnat sin gård till Stefan. Om man bortser från dödsfallet så är detta goda nyheter för Stefan, då han på senare tid fått blodad tand för livet på landet! På gården ska det tydligen finnas ett antal nötkreatur, och Stefans dröm om ett stadigt förråd av färska mjölkprodukter kan till slut bli en realitet! Dock finns det ett problem, Stefan har lite problem med att hålla isär alla dessa olika sorters nötkreatur. Kor, tjurar och kalvar, vad är skillnaden egentligen, hur mycket väger de och viktigast av allt, hur mycket mjölk producerar de? För att reda ut skillnaderna har Stefan bestämt sig för att skriva ett enkelt program, där han för varje djur kan få reda på dess namn, en uppskattning av dess vikt och en uppskattning av dess mjölkproduktion. a) Hjälp Stefan skriva klart sitt program. Det ska finnas minst fyra klasser, Animal, Cow, Bull och Calf. Fler klasser är tillåtna. Varje klass ska det sedan gå att köra ett antal metoder på, som ska returnera namn, vikt och mjölkproduktion, respektive. (2p) (Se på hur klasserna används i testprogrammet, det demonstrerar vad rätt svar från programkörningen ska vara. Testprogrammet ska fungera utan ändringar, dock får ni gärna göra egna testprogram.) b) Som en fortsättning på del a vill Stefan lösa problemet med så få metoder som möjligt. Han har funderat på saken, och kommit fram till att det borde inte behövas mer än 5 get-metoder, totalt, bland alla klasser. För att det ska bli lite utmaning kräver Stefan att detta löses utan några som helst klass- eller instans-variabler, förutom name i Animal. (2p)
Tentamen TDDC30 2013-06-05 6 (7) 6. (5p) Den Prioriterade Semestern Anna planerar sin semester för sommaren men det finns så många intressanta resemål att besöka, och hon är inte riktigt säker på vad som är den rätta destinationen för henne. För att underlätta sin planering har hon bestämt sig för att göra en prioritetskö av de hetaste kandidaterna. Dock har hon några tentor som hon också måste plugga och gå upp på, så hon har inte riktigt hunnit skriva klart sin kod. a) Hjälp Anna skriva klart, genom att färdigställa hennes remove-metod. Annas prioritetskö är implementerad som en maxheap som i sin tur lagras i ett fält (I det här fallet en ArrayList). Remove-metoden ska returnera och ta bort det största värdet i prioritetskön, som alltså ligger överst i heapen. Om man ska ta bort det översta värdet och fortfarande ha en korrekt maxheap måste man som bekant flytta upp värdet längst nere till höger i heap-strukturen till toppen, och sedan bubbla ner den till rätt plats. Detta sker genom att man byter plats med den nya noden och dess största barn, och sedan upprepar proceduren tills noden som bubblas ligger på rätt plats. (4p) (Kom ihåg att se till att remove fungerar väl i alla fall, även de som kanske inte testas av det givna testprogrammet. Testprogrammet ska fungera utan ändringar, dock får ni gärna göra egna testprogram.) Till exempel: 9 5 4 3 1 9 tas bort, ersätts av 1. 1 byter plats med dess största barn, 5. 1 byter plats med dess största barn, 3. 1 har ej längre större barn, är på rätt plats. b) En annan tanke Anna har är att det vore trevligt om hon kunde använda sin prioritetskö till annat än bara Strings, som nu är fallet. Gör de ändringar som behövs för att göra Annas prioritetskö generisk, så att testprogrammet för del b fungerar. (1p) (Denna uppgift går att göra utan att del a har lösts.)
Tentamen TDDC30 2013-06-05 7 (7) Vanliga Unix-kommandon mkdir katalognamn rmdir katalognamn cd katalognamn cp källfil målfil mv källfil målkatalog mv orgnamn nyttnamn ls cat filnamn Skapa katalog Ta bort katalog Sätt aktuell katalog 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