Tentamen i.. TDDC30/725G63 Objektorienterad programmering i Java, datastrukturer och algoritmer Datum 2012-12-21 Tid 14-18 Provkod DAT1 Institution Institutionen för Datavetenskap (IDA) Jour Johan Janzén tel. 282490 Kursadministratör Helene Meisinger Antal uppgifter 6 Maximalt antal poäng 24 Preliminära betygsgränser U: 0-11 poäng 3: 12-15 poäng 4: 16-20 poäng 5: 21-24 poäng Anvisningar: Omotiverade svar ger noll poäng! Tentamen består av två delar: en teoretisk och en praktisk. Den teoretiska delen löses med papper och penna som en traditionell tentamen och lämnas in till tentavakt när du avslutar tentan Börja varje uppgift på nytt papper Skriv namn och personnummer på varje inlämnat blad Numrera varje inlämnat blad Den praktiska delen löses på datorn anvisad vid tentamenstillfället. Efter tentamen lämnas alla filer som ska examineras kvar på kontot Frågor angående tentan kan ställas via studentklienten. Notera dock att detta inte är en grundkurs i programmering, somliga saker förväntas du kunna.
Teoretisk del Denna del ska lösas med penna och papper. Vid tentamens slut lämnas denna del in till tentamensvakterna. Glöm inte att motivera dina svar! 1. Motivera kort huruvida följande påståenden är sanna a) Jämförelseoperatorn "==" och funktionen Object.equals() är ekvivalenta (0.5p) b) Träd representeras alltid bäst med arrayer (0.5p) c) Om en funktion tillhör O(n²log(n) ) och Ω(n²log(n) ), då tillhör den Θ(n²log(n) ). (0.5p) d) I ett sökträd finns alltid största talet i roten (0.5p) e) Om en sorteringsalgoritm är stabil garanteras att den kan sortera alla möjliga permutationer av indata (0.5p) f) Interfaces kan inte instantieras (0.5p) 2. En bugg i ett system medför att ett binärt sökträd har blivit förstört. Som tur är finns en postordertraversering av trädet sparat på fil, se siffrorna nedan. a) Återskapa exakt den tidigare strukturen och rita upp trädet. Som svar räcker det med att du ritar upp trädstrukturen. (2p) b) Vilka av följande egenskaper har trädet? Motivera (1p) fullständigt heapsorterat fullt 18 22 42 27 61 19 89 78
3. Erik har en filserver för alla icke-upphovsrättsskyddade filmer han laddar ner. Då filmer tar upp mycket plats vill han skiva ett program som vid behov automatiskt tar bort den film han inte öppnat på längst tid. Tanken är att funktionen ska köras automatiskt så snart filserverns minne börjar ta slut. a) Vilken abstrakt datayp är lämplig att använda för att spara information om filmerna, givet ovanstående användningsområde? Nämn även en lämplig representation för ADT-n. (1p) b) Rita ett klassdiagram för programmet: Klassen MemoryHandler ska bestå av (bland annat) en Movies, och har därför ett sådant, privat, attribut. Movies är ett interface med de publika metoderna Path removeoldestaccess() och void addmovie(path pathtomovie). Låt din datatyp från a) implementera Movies. (1p) Erik vill även i samma program få fram en lista av alla sina filmer. Listan ska vara sorterad i första hand efter speltid (han gillar långa filmer) och i andra hand efter hur länge sedan han såg den. Eftersom quicksort sorterar mycket snabbt i medelfallet väljer han att implementera radixsort med quicksort för varje nyckel för sitt program. Precis när han är klar inser han dock att han har gjort två misstag i sina val! 0 av 2, inte bra. c) Vilka två misstag har han gjort? Beskriv hur du skulle implementera detta och varför. (1p) 4. Det minsta talet i ett binärt sökträd är alltid längst till vänster. Man skulle kunna sortera elementen genom att upprepat ta bort det minsta talet i trädet och spara det sist i en lista. Använd vad du lärt dig inom algoritmanalys och beskriv hur lång tid en sådan sortering skulle ta. Motivera noggrannt. Beskriv både bästafall och värstafall, rita gärna grafer/bilder för att tydliggöra vad du menar. (3p)
Praktisk del Följande uppgifter ska lösas på dator. Skapa ett nytt projekt för varje uppgift. Om det inte är uttryckligen angivet annorlunda i uppgiften får du endast använda den del av Javas standardbibliotek som finns i java.lang. Om du inte kan lösa uppgiften, gör en lämplig förenkling och lös den istället. Skriv ned i källkoden vilka förenklingar du gjort. Poäng ges efter hur pass nära din lösning är att lösa den givna uppgiften. Även icke fungerande kod kan ge poäng om den visar på viss förståelse. Du har i denna uppgift tillåtelse att använda lämplig del av Javas standardbibliotek för att slumpa tal. 5. Anna är inne i ett kasino och ska spela poker. Hon ställer sig i en kö för att köpa sin stack med marker. Efter att hon fått sin stack sätter hon sig vid ett bord för att spela. Mitt emot henne sitter en man som klappar på sin katt. Spänningen stiger, mannen håller på att förlora mot Anna. Plötsligt springer katten rakt ut över bordet och välter Annas stack med marker! Ojdå, säger mannen och går prompt ifrån bordet med alla sina marker. a) Implementera en (osorterad) länkad lista. Implementera metoderna addlast(), addfirst(), removelast(), removefirst() samt printall(). Körtiden för add- och removemetoderna ska tillhöra O(1). Som elementtyp, skapa en klass Chip, som har ett attribut: ett heltal. (3p) b) Skapa två interfaces, Stack och Queue. Lägg till tillhörande metoder i dess definitioner (push,pop,size,enqueue,dequeue,size). Låt sedan listan från a) implementera dessa interfaces. (1p) Om du har fått VG på årets labbserie får du automatiskt full poäng för nedanstående uppgift (c) och behöver alltså inte utföra den. Posttenta-korrigering: Det är ok att använda java.util.arraylist för del 1 och 5. c) Skriv ett program som simulerar Annas otur i spelandet. Var noggrann med att använda rätt datayper: 1. Skapa en kö och lägg in N tomma listor med marker, där N är ett SLUMPAT tal mellan 1 och 7 inklusive. 2. Ställ objektet Anna längst bak i kön (representerad som ytterligare en tom lista med marker). Lägg in ytterligare 10 N tomma listor. 3. Ta bort personer från kön tills Anna kommer fram. 4. Lägg in 7 marker i Annas stack. Varje marker ska vara värd 5 kronor. 5. Töm Annas stack och lägg dem i en osorterad lista. Skriv ut listan. (3p)
För följande uppgift har du tillåtelse att vid behov använda lämpliga interfaces i paketet java.util (detta är ett tips ) 6. I mappen given_files finns två klasser som implementerar ett binärt sökträd för heltal. Importera dessa filer till ett nytt projekt. För alla deluppgifter, komplettera mainfunktionen med testfall som visar att klassen fungerar som väntat. a) Implementera metoden member() för det binära sökträdet. Metoden ska fungera enligt tillhörande davadoc-kommentar i källkoden. (2p) b) Gör klassen generisk, så att sökträdet kan användas för alla datatyper som kan jämföras med andra objekt av samma typ, till exempel klassen java.lang.string. Justera vid behov metoderna så att de fungerar som de ska. (2p) c) Skapa en metod printnodes() som skriver ut nodernas värden i preorder-ordning (1p) Lycka till!