TDDC30 Programmering i Java, datastrukturer och algoritmer

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)