Försättsblad till skriftlig tentamen vid Linköpings Universitet Datum för tentamen 2014-08-29 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) 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 2014-08-29 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) Vad är skillnaden mellan synligheterna public, private och protected? (1p) b) Vad innebär det att en algoritm har tidskomplexitet O(n 2 ) och rymdskomplexitet O(n) i värsta fallet? (2p) c) Vad är skillnaden mellan en instansvariabel och en klassvariabel? (1p) d) Vad är syftet med ett interface? (1p) e) Vad innebär polymorfi? (1p) 2. (6p) "Datastrukturer" 3 4 1 5 6 9 8 a) Är trädet ovan ett binärt sökträd? Motivera svaret! (1p) b) Organisera om siffrorna i trädet ovan så att trädet utgör antingen en binär minheap eller en binär maxheap. Svara med en bild. Ange också vilken typ av heap du valde, och motivera varför trädet utgör antingen en maxheap eller minheap. (3p) ( Organisera om siffrorna innebär att pilarna och noderna förblir på samma plats, endast siffrorna får byta plats i bilden.) c) Ange i vilken ordning värdena i trädet ovan skulle lagras i fältet, om hela trädet representerades som ett fält. Markera odefinierade värden i fältet med ett frågetecken. (2p)
Tentamen TDDC30 2014-08-29 3 (8) 3. (6p) "Tidskomplexitet" a) Antag att det finns ett osorterat fält med tillhörande remove-metoder för att ta bort enskilda värden. Ange tidskomplexiteten för varje remove-metod, samt motivera varför, för: (4p) 1) En remove-metod som alltid tar bort det första värdet i fältet. 2) En remove-metod som alltid tar bort det sista värdet i fältet. 3) En remove-metod som tar bort ett visst värde från fältet, värdet som ska tas bort angivet när metoden anropas. Finns flera kopior av det värdet, tas bara det första som hittas bort. (Om ditt svar bygger på något antagande som du är osäker på, ange även det antagandet.) b) Förenkla följande tre uttryck för tidskomplexitet: (2p) 1) O(7) + O(3n) 2) O(7) O(1 + 3n + n) 3) O(5n 3 ) O(5n 3 ) 4. (6p) "Algoritmer" a) Sortera värdena [ 2 7 1 3 9 5 6 4 8 ] 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 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 7 6 2 5 ] med quicksort. 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. Förklara även hur pivot-strategin du använde väljer pivot-element. (2p) c) Kan de två sorteringsalgoritmerna ovan implementeras stabila? Ange separat svar för varje algoritm, samt motivera varför. (2p)
Tentamen TDDC30 2014-08-29 4 (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 2014-08-29 5 (8) 5. (8p) Läxhögen Nu när skolan börjar dra igång på allvar har Anna börjat planera hur hon ska lägga upp sina studier. I år ska allt göras i tur och ordning, har hon bestämt. En sak i taget, ordning och reda. För att få lite struktur på det hela plockar hon fram sina programmeringsfärdigheter och sätter igång på ett litet program som ska lösa detta med hjälp av en stack! Importera Annas projekt från given_files, och hjälp henne med programmet enligt nedan. a) Anna minns något vagt om en speciell metod klasser bör ha och hur inkapsling innebär privata klassvariabler, men hon har inte riktigt hunnit fixa klart detta. Skriv klart Node-klassen åt Anna så att den är korrekt inkapslad, och uppdatera övrig kod så att den fortfarande fungerar. (3p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.) b) Några viktiga metoder saknas fortfarande i Stack-klassen. Skriv klart dessa åt Anna så att de följer specifikationen i kommentarerna. (5p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.)
Tentamen TDDC30 2014-08-29 6 (8) 6. (10p) Kurskodsträdet Stefan har börjat titta på alla kurser han kommer läsa fram till sommaren, och har kommit fram till att det är rätt många att hålla reda på. Det vore bra om han kunde hitta något sätt att organisera dessa så att han inte glömmer bort något. Som en blixt från klar himmel inser han att det här är ett prima läge för lite studieflykt, och han sätter sig prompt ned och börjar skriva ett Java-program för att göra detta. Planen är ett binärt träd, där han lagrar alla kurser som strängar baserat på kurskod och namn, och låter det binära trädet sortera därefter. 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) Stefan behöver en metod för att stoppa in värden i det binära trädet. Skriv klart add-metoden enligt specifikationen i den tillhörande kommentaren. Åt vilket håll det binära trädet är sorterat väljer du själv. Att sortera strängar kan verka knepigt, men Stefan 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) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.) (Ett Javadoc-utdrag om String.compareTo finns bifogat i slutet av tentamen.) b) Det vore bra om Stefan kunde kontrollera att föregående metod fungerar som den ska. Det brukar dock bli lite knepigt att kontrollera det för hand, men lite ytlig insikt kan han få genom att helt enkelt kontrollera att en ny nod stoppats in efter varje add-anrop. Till detta behöver han en size-metod. Hjälp honom skriva klart denna. Denna metod får inte använda sig av en räknevariabel i klassen som räknar antalet gånger add anropas, utan måste räkna antalet noder som faktiskt finns i trädet för att producera svaret. (4p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter, men blir svårare att testa utan att ha gjort a) först.)
Tentamen TDDC30 2014-08-29 7 (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
Tentamen TDDC30 2014-08-29 8 (8) 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.