LULEÅ TEKNISKA UNIVERSITET Tentamen i Objektorienterad programmering och design Totala antalet uppgifter: 6 Lärare: Håkan Jonsson, Tomas Johansson, 491000 Resultatet anslås senast 08-04-10 i A-huset. Tillåtna hjälpmedel: Inga Kurskod D0010E Datum 08-03-31 Skrivtid 5 tim Obs! Inget ur Javas standardbibliotek får användas i ett svar (om det inte står att man får det). 1. Teori och begrepp a) Vad menas med dynamic dispatch? b) Rita upp ett litet UML-diagram som tydligt visar att du vet vad ett Template Design Pattern är. Skriv små förklarande meningar ute i marginalerna och dra pilar in i diagrammet om du behöver förtydliga. c) Ge en väsentlig anledning till att undantag (exceptions) bör finnas i programmeringsspråk. d) Vad menas med Design by Contract? (2p) 2. Programmering a) Klassen D ärver C som ärver B som implementerar gränssnittet A. Klasserna och gränssnittet ligger i samma paket. C innehåller, till skillnad från de övriga, en variabel v som är deklarerad protected. I vilken/vilka av A-D kan nu v användas? b) Skriv en rekursiv metod double power(double x, int k) som beräknar och returnerar x k. Du får anta att k är positivt. c) Vilka fyra synligheter finns det i Java? d) Vad är skillnaden mellan en metod som är statisk och en som inte är det? e) Skriv en iterativ metod int digitsum(int d) som beräknar summan av siffrorna i ett heltal som du får anta är positivt ( 0). Ledning: Använd operatorerna / och % som beräknar heltalsdivision respektive ger resten vid heltalsdivision. 3. Programmering enligt 4-4-2-modellen (5p) Din uppgift är att skriva en klass som representerar ett fotbollslag. Ett fotbollslag består av n antal spelare på positionerna 1 n, där varje spelare kan få gula och röda kort. Att få ett gult kort är samma sak som att bli varnad, och att få ett rött kort är samma sak som att bli utvisad. Att bli varnad två gånger betyder att man blir utvisad. Följande 7 publika metoder och konstruktorer ska ingå i klassen FootballTeam: (a) FootballTeam(int nrofplayers): skapar ett lag med nrofplayers antal spelare. Från början har ingen spelare fått gult eller rött kort. (b) void giveyellowcard(int player): ger spelare på position player ett gult kort. Om spelaren har ett gult kort sedan tidigare blir spelaren utvisad.
(c) void giveredcard(int player): ger spelare på position player ett rött kort. Spelaren blir därmed utvisad. Om man försöker ge en redan utvisad spelare ett kort ska undantaget SuspendedPlayerException kastas. Du får anta att klassen som representerar undantaget redan är skriven. (d) void replace(int pos): Sätter in en ny spelare på positionen pos. Om spelaren som redan finns på den aktuella positionen är utvisad ska istället undantaget SuspendedPlayerException kastas. En ny spelare har förstås inga varningar, även om den tidigare spelaren på positionen hade det. Du får anta att man aldrig skickar in en position som inte finns i laget som argument. (e) int playersleft(): Returnerar hur många spelare som finns på plan, dvs hur många som inte är utvisade. (f) String tostring(): Returnerar en strängrepresentation av laget, där varje spelare representeras med ett tecken, och spelartecknen separeras med ett mellanslag. Spelarna skrivs ut i positionsordning. En spelare som inte blivit varnad representeras med ett X, en spelare som fått ett gult kort representeras med V, och en utvisad spelare representeras med ett U. Anta till exempel att ett lag har sju spelare, där spelaren på position 1 blivit varnad, och spelaren på position 6 blivit utvisad. tostring() skulle då returnera följande sträng: "V X X X X U X" (g) static int numberofteams(): Returnerar det totala antal fotbollslag som skapats. 4. Underligt Mobila Lösningar (5p) <<abstract>> ElectricalVehicle +ElectricalVehicle(maxCharge:double) +charge(energyamount:double): void +drive(dist:double): boolean Segway +Segway(maxCharge:double) +drive(dist:double): boolean ElectricalSubmarine +ElectricalSubmarine(maxCharge:double) +drive(dist:double,depth:double): boolean AcmeSegway +AcmeSegway(maxCharge:double) +setconnected(b:boolean): void Figure 1: UML-diagram för Uppgift 4. Acme Programming, Inc. ska ge sig in i fordonsbranschen. Eftersom miljötänkande är populärt just nu har Acme plötsligt kommit på att de alltid värnat om miljön, och siktar in sig på eldrivna fordon. Men först måste man förstås analysera marknaden genom simulering, och det är där du kommer in. Din uppgift är att skriva följande klasser baserat på UML-diagrammet i figur 1: ElectricalVehicle som är abstrakt och representerar ett elfordon. Ett elfordons batteri har en laddning, och när ett elfordon skapas är det fulladdat. Den maximala laddningen anges i ett argument till konstrueraren.
Metoden void charge(double energyamount) laddar upp batteriet med den givna laddningen. Batteriet kan inte laddas upp mer än till maximal laddning. Den abstrakta metoden boolean drive(double dist) anropas när ett fordon ska köras en viss sträcka, och resulterar i att laddningen minskar. Om laddningen tar slut ska metoden returnera false, annars true. Ett fordons laddning kan aldrig bli mindre än noll. Segway som ärver ElectricalVehicle, representerar ett tvåhjuligt transportfordon som blivit populärt eftersom kulturpersonligheter som Weird Al Yankovic setts använda den. Klassen ska implementera metoden drive så att den nya laddningen l minskar beroende på sträckan s som körs enligt följande formel: l = l s. AcmeSegway som ärver klassen Segway. Den revolutionerande idén är att fordonet förutom batteriet har ett vanligt eluttag (jättelånga sladdar säljs separat). Metoden void setconnected(boolean b) används för att ange om sladden är ikopplad eller inte: om argumentet är true är sladden ikopplad, annars inte. När en AcmeSegway skapas är sladden inte ikopplad. Metoden drive ska fungera precis som i superklassen, med ett tillägg: om sladden är ikopplad används inte batteriet, och laddningen förändras inte. ElectricalSubmarine som ärver ElectricalVehicle. I den här klassen fungerar metoden drive(double dist, double depth) så att den tar två argument: sträckan och djupet. Laddningen l minskar enligt formeln l = l (3s+sd), där s är sträckan och d djupet, eftersom det är jobbigare att ta sig fram ju djupare ubåten går 1. (drive-metoden som tar ett argument ska inte kunna användas i den här klassen.) 5. Gamegrids I laboration 4 förekom ett kvadratiskt spelbräde representerat som ett objekt av typen GameGrid. I denna klass var spelplanen en 2-dimensionell heltalsarray private int[][] board vars element endast kunde innehålla någon av heltalskonstanterna EMPTY, ME eller OTHER. Normalt sett ritar man en bild av brädet och markerar var spelare gjort sina drag samt var det är ledigt. Om vi använder och för drag (låt stå för ME) och en punkt för en ledig ruta skulle t ex kunna vara en bild av ett bräde med 4 rader och kolumner (det är som ska dra). Istället för en bild kan vi ge en strängrepresentation. Vi använder då bindestreck och utropstecken för att avgränsa rutorna och tecknen X, O och mellanslag för vad som finns i rutorna. För vårt brädexempel ovan blir då strängen "---------\n!!x!!o!\n!!x!o!!\n!o!!x!!\n!!o!!!\n---------" vilken skulle ge 1 Hade kapten Nemo bara hållit sig närmare ytan hade han säkert hunnit med två världsomseglingar under havet! (5p)
---------!!X!!O!!!X!O!!!O!!X!!!!O!!! --------- vid utskrift. Tecknenkombinationen \n skrivs inte ut utan ger istället radbyte. Uppgift: Skriv en metod public String tostring() som är tänkt att ligga i GameGrid och som ger tillbaka den sträng som representerar brädet. Hjälp: Studera noga hur strängen är uppbyggd och bestäm relationen mellan tecken i strängen och den 2-dimensionella arrayens storlek och innehåll. Mellan raderna i utskriften finns teckenföljden \n. Hur förändras mängden bindestreck med antalet rader? Arrayen är alltid kvadratisk och innehåller minst en rad (och kolumn). 6. Länkade listor a) Skriv en klass som implementerar enkellänkade listor med ankare och header. (3p) Operationer på en lista ska vara: insert som stoppar in ett element först (före det som var först), delete som tar bort det första elementet och size som ger antalet element i listan. Använd följande nodklass som ska finnas deklarerad som inre klass i din listklass: private class Node { Object content; Node next; } b) Inkludera i din listklass en metod public Iterator iterator() som ger tillbaka en iterator beskriven av gränssnittet Iterator nedan. Metoden remove ska inte ha någon effekt annat än att den kastar ett undantag. (2p)
Errata (D0010E, 08-03-31) No errors found so far.
Existing suggested solutions (D0010E, 08-03-31) None.