LULEÅ TEKNISKA UNIVERSITET Tentamen i Objektorienterad programmering och design Totala antalet uppgifter: 5 Lärare: Håkan Jonsson, Tomas Johansson, 491000 Resultatet anslås senast 08-05-16 i A-huset. Tillåtna hjälpmedel: Inga Kurskod D0010E Datum 08-05-02 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) Man brukar säga att arv är en av de saker som skiljer objektorienterad programmering från annan programmering. Vad är arv och varför är det en fördel att använda arv när man programmerar? (2p) b) Vad är en typ och varför finns det typade programmeringsspråk? (2p) c) Ge en väsentlig anledning till att undantag (exceptions) bör finnas i programmeringsspråk. 2. Programmering a) Vad är skillnaden i funktion mellan en variabel som är statisk och en som inte är det? b) Dokumentering av datorprogram görs på olika sätt beroende på vad syftet är och för vem den skrivs. Hur dokumenterar du lämpligen ditt Javaprogram för... (a)... dig själv och andra som ska kunna ändra implementationen? (0.5p) (b)... andra programmerare som ska använda din kod utan att ändra i implementationen? (0.5p) (c)... företagets marknadsavdelning som ska sälja ditt program? (0.5p) (d)... din chef som ska övertyga företagets styrelse om att det projekt som ditt program är del av ska få fortsatt finansiering? (0.5p) c) Skriv en iterativ metod som beräknar produkten av elementen i en heltalsarray. d) Skriv en rekursiv metod double multiply(double x, int k) som returnerar kx beräknat som x + x +... + x }{{} k för k 0 dvs utan andra aritmetiska operatorer än addition. Om k = 0 är produkten noll. Annars kan resultatet beräknas med x + x +... + x = x + (x + x +... + x). }{{}}{{} k k 1 Du får anta att k 0 alltid gäller. 3. Spelläge 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 (5p)
vars element endast kunde innehålla någon av heltalskonstanterna EMPTY, ME eller OTHER. Uppgift: Skriv en metod public int number(int n) till GameGrid som först kontrollerar att n är antingen EMPTY, ME eller OTHER (kastar undantag om inte) och sen beräknar antalet element i board som innehåller värdet n. Arrayen board är alltid kvadratisk och innehåller minst en rad (och kolumn). 4. Ändliga dubbeländade listor En lista är dubbeländad om man kan sätta in och ta bort element i både början och slutet, men inte inuti den. Den är ändlig om man, då den skapas, anger ett positivt heltal k och den sedan aldrig innehåller fler än k element. a) Skriv en klass FiniteList som implementerar ändliga dubbeländade listor. (3p) Operationerna insertfirst och removefirst ska sätta in respektive ta bort ett element först i listan, insertrear och removerear ska göra motsvarande sist i listan, och size ska slutligen ge antalet element i listan. Tips: Att implementera en länkad lista är onödigt krångligt. Du får dock inte använda Vector eller motsvarande ur Javas standard bibliotek. Vad bör hända om man försöker ta ut ett element ur en tom lista? Visst fungerar din implementation om man i olika ordning, och både i början och i slutet, totalt sätter in och tar bort långt fler än k stycken element utan att listan någon gång blir full eller tom? b) Inkludera i din listklass en metod public Iterator iterator() som ger tillbaka en iterator beskriven av gränssnittet Iterator nedan. Om någon av metoderna i a) anropas på listan efter att en iterator skapats, ska iteratorns metoder därefter enbart kasta undantag. Detsamma gäller om metoden remove anropas (metoden ska aldrig ha någon effekt annat än att den kastar ett undantag). (2p) 5. Filsystem (5p) <<abstract>> Item #name: String #parent: Directory +parent(): Directory +equals(ob:object): boolean Directory #list: FiniteList +Directory(name:String,parent:Directory) +add(f:item) +find(s:string): Item +tostring(): String File -content: Object +File(name:String,data:Object,parent:Item) +getdata(): Object +tostring(): String RootDirectory +RootDirectory(name:String) Figure 1: UML-diagram för Uppgift 5. Din uppgift är att skriva klasser som representerar objekt i en filstruktur, närmare bestämt följande klasser:
Den abstrakta klassen Item, som representerar generella filobjekt som kan finnas i filstrukturen. Alla filobjekt har ett namn, i form av en sträng, som alltid anges då ett filobjekt skapas. Varje filobjekt har en plats de ligger i, en s.k. förälder, som är en katalog. Metoden Director parent() ska returnera den katalogen. Filobjekt ska kunna jämföras med varandra. Två filobjekt är lika om och endast om de har samma namn. Det betyder att Item måste överskugga equals-metoden. Klassen File, som ärver Item. En fil innehåller data i form av ett Object, som anges i konstruktorn. Metoden Object getdata() returnerar datat. När en fils tostring-metod anropas ska filens namn returneras. Klassen Directory, som ärver Item. En katalog kan innehålla godtyckligt många filobjekt. När en katalog skapas är den tom. För att representera innehållet får du använda dig av klassen Finitelist från uppgift 4, även om du inte gjort den uppgiften. Metoden add(item f) lägger till ett filobjekt i katalogen. Om det redan finns ett filobjekt med samma namn ska undantaget RunTimeException kastas. Metoden Item find(string s) ska hitta filobjektet med namnet s som ligger i katalogen, och returnera det. Om det inte finns något objekt med det namnet ska undantaget RunTimeException kastas. När en katalogs tostring-metod anropas ska strängen som returneras innehålla katalogens namn, följt av innehållet i katalogen. Med andra ord ska strängen, förutom katalogens eget namn, innehålla strängrepresentationen av alla objekt som finns i katalogen. Det betyder att strängrepresentationen av en katalog dir innehåller strängrepresentationen av alla kataloger som ligger i dir. Klassen RootDirectory, som ärver Directory. Rotkatalogen ligger inte i någon annan katalog, vilket betyder att föräldern inte behöver anges i konstrueraren. Om man kör en rotkatalogs parent()-metod ska rotkatalogen själv returneras.
Errata (D0010E, 08-05-02) No errors found so far.
Existing suggested solutions (D0010E, 08-05-02) None.