LINKÖPINGS UNIVERSITET Institutionen för datavetenskap Daniel Karlsson Tentamen i TDDC30 Programmering i Java, datastrukturer och algoritmer För I3, Ii3 Datum: 2008-08-22 Klockan: 14-18 Jour: Fredrik Berntsson, 013-282860 Administratör: Madeleine Häger, tel. 282360 Hjälpmedel: Inga Anvisningar: Omotiverade svar ger noll poäng! Börja varje uppgift på nytt papper och skriv namn och personnummer på varje inlämnat blad. Tentamen består av två delar: en teoretisk och en praktisk. Den teoretiska delen löses med papper och penna som en traditionell tentamen. Den praktiska delen löses på datorer, anvisade vid tentamenstillfället. Efter tentamen lämnas alla filer som ska examineras kvar på kontot. Poäng: Totalt kan 21 poäng erhållas, fördelade på 6 uppgifter. För godkänt krävs minst 10 poäng, för betyg 4 minst 14 poäng och för betyg 5 minst 17 poäng. Facit: Publiceras på kurshemsidan efter tentamens slut. Lycka till! Tentamen TDDC30 2008-08-22 2 (11) Teoretisk del 1. (3p) Prioritetsköer Välj en representation för ADT Prioritetskö där operationerna för insättning och borttagning av minsta element tar O ( log n ) tid. Antag att vi vill sätta in heltalselement och att detta heltal också anger prioriteten. Minst heltal har högst prioritet. 2. a) Beskriv hur insättning går till. Visa med exempel b) Beskriv hur borttagning av minsta element går till. Visa med exempel. c) Motivera dessa operationers komplexitet. (3p) Träd a) Sätt in följande element i ett från början tomt binärt sökträd. Visa det resulterande trädet. 9, 6, 3, 5, 16, 13, 18, 8, 1 3. b) Ta bort 9 ur det resulterande trädet ovan. Förklara operationen och visa hur trädet ser ut efteråt. c) Traversera trädet från deluppgift b) i pre-ordning. Skriv ut elementen vid besök. (3p) Abstrakta datatyper I ADT ordbok vill man slå upp information givet en viss nyckel. Anta i denna uppgift att både nyckel och information är av typen sträng, som de är i t.ex. en engelsksvensk ordbok. För enkelhetens skull kan vi anta att längden på strängarna är uppåt begränsade av en konstant. 4. a) Hur kan man implementera denna datastruktur (givet det som vi gått igenom i kursen) för att få så bra komplexitet på sökalgoritmen (lookup) som möjligt? Vilken komplexitet har algoritmen? Motivera. b) Hur går borttagning av ett givet element till i den föreslagna strukturen? (3p) Sortering a) Sortera nedanstående array med Insertionsort: 4 1 8 3 5 2 7 6 b) Vilken är den största fördelen med InsertionSort? Motivera! c) Är Insertionsort stabil? Motivera! Tentamen TDDC30 2008-08-22 3 (11) 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. 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. Poängavdrag följer beroende på förenklingens storlek. Tänk på läsbarhet och namngivning, och även på attributs och metoders synlighet. Skapa ett nytt projekt för varje uppgift. Benämn dessa Uppg5 resp Uppg6. För att mata in givna filer i Eclipse rekommenderas att du först öppnar filen i en vanligt texteditor varifrån texten kopieras och klistras in i Eclipse. Vid oklarheter och frågor om detaljerad Java-syntax, använd tentamenssystemet för kontakt med examinator. Bilagd finns även en lista över vanliga unixkommandon. 5. (4p) Polymorfism Vi vill i denna uppgift skapa en struktur för att representera matematiska uttryck som innehåller ett godtyckligt antal operander, t.ex. 2 + 5 + 4 + 8 + 19 + 23 eller 7 ⋅ 4 ⋅ 5 ⋅ 18 . Själva operatorn (addition resp. multiplikation i exemplen) mellan operanderna kan variera mella olika uttryck, men är alltid samma inom ett uttryck. De gemensamma dragen vill vi samla i en abstrakt klass MultiExpression. Denna ska alltså samla funktionalitet rörande operanderna samt de gemensamma delarna av beräkning av uttrycken. De särskiljande detaljerna implementeras t.ex. i klasserna Summation och Multiplication (den förra kommer vi inte att implementera i denna uppgift, utan lämnas som övning efter tentan). Klasserna behöver endast kunna hantera heltalsuttryck. Tänk på att heltalstypen skrivs som Integer i samband med generiska typparametrar. Inga felkontroller behöver göras. Den givna filen MultiExpressionTester.java, som finns i katalogen Given_files, innehåller ett testprogram med vilket du kan testa din implementation. Denna fil kommer inte att examineras. I denna uppgift får du endast använda de klasser som återfinns i paketet java.util samt de standardklasser som återfinns i java.lang (t.ex. String, Integer, System.out och System.err). API:et till ett urval av dessa klasser återfinns längre fram i detta häfte. Tentamen TDDC30 a) 2008-08-22 4 (11) Definiera den abstrakta klassen MultiExpression, inklusive de variabler som behövs för att hålla operanderna samt en standardkonstruktor (utan parametrar). Definiera dessutom metoden void addOperand(int i) som lägger till operanden i till uttrycket. Om du ej kan implementera denna struktur kan du få svaret av tentamensvakterna mot att du fyller i formuläret i slutet av detta häfte. På detta vis får du en chans att lösa de andra deluppgifterna. Du får då inget poäng för denna uppgift. b) Definiera metoden int evaluate() som går igenom alla operander, beräknar och returnerar uttrycket. Till sin hjälp har den de två abstrakta metoderna int baseValue() och int performOp(int a, int b). Definiera även att dessa metoder finns och måste specifiseras av en underklass. baseValue returnerar den konstant som motsvarar evalueringen av ett tomt uttryck (utan några operander). Vid summering är detta 0, och vid multiplikation 1. performOp tar två operander och returnerar resultatet av en operation mellan dessa. Exakt vilken operation det är frågan om specifiseras, som sagt, i en underklass. Om du inte kan implementera abstrakta klasser och metoder kan du implementera evaluate som en ren multipliceringsfunktion och strunta i baseValue och performOp. Det gör dock att du inte kan lösa uppg c. c) 6. (5p) Definiera klassen Multiplication som är en specialisering av MultiExpression. Klassen ska endast fylla metoderna baseValue och performOp med ett innehåll som realiserar multiplicering, enligt beskrivning i uppg b. Stackar I den här uppgiften ska du implementera en stack med en arraystruktur. Stacken ska kunna hantera element av en godtycklig typ, i den här beskrivningen kallad E. Följande operationer ska stödjas. Den underliggande arrayen ska (initialt) ha storlek 3. • void push(E elt) • E pop() • E top() Om du ej kan använda generiska typparametrar kan du, mot poängavdrag, anta typen int. Den givna filen StackTester.java, som finns i katalogen Given_files, innehåller ett testprogram med vilket du kan testa din implementation. Denna fil kommer inte att examineras. I denna uppgift får du endast använda de standardklasser som återfinns i java.lang (t.ex. String, Integer, System.out och System.err). Tentamen TDDC30 2008-08-22 5 (11) OBS: För att skapa en array av generisk typ E måste man först skapa den av typen Object[] för att därefter typkonvertera till E[]. a) Implementera klassen Stack. Om du ej kan implementera denna klass kan du få svaret av tentamensvakterna mot att du fyller i formulär 6A i slutet av detta häfte. På detta vis får du en chans att lösa de andra deluppgifterna. Du får då inget poäng för denna uppgift. b) Implementera metoden push. Om du ej kan implementera denna metod kan du få svaret av tentamensvakterna mot att du fyller i formulär 6B i slutet av detta häfte. På detta vis får du en chans att lösa de andra deluppgifterna. Du får då inget poäng för denna uppgift. c) Implementera metoderna pop och top. Om du ej kan implementera dessa metoder kan du få svaret av tentamensvakterna mot att du fyller i formulär 6C i slutet av detta häfte. På detta vis får du en chans att lösa de andra deluppgifterna. Du får då inget poäng för denna uppgift. d) Modifiera push så att den underliggande arrayen fördubblar sin storlek om stacken blir full. e) Definiera ett undantag EmptyStackException. Modifiera pop och top så att detta kastas om stacken är tom. Tentamen TDDC30 2008-08-22 6 (11) Utdrag ur Java API Interface java.util.List<E> All Superinterfaces: Collection<E>, Iterable<E> All Known Implementing Classes: (Välj lämplig implementation bland kursiva. De kan skapas med standardkonstruktor. //Daniel) AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector void add(E o) Appends the specified element to the end of this list (optional operation). E get(int index) Returns the element at the specified position in this list. Iterator<E> iterator() Returns an iterator over the elements in this list in proper sequence. int size() Returns the number of elements in this list. Interface java.util.Iterator<E> boolean hasNext() Returns true if the iteration has more elements. E next() Returns the next element in the iteration. Tentamen TDDC30 2008-08-22 7 (11) Ansökan om svar till uppgift 5A Jag anhåller härmed om att få svaret till uppgift 5a på tentamen i TDDC30 den 2008-08-22. Jag är medveten om att jag ej kommer att erhålla poäng för uppgiften. Linköping den 2008-08-22 ----------------------------------------------------------------Signatur ----------------------------------------------------------------Textat namn ----------------------------------------------------------------Personnummer Tentamen TDDC30 2008-08-22 8 (11) Ansökan om svar till uppgift 6A Jag anhåller härmed om att få svaret till uppgift 6a på tentamen i TDDC30 den 2008-08-22. Jag är medveten om att jag ej kommer att erhålla poäng för uppgiften. Linköping den 2008-08-22 ----------------------------------------------------------------Signatur ----------------------------------------------------------------Textat namn ----------------------------------------------------------------Personnummer Tentamen TDDC30 2008-08-22 9 (11) Ansökan om svar till uppgift 6B Jag anhåller härmed om att få svaret till uppgift 6b på tentamen i TDDC30 den 2008-08-22. Jag är medveten om att jag ej kommer att erhålla poäng för uppgiften. Linköping den 2008-08-22 ----------------------------------------------------------------Signatur ----------------------------------------------------------------Textat namn ----------------------------------------------------------------Personnummer Tentamen TDDC30 2008-08-22 10 (11) Ansökan om svar till uppgift 6C Jag anhåller härmed om att få svaret till uppgift 6c på tentamen i TDDC30 den 2008-08-22. Jag är medveten om att jag ej kommer att erhålla poäng för uppgiften. Linköping den 2008-08-22 ----------------------------------------------------------------Signatur ----------------------------------------------------------------Textat namn ----------------------------------------------------------------Personnummer Tentamen TDDC30 2008-08-22 Vanliga unixkommandon 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 11 (11)