Försättsblad till skriftlig tentamen vid Linköpings Universitet Datum för tentamen 2014-06-11 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) 9 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 2014-06-11 2 (9) 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 skillnaden mellan en abstrakt klass, en vanlig klass och ett interface? (2p) b) Varför anses program skrivna i Java vara plattformsoberoende? (1p) c) Vad innebär det att en algoritm har tidskomplexitet O(n 2 ) och rymdskomplexitet O(n 3 ) i bästa fallet? (2p) d) Vad är syftet med en konstruktor? (1p) 2. (6p) "Datastrukturer" [ 2 7 8 6 5 1 9 3 4 ] a) Arrangera värdena ovan i ett träd av maximalt djup. Svara med en bild av det resulterande trädet. (1p) b) Placera värdena ovan i följande träd så att det blir ett korrekt binärt sökträd. Svara med en bild. (2p) c) Organisera valfritt antal av värdena ovan i en full binär minheap. Svara med en bild, och motivera varför den är full. (2p) d) Ange i vilken ordning noderna i det blanka trädet ovan skulle besökas av en preordertraversering, samt en levelordertraversering. Svara med två bilder, och ange tydligt vilken traversering som är vilken. (1p)
Tentamen TDDC30 2014-06-11 3 (9) 3. (6p) "Tidskomplexitet" a) Förenkla följande tre uttryck för tidskomplexitet: (2p) 1) O(n) + O(2n 2 + 3n) 2) O(n) O(2n 2 + 3n) 3) O(2) O(3n) + O(n) 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) { System.out.println("foo: " + n); for (int i = 0; i < n; i = i+1) { bar(i); bar(n); bar(n); void bar(int n) { System.out.println("bar: " + n); for (int i = n; n > 0; i = i-1) { for (int j = 0; j < 10*n; j = j+1) { System.out.println(i + "*" + j + "=" + (i*j)); void fizz(int n) { System.out.println("fizz: " + n); c) Sortera följande sorteringsalgoritmer med avseende på deras tidskomplexitet i värsta fallet: Bucketsort, Insertionsort, Bubblesort, Quicksort, Heapsort. Svara ordnat med lägst tidskomplexitet först. (2p)
Tentamen TDDC30 2014-06-11 4 (9) 4. (6p) "Algoritmer" a) Sortera värdena [ 6 5 1 2 7 4 2 ] 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 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 [ 4 1 5 6 2 4 ] med bubblesort. 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 insertionsort implementeras stabil? Motivera! (2p)
Tentamen TDDC30 2014-06-11 5 (9) 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 2014-06-11 6 (9) 5. (8p) Semester-planen Anna har bestämt sig för att den här sommaren ska avnjutas med maximalt nöje. För att verkligen få ut det mesta av sommaren vill hon planera vad hon ska göra noga. Hon tänker spika ett antal aktiviteter, och när hon är klar med dessa tänker hon börja om och göra om dom igen och igen, tills dess att sommaren är slut! Detta angreppssätt påminner Anna om något hon lärde sig om i Java-kursen tidigare, en cirkulärt länkad lista! I den kan man ju gå runt och runt hur länge som helst, tills dess att man tröttnar, precis som hon tänker göra med sina sommaraktiviteter! Sagt och gjort, Anna plockar fram sina programmeringsverktyg och börjar arbeta på en cirkulärt länkad lista för att sköta sin planering! Importera Annas projekt från given_files, och hjälp henne med programmet enligt nedan. a) Anna har kommit en bit på vägen på sin cirkulärt länkade lista, men några omtentor i sista minuten har förhindrat henne från att skriva klart riktigt allt. Hjälp henne skriva klart insertmetoden i klassen CircularLinkedList. Den ska ta in strängar som representerar det hon planerat att göra, och placera dessa inuti den länkade listan så att listan blir lexikografiskt sorterad i stigande ordning. Det här innebär helt enkelt att värdena i den länkade listan ska vara sorterade i alfabetisk ordning (ex. aa, ab, bb ). Det här kan verka knepigt på ytan, men Anna vet att i Java har strängar en compareto-metod som kan användas för att jämföra två strängar lexikografiskt. Lös den här uppgiften med hjälp av den. (6p) (Ett Javadoc-utdrag om compareto finns bifogat i slutet av tentamen.) b) I sista minuten kommer Anna på att det nog vore bra att ha en size-metod som returnerar antalet element som finns lagrade i listan. Implementera denna åt henne. (2p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.)
Tentamen TDDC30 2014-06-11 7 (9) 6. (10p) Läskigt läskande Stefan anar att sommaren kommer bli riktigt het i år, och har därför börjat fundera på hur han bäst håller sig sval. Läskande drycker av något slag verkar vara nyckeln, men exakt vilken dryck är den mest läskande av dem alla? Om han köper in ett urval av olika produkter, hur ska ha sedan kunna välja precis rätt dryck, när han står där i hettan och svetten rinner? Stefan anar ett svepskäl för att programmera och sätter igång med en maxheap, sorterad med avseende på en drycks läskighet. En nod från Stefans heap: Värde Importera Stefans projekt från given_files, och hjälp honom med programmet enligt nedan. a) Stefan behöver en metod för att skriva ut alla värden i hans heap, för att kontrollera att allt blev instoppat som det skulle. Han vill att värdena skrivs ut i den ordning som en postordertraversering leder till. Hjälp honom att skriva klart print i MaxHeap. (6p) b) För att kontrollera att heapen är korrekt vore det även bra med en depth-metod som anger djupet på heapen. Han definierar djupet på en heap med endast en nod som 0, och om heapen är helt tom ska ett undantag kastas. Hjälp honom att skriva klart depth. (4p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.)
Tentamen TDDC30 2014-06-11 8 (9) 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
Tentamen TDDC30 2014-06-11 9 (9) public int compareto(string anotherstring) Compares two strings lexicographically. The comparison is based on the Unicode value of each character in the strings. The character sequence represented by this String object is compared lexicographically to the character sequence represented by the argument string. The result is a negative integer if this String object lexicographically precedes the argument string. The result is a positive integer if this String object lexicographically follows the argument string. The result is zero if the strings are equal; compareto returns 0 exactly when the equals(object) method would return true. This is the definition of lexicographic ordering. If two strings are different, then either they have different characters at some index that is a valid index for both strings, or their lengths are different, or both. If they have different characters at one or more index positions, let k be the smallest such index; then the string whose character at position k has the smaller value, as determined by using the < operator, lexicographically precedes the other string. In this case, compareto returns the difference of the two character values at position k in the two string -- that is, the value: this.charat(k)-anotherstring.charat(k) If there is no index position at which they differ, then the shorter string lexicographically precedes the longer string. In this case, compareto returns the difference of the lengths of the strings -- that is, the value: this.length()-anotherstring.length() Specified by: compareto in interface Comparable<String> Parameters: anotherstring - the String to be compared. Returns: the value 0 if the argument string is equal to this string; a value less than 0 if this string is lexicographically less than the string argument; and a value greater than 0 if this string is lexicographically greater than the string argument.