2015-03-19 kl 08-12

Försättsblad till skriftlig
tentamen vid Linköpings
Universitet
Datum för tentamen
Sal
Tid
Kurskod
Provkod
Kursnamn/benämning
Institution
Antal uppgifter som ingår i
tentamen
Antal sidor på tentamen (inkl.
försättsbladet)
Jour/kursansvarig
Telefon under skrivtid
Besöker salen ca kl.
Kursadministratör
(namn, telefon, mailadress)
Tillåtna hjälpmedel
Övrigt
2015-03-19
Samling i korridoren vid SU17/18
08:00 – 12:00
TDDC30
DAT1
Programmering i Java, datastrukturer
och algoritmer
IDA
6 (4 teoretiska och 2 praktiska)
8
Jonas Lindgren
013-281403
Åsa Kärrman,
013-285760,
[email protected]
Inga
Information och frågor hanteras
genom “Tentaklienten”.
Preliminära poänggränser:
3: 20
4: 28
5: 36
Tentamen TDDC30
2015-03-19 kl 08
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)
b)
c)
d)
e)
f)
Varför väljer man ofta synligheten private hellre än public för medlemsvariabler i en klass?
(1p)
Vad är syftet med undantag/exceptions? (1p)
Vad innebär det att en metod är abstract? (1p)
I “Animal myAnimal = new Animal()” sker två separata saker. Vad innebär “Animal
myAnimal” och vad innebär “new Animal()”? (1p)
Vad innebär det att abstrahera i ett programmeringsperspektiv? (1p)
Varför kan man inte anse att en viss sorteringsalgoritm är 'bäst'? (1p)
2. (6p) "Datastrukturer"
a)
Värdena 2 8 9 4 6 1 3 5 7 ligger i en fullständig maxheap. Rita upp hur heapen ser ut och hur
värdena ligger i den. (2p)
b)
Organisera om siffrorna i trädet nedan så att trädet utgör ett binärt sökträd. (2p)
(”Organisera om siffrorna” innebär att pilarna och noderna förblir på samma plats, endast
siffrorna får byta plats i bilden.)
9
5
2
5
7
4
6
c)
1
3
5
8
Ange i vilken ordning noderna i trädet från b) besöks av en preorder-, postorder-, levelorderoch inorder-traversering. (2p)
Tentamen TDDC30
2015-03-19 kl 08
3 (8)
3. (6p) "Tidskomplexitet"
a)
Rangordna tillväxten, från långsammast tillväxt(bäst) till snabbast tillväxt(sämst), hos
tidskomplexiteterna O(1), O(n⁵), O(nlog(n)), O(5n), O(8n²), O(n), O(2). (2p)
b)
Ange tidskomplexiteten i värsta fallet, med avseende på n, för följande metoder. (n är alltid
ett positivt heltal.) (2p)
int zap(int n) {
return n*n;
}
int count(int n) {
int sum = 0;
if (n > 5) {
for (int i = 0; i < n;
sum += zap(i);
}
} else {
sum = zap(n);
}
return sum;
}
++i) {
void bip(int n) {
for (int i = 0; i < 5; i = i+1) {
System.out.println(n);
}
}
c)
Förenkla följande tre uttryck för tidskomplexitet: (2p)
1) O(5n² + n + 10) × O(7n)
2) O(25n) × O(25log(n))
3) O(2n) + O(3n)
Tentamen TDDC30
2015-03-19 kl 08
4 (8)
4. (6p) "Algoritmer"
a)
Sortera värdena [ 7 2 1 2 4 6 5 ] med bubblesort. 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 [ 3 4 9 1 7 8 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. Välj alltid ”det högraste” värdet inom
intervallet som pivot-element. (2p)
c)
Vad innebär det att en sorteringsalgoritm är stabil? Illustrera med ett exempel på en
sorteringsalgoritm som kan implementeras stabil, och ett på en som inte kan implementeras
stabil, med förklaring om varför dessa kan/inte kan implementeras stabila. (2p)
Tentamen TDDC30
2015-03-19 kl 08
5 (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
2015-03-19 kl 08
6 (8)
5. (8p) “Att räkna löv”
Anna arbetar med ett binärt sökträd, och har kommit så långt att hon har de flesta metoderna,
bland annat add(..) och size(..). Det finns dock mer att göra och Anna har inte riktigt tid att ta
tag i allt just nu, så hon har lejt in er i ett par timmar.
Värde
En nod från Annas binära träd:
Importera Annas projekt från given_files, och hjälp henne med programmet enligt nedan.
a)
För att kontrollera sin implementation vill Anna lägga till en getLeaves-metod, som helt enkelt
returnerar en lista på alla löv i trädet, i godtycklig ordning men utan dubletter. Hjälp Anna
genom att skriva klart leaves-metoden enligt dess dokumentation i koden. (6p)
(Denna deluppgift kan lösas oberoende från övriga deluppgifter.)
b)
Obs: Har du har bonus på labb 3 och 4 tillgodoräknas du deluppgift 5b och 6b.
Anna vill att hennes färdiga träd följer ett gränssnitt. Hon har redan skrivit gränssnittet i filen
AnnasTreeInterface, men hennes kod använder inte gränssnittet än, och måste nog anpassas
lite för att göra det. Uppdatera Annas träd så att det använder gränssnittet. (2p)
(Denna deluppgift kan lösas oberoende från övriga deluppgifter.)
Tentamen TDDC30
2015-03-19 kl 08
7 (8)
6. (10p) “Den öde ön”
Stefan har blivit inspirerad av alla rika kändisar som på senare tid köpt sig sina egna privata
öar. Det vore allt bra kul att äga sin egen öde ö, nånstans att relaxa på beachen med lite
kokosnötter och sol. Problemet är bara att en öde ö är ganska dyr, 3.2 miljoner för den ö
Stefan har ögonen på, så det vill till att Stefan börjar spara redan nu.
Stefan antar att han kan investera sina besparingar på börsen för 7% avkastning i medel, och
för att förenkla det hela antar han också att han måste skatta 0.27% på det totala beloppet och
kompensera för en inflation på 1%, alla dessa per år. För att kunna experimentera med olika
sparbelopp så börjar Stefan knappa på en liten dator-simulation i Java. Han tänker använda en
dubbellänkad lista för att lagra beloppen han sparar samt den avkastning han får, och köra på
med sin simulation tills han sparat ihop till sin ö!
Importera Stefans projekt från given_files, och hjälp honom med programmet enligt nedan.
a)
Stefan vet ungefär hur strukturen kommer se ut, varje nod kommer ha en referens till
föregående och nästa nod, och om inga sådana finns blir dessa referenser null. Listan kommer
också hålla reda på vilken nod som ligger först och sist. Dock har han inte riktigt hunnit
skriva klart addFirst(...) och addLast(...)-metoderna. Hjälp honom skriva klart dessa så att de
bygger en korrekt dubbellänkad lista. (6p)
(Denna deluppgift kan lösas oberoende från övriga deluppgifter.)
b)
Obs: Har du har bonus på labb 3 och 4 tillgodoräknas du deluppgift 5b och 6b.
Den här koden blir nog bra, fast Stefan inser att det vore bra om han kunde vara lite mer
konsekvent i sin kodstruktur. För att åstadkomma detta så skriver han ihop UML-diagrammen
nedan, som representerar hur han helst skulle vilja att hans dubbellänkade lista samt nod såg
ut. Konvertera Stefans dubbellänkade lista så att den följer UML-diagrammen till punkt och
pricka. (4p)
(Denna deluppgift kan lösas oberoende från övriga deluppgifter.)
DoublyLinkedList
- Node first
- Node last
+ void addFirst(...)
+ void addLast(...)
+ int size()
+ boolean isEmpty()
+ double sum()
Node
- double data
~ Node next
~ Node prev
# Node(...)
+ double getData()
+ Node getNext()
+ Node getPrev()
Tentamen TDDC30
2015-03-19 kl 08
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
8 (8)