Försättsblad till skriftlig tentamen vid Linköpings Universitet Datum för tentamen 2013-03-27 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) 8 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-03-27 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. 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 innebär polymorfi? (0.5p) b) Vad innebär det att en sorteringsalgoritm är stabil? (0.5p) c) Vad är skillnaden mellan en klass och en instans? (0.5p) d) Vad är syftet med ett interface? (0.5p) e) Vad skiljer synligheten protected från private och public? (0.5p) f) Vad är skillnaden mellan en abstrakt datatyp och dess implementation? (0.5p) 2. (3p) "Datastrukturer" Harry har byggt följande binära trädstruktur: 7 8 6 2 1 4 5 3 a) Ange i vilken ordning siffrorna skulle skrivas ut genom en levelorder-traversering. (0.5p) b) Visa med en bild hur ett träd med värdena [ 3 2 1 6 5 4 8 7 ] skulle kunna se ut om det vore en fullständig binär minheap. (1p) c) Vad innebär att ett träd är fullt? (0.5p) d) Visa med en bild hur det binära trädet som representeras av fältet [ 9 5 _ 4 6 3 _ ] ser ut. (_ innebär en plats i fältet som saknar värde.) (0.5p) e) En preorder-traversering av ett binärt sökträd ger utskriften [ 4 2 3 6 5 7 ]. Visa med en bild hur det binära sökträdet ser ut. (0.5p)
Tentamen TDDC30 2013-03-27 3 (8) 3. (3p) "Tidskomplexitet" a) Antag att en enkellänkad lista har tre olika remove-metoder. Ange tidskomplexiteten, samt motivera varför, för: (1p) * En remove-metod som alltid tar bort det första elementet i den enkellänkade listan. * En remove-metod som alltid tar bort det sista elementet i den enkellänkade listan. * En remove-metod som tar bort det n'te elementet i den enkellänkade listan, där n ä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 två metoder. (2p) void foo(int n) { for (int i = 0; i < n; i = i+1) { for (int j = 0; j < 5; j = j+1) { System.out.println(i + " x " + j); void bar(int n) { foo(n); for (int i = 0; i < n; i = i+1) { for (int j = 0; j < n; j = j+1) { foo(i); for (int i = 0; i < n; i = i+1) { foo(i);
Tentamen TDDC30 2013-03-27 4 (8) 4. (3p) "Algoritmer" [ 1 5 2 6 7 2 4 ] a) Sortera ovanstående fält med sorteringsalgoritmerna nedan, genom att byta plats på värden inom fältet. Sorteringen ska leda till stigande ordning, dvs 1, 2, 3... Ange tydligt i svaret hur fältet ser ut innan varje platsbyte, samt vilka index som är på väg att byta plats. (2p) * Insertionsort * Selectionsort b) Sök fram det 5:e minsta elementet (dvs. på index 4) ur fältet nedan genom att använda en inplace quickselect. Välj alltid värdet längst till höger som pivot-element. Beskriv tydligt varje steg. (1p) [ 2 5 2 6 7 1 4 ]
Tentamen TDDC30 2013-03-27 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. 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-03-27 6 (8) 5. (4p) Den Oändliga Listan Harry experimenterar med länkade listor, och har bestämt sig för att skriva en cirkulär dubbellänkad lista. Han har kommit så långt att han skrivit ett testprogram samt en referenslösning som beter sig som en cirkulärt länkad lista, men i grund och botten inte är det. Han är dock inte riktigt klar med den cirkulärt dubbellänkade listan än, och för att hinna klart har han lejt in dig som sitt ess i skjortärmen. Importera Harrys projekt från given_files och skriv klart! En cirkulärt dubbellänkad lista: a) Harry har än så länge gått bet på remove-metoden för listan. Metoden ska ta in ett index som ett heltal, och ta bort elementet på den platsen. Dock ska den kunna hantera index som är större än storleken på listan, och även negativa index! Index som är större än listan ska leda till att sökningen fortsätter gå runt och runt i listan, tills den har gått så många steg som index anger, sen ska det elementet den landar på tas bort. Negativa index ska innebära att sökningen efter elementet som ska tas bort går baklänges lika många steg som absolutvärdet av index. Även för negativa index ska sökningen kunna fortsätta gå runt och runt på liknande sätt som för stora positiva index. Om det första elementet i den länkade listan tas bort, ska det andra elementet bli det nya första elementet. Implementera denna remove-metod. (3p) b) Harry vill ha ett gemensamt interface för både sin CircularLinkedList och FakeCircularLinkedList. Skapa interfacet CircularLinkedListInterface och låt båda implementationerna av den länkade listan implementera detta. (1p)
Tentamen TDDC30 2013-03-27 7 (8) 6. (5p) FarmTree Stefan gillar mjölkprodukter. Kor är källan till allt gott i världen, och Stefan vill därför hitta ett sommarjobb som låter honom komma närmare kor i sitt vardagliga liv. Att hitta en position som någon slags dräng på en näraliggande gård, och se med egna ögon hur hans favoritmat och dryck produceras, vore toppen! Dock gäller det att hitta rätt ställe att jobba på, inte för långt bort från bostaden, men samtidigt med tillräckligt många kor för att det ska bli en intressant upplevelse. För att lösa detta på bästa sätt har Stefan bestämt sig för att lagra kandidat-gårdarna i ett binärt sökträd, med antal kor som varje gård har som nyckel för just den gården. Detta blir med andra ord en ordbok, som mappar antal kor(heltal) till gårdsnamn(sträng). Importera Stefans projekt från given_files, och arbeta vidare med hans program enligt nedan. Parent En trädnod: Nyckel Värde Left Right a) Ett första steg för att se om hans träd-implementation är korrekt är att skriva en printallmetod, som skriver ut alla nyckel-värdepar i trädet till terminalen, ett par per rad. Detta ska implementeras rekursivt, och paren ska skrivas ut antingen i preorder, levelorder eller postorder, ni får själva välja vilket. Ange tydligt vilken av alternativen ni valde! (2p) Tips. Använd en hjälpmetod. b) Stefans program saknar en korrekt add-metod. Add ska ta in en nyckel och ett värde, och lagra det värdet i trädet på positionen som ges av nyckeln. Hela trädet är ett binärt sökträd med avseende på nyckeln, där mindre nycklar lagras till vänster och större till höger. Implementera denna metod. (3p)
Tentamen TDDC30 2013-03-27 8 (8) 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