LINKÖPINGS UNIVERSITET Institutionen för datavetenskap Jonas Wallgren Tentamen i TDDC30 Programmering i Java, datastrukturer och algoritmer För I3, Ii3 Datum: 2008-12-18 Klockan: 08-12 Jour: Jonas Wallgren, 013-28 2682 Administratör: Madeleine Häger Dahlqvist, tel. 28 2360 Hjälpmedel: Anvisningar: Inga 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.
Tentamen TDDC30 2008-08-22 2 (11) 1. (4p) Sortering Teoretisk del a) Sortera nedanstående element med Quicksort. Visa varje steg i sorteringen. 4, 6, 2, 8, 3, 7, 1, 5 b) Vilken är Quicksorts komplexitet i medelfallet och i värsta fallet? Förklara varför. c) Varför är stabilitet intressant i sorteringssammanhang? Är Quicksort stabil? 2. (3p) Träd a) Sätt in följande element (i given ordning) i ett från början tomt binärt sökträd. Visa slutresultatet.. 3, 6, 7, 4, 9, 1, 2, 8, 5 b) Ta bort elementet 6 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 a) i post-ordning. Skriv ut elementen vid besök. 3. (3p) Objektorientering a) Hur hanteras multipelt arv i Java? Ex: Om man har dels landfordon med hjulantal och dels sjöfordon med djupgående, hur kan då amfibiefordon vara båda delarna? (Principdiskussion räcker. Korrekt Javakod behövs inte.) b) Vad är och när/hur används konstruktorer? c) Hur beskrivs en klass i ett klassdiagram? 4. (2p) Köer a) Beskriv hur en (vanlig) kö kan representeras med en cirkulär länkad lista. Nämn ett problem med representationen. b) Visa hur de grundläggande köoperationerna utförs på den representationen och motivera deras komplexitet.
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. 5. (5p) Objektorienterad design 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. En viss organisationsstruktur består av institutioner och avdelningar. En avdelning är en underorganisation till en institution, institutioner består alltså av avdelningar. En institution kan ha godtyckligt många avdelningar. Institutioner har en metod läggtillavdelning(avdelning avd) som anropas då en ny avdelning ska läggas till institutionen. Alla organisationer har (godtyckligt många) medlemmar, vilka kan läggas till med metoden läggtillmedlem(medlem medlem). Organisationernas medlemsregister kan skrivas ut med hjälp av metoden void skrivutmedlemmar(). Tänk på att även underorganisationers medlemmar ska skrivas ut. Medlemmar har ett namn (sträng), vilket kan skrivas ut med metoden skrivut- Namn(). De klasser vi ska implementera är alltså Organisation, Institution, Avdelning och Medlem. 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) samt gränssnittet java.util.list och klassen java.util.linkedlist. Klassen OrganisationTester i katalogen Given_files innehåller ett litet testprogram som du kan använda för att testa dina klasser. Klassen bygger upp en liten organisationsstruktur och skriver ut dess medlemmar. Denna klass kommer ej att examineras.
Tentamen TDDC30 2008-08-22 4 (11) a) Rita ett klassdiagram över dessa klasser på ett papper där deras inbördes relationer framgår. Om du ej kan rita ett sådant klassdiagram kan du få ett 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å inga poäng för denna uppgift. b) Implementera klasstrukturen i a), utom metodernas innehåll (se kommande uppgifter). Förse varje organisations- och medlemsklass med en konstruktor som tar en sträng som argument. Denna sträng motsvarar namnet på organisationen/medlemmen. Försök implementera klasstrukturen så mycket du kan. Även om du inte lyckas implementera alla detaljer är det möjligt att du kan få något poäng för den del du lämnar in. Om du ej kan implementera denna klasstruktur kan du få den given 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å inga poäng för denna uppgift, och max 1p för uppgift 6a. c) Implementera metoderna läggtillmedlem och läggtillavdelning. d) Implementera metoden skrivutmedlemmar. 6. (4p) 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. void push(e elt) void pop() E top() (Observera att pop() i den här versionen bara tar bort stacktoppelementet. Vill man veta vilket det är måste man göra top() först.) Den underliggande arrayen ska (initialt) ha storlek 3. 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). 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[].
Tentamen TDDC30 2008-08-22 5 (11) 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 tredubblar sin storlek om stacken blir full.
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. Class java.util.linkedlist<e> java.lang.object extended by java.util.abstractcollection<e> extended by java.util.abstractlist<e> extended by java.util.abstractsequentiallist<e> extended by java.util.linkedlist<e> Type Parameters: E - the type of elements held in this collection All Implemented Interfaces: Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, Queue<E> boolean add(e o) Appends the specified element to the end of 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 11 (11) 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