Tentamen Programmeringsteknik II 2014-0-27 Skrivtid: 0800 100 Tänk på följande Skriv läsligt! Använd inte rödpenna! Skriv bara på framsidan av varje papper. Börja alltid ny uppgift på nytt papper. Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod på alla papper. Skriv inte längst upp i vänstra hörnet - det går inte att läsa där efter sammanhäftning. Fyll i försättssidan fullständigt. Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga. Programkod skall vara läslig, d.v.s. den skall vara vettigt strukturerad och indenterad. Namn på variabler, metoder, funktioner, klasser etc. skall vara beskrivande men kan ändå hållas ganska korta. Såvida inget annat anges, får man bygga på lösningar till föregående uppgifter även om dessa inte har lösts. Det är tillåtet att införa hjälpmetoder och hjälpklasser. Uttrycket skriv en metod som skall alltså inte tolkas så att lösningen inte får struktureras med hjälp av flera metoder. Uppgifterna kommer inte i svårighetsordning. Lycka till! 1
Uppgifter 1. Den mycket användbara klassen ArrayList har åtminstone en nackdel jämfört med arrayer: Komponenterna måste vara objekt. Om man vill lagra primitiva datatyper i en ArrayList, måste dessa packas in i objekt av en passande omslagsklass. Exempel: Nedanstående kod ger en datastruktur enligt vidstående figur. ArrayList<Integer> a = new ArrayList<Integer>(); a.add(); a.add(); a.add(9); a.add(12); a.add(42); 0 2 1 4 9 12 42 Om man i stället lagrar samma data i en array får man följande utseende: int[] a = new int[]; a[0] = ; a[1] = ; a[2] = 9; a[] = 12; a[4] = 42; 9 12 42 Array-versionen kräver således väsentligt mindre minne och koden blir effektivare. Uppgiften består i att skriva delar av en klass som har samma flexibilitet som en ArrayList men som behåller arrayens kompaktare representation. Priset som man får betala är att datatypen måste fixeras. Bilagan ArrList innehåller ett skal till denna klass. a) Skriv en klass ArrListException som en underklass till RuntimeException. Denna klass skall användas vid felaktig användning (felaktiga parametrar) av metoderna i klassen ArrList. b) Skriv en parameterlös konstruktor som skapar en tom ArrList med plats för 10 element. c) Skriv en konstruktor som skapar en tom ArrList med plats för n element, där n ges som argument till konstruktor se bilagan! d) Skriv metoden size() som returnerar antalet lagrade element d.v.s. det antal som är lagrade inte storleken på den array som används. e) Modifiera metoderna get och set i klassen ArrList så att de kastar undantag om parametern index anger ett värde utanför de lagrade elementen. f) Skriv en metod remove(int index) som tar bort och returnerar elementet på det givna indexet. Kontrollera värdet på parametern! g) Skriv de två add-metoderna enligt kommentarerna i bilagan. Metoderna skall kontrollera att index-parametern är korrekt. (Om det t ex finns lagrade värden på plats 0, 1 och 2 så får man lagra ett element på plats 0, 1, 2 och men inte på 4 eller högre) Tips! Den befintliga koden i bilagan kan ge ledtrådar till hur metoderna ovan ska implementeras! 2
2. En prioritetskö är en kö där uttagen styrs av elementens prioritet och inte av hur länge de har stått i kön. Om elementen lagras i en länkad lista, kan man lagra elementen antingen sorterat på prioritet eller osorterat. Med en sorterad lista blir uttagen ur kön effektiva (O(1) - högst prioritet ligger först) men inläggen arbetsamma (O(n) man måste leta upp platsen för ett nytt element). Om elementen lagras osorterat blir inläggen enkla (O(1) nya element läggs sist) men uttagen ineffektiva (O(n) listan måste sökas efter element med högst prioritet). Ett alternativ till en länkad lista är ett binärt träd sorterat på prioritet. Det blir ungefär som ett binärt sökträd med prioriteter som nycklar. En skillnad är dock att samma nyckel (prioritet) kan förekomma på flera ställen i trädet. Om prioriteterna som ankommer är slumpmässigt fördelade kommer trädet att hållas någorlunda balanserat. a) Hur många operationer krävs i värsta respektive bästa fall för att göra ett inlägg i och ett urtag ur ett sådant träd med n lagrade noder? Antag att prioriteterna ankommer slumpmässigt och inkludera tiden det tar att hitta platsen där ett element ska läggas in / att hitta det element som ska tas bort. Ange svaret på formen O(f(n))! Svaren skall motiveras! b) Skriv en klass som implementerar en prioritetskö med ett binärt träd. För denna uppgifts skull räcker det att elementen endast (förutom referens till höger och vänsterbarn) innehåller ett heltal som anger prioriteten. Klassen skall ha följande: en konstruktor public (). en metod void enqueue(int priority) för att lägga in ett ny prioritet i kön. en metod int dequeue() som tar ut elementet med högst prioritet och returnerar dess prioritet. en tostring-metod som returnerar en sträng med noderna i prioritetsordning. en metod int size() som returnerar antalet element i kön. Obs: Element med samma prioritet skall komma ut i ankomstordning. På nästa sida finns ett exempel på kod och resulterande struktur. (En låg siffra anger en hög prioritet):
Kod Resulterande struktur pq = new (); pq.enqueue(); pq.enqueue(); pq.enqueue(); pq.enqueue(2); 2 4
. I bilagan allshapeclasses finns en basklass Shape för att representera geometriska figurer med underklasser för rektanglar och cirklar. Figurerna kan läsas in, ritas, skrivas och deras yta kan beräknas. Se den givna koden för möjliga operationer. a) Skriv en klass Line för att representera linjer. Klassen skall skrivas som en underklass till klassen Shape. En linje representeras av sina två ändpunkter. Tips: En linje mellan punkterna (x 1, y 1 ) och (x 2, y 2 ) ritas av metoden drawline(x1, y1, x2, y2) i klassen Graphics. Se också paint-metoderna i de givna klasserna! b) Skriv en klass Square som en underklass till klassen Rectangle. Obs: För att få poäng skall arv utnyttjas! Du skall alltså bara skriva de delar som behövs för de nya strukturerna och inte upprepa befintlig kod. Du ska dock skriva konstruktorer till vilka man kan skicka in värden på samtliga instansvariabler i dina klasser. Exempel på indata, utskrifter och ritad figur (de estetiskt tilltalande färgerna syns tyvärr inte i de kopierade tentorna). Indata: 00 00 rectangle 20 40 0 200 0 200 200 0 square 0 0 200 100 200 100 200 square 20 200 20 20 20 100 200 circle 40 20 100 100 100 100 0 circle 100 00 20 200 0 200 80 line 100 100 0 0 0 2 00 400 exit Utskrifter: > run DrawTest Stored shapes: Rectangle(20, 40) Square(0, 0) Square(20, 200) Circle(40, 20) Circle(100, 00) Line(100, 100) Total area: 1089 >