Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010) Tid: Onsdagen 15 december 2004, 8:30 till 13:30 Plats: M Ansvarig lärare: Katarina Blom, tel 772 10 60. Läraren besöker tentamen kl 9:30 och kl 12:30 Tillåtna hjälpmedel: Poänggränser: Lösningsförslag Resultat Granskning Kursboken. G 28p, VG 48p, max 60p (För att få VG på hela kursen krävs dessutom att kraven på VG för lab3 har uppfyllts) finns på kurshemsidan torsdag 16 december.. Anslås senast 19 kalenderdagar efter tentamensdagen Granskning av tentan sker efter överenskommelse med ansvarig lärare (se ovan). Börja varje ny uppgift på nytt blad Skriv ditt personnummer på varje blad Uppgifterna är inte sorterade i svårighetsgrad Du får anta att alla paket är åtkomliga utan särskild åtgärd. Du behöver alltså inte skriva import för dem. Lycka till! Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010) 1
1. (9p) (a) Nedastående programsekvens ger ett kompileringsfel. Varför (förklara kort)? String in = JOptionPane.showInputDialog("Ange talet: "); int x = Integer.parseInt(in); boolean okey = true; if (x!= 0) { okey = false; int y = x+2; System.out.println(y); (b) Vilken/vilka av nedastående while-satser resulterar i en evighetsloop? Ge en kort förklaring till varje loop varför den terminerar eller inte. int i = 1; while (i!= 25) i = i + 2; int x = 0; while (x!= 55) x = x + 2; int i = 1, sum = 0;; while(i < 10 sum!=15) { sum = sum + i; i = i + 1; (c)betrakta nedanstående programsekvens: int i = 11; double sum = 0; while (i > 0) { i = i-1; sum = sum + 1.0 / i; Avsikten är att beräkna serien 1/10 + 1/9 +... + 1/2 + 1/1. Något är dock galet och det uppkommer ett exekveringsfel (ett java.lang.arithmeticexception genereas). Förklara kort vad som är fel och rätta felet Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010) 2
2. (10p) Skriv ett program som kontrollerar parentesmatchningar i strängar (dvs om varje vänsterparentes har en tillhörande högerparentes). Programmet läser in en sträng från kommandoraden och ger utskriften Parenteserna matchar ifall höger och vänster parenteser i strängen matchar. Om parenteserna i strängen inte matchar fås utskriften Varning!! Parenteserna matchar inte. Låt programmet (klassen) heta Parenteser och bestå av två metoder: public static boolean match(string str); public static void main(string[] args); Metoden match returnerar true ifall parenteserna i str matchar varandra, false annars. main-metoden anropar metoden match och skriver ut resultatet av beräkningen. Exempel på användning (.. i exemplen nedan betyder en följd av godtyckliga tecken som inte är vänster- eller höger- parenteser): >java Parenteser..(..(..)..).. Parenteserna matchar >java Parenteser..(..(..).. Varning!! Parenteserna matchar inte >java Parenteser..(..)..(..).. Parenteserna matchar >java Parenteser..)..)..(..(.. Varning!! Parenteserna matchar inte Ledning. Räkna antalet förekomster av vänster- respektive högerparenteser. Vad ska gälla för att parenteserna inte matchar (förutom att antal högerparenteser är lika många som antalet vänsterparenteser? 3. (26p) Spelet Fiver ska implementeras: Fiver går till på följande sätt: En spelplan på t.ex. 5x5 rutor finns. Från början är alla rutor gula och användaren ska försöka få alla rutorna att bli blå genom att klicka med musen. Om användaren klickar med musen på en ruta kommer rutan att byta färg (om den var gul så blir den blå, om den var blå så blir den gul), dessutom kommer rutorna till höger, till vänster, ovanför och nedanför att byta färg (från blått till gult eller gult till blått beroende på vilken färg de hade innan). Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010) 3
Den vänstra bilden visar hur programmet ser ut från början (alla rutorna är gula och antal drag är 0). Mittenbilden visar hur det ser ut när användaren har klickat en gång med musen på rutan i 4:e raden och 3:e kolumnen. Bilden till höger visar hur det ser ut när användaren klickat ytterligare en gång med musen. Denna gång på rutan i 4:e raden och 5:e kolumnen. Under själva spelplanen finns två räknare (Antal drag och Antal gula). Antal drag talar om hur många gånger användaren har klickat på spelplanen med musen och Antal gula talar om hur många av spelplanens rutor som förnärvarande är gula. Längst ner finns två knappar. Ett musklick på den högra (Sluta) avslutar programmet. Om man klickar på den vänstra knappen (Börja om) nollställs spelplanen och spelet börjar om. Spelplanens storlek ska läsas in från kommandoraden. (Du kan anta att användaren alltid startar programmet på rätt sätt, dvs med två heltal på kommandoraden) Programmet består av fyra klasser. En huvudklass Main. I klassen Main finns bara main-metoden som startar upp själva programmet. (Dvs här skapas objekt av FiverModel, FiverVy och FiverKnapp (se nedan). Fivervy och FiverKnapp stoppas ner i en JFrame). Spelplanens storlek läses in från kommandoraden till main. Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010) 4
En modellklass FiverModel, som ansvarar för att hålla ordning på hur vilka rutor som är blå och vilka som är gula. Information om hur många gånger användaren har klickat med musen måste också finnas här. Här finns förutom en konstruktor (minst) tre publika instans-metoder: public int antalgula() som returnerar antalet gula rutor i spelplanen. public void utfördrag(int x, int y) som givet två heltal x och y byter färg på rutan i position (x,y) på spelplanen och som byter färg på rutan till höger, till vänster ovanför och nedanför rutan i position (x,y). public void nollställ() som nollställer spelplanen (dvs sätter alla rutor till at bli gula samt nollställer räknaren Antal drag). I modellklassen behövs också en metod för att avläsa (returnera) status (gul eller blå) för en ruta i en given position i spelplanen. Metoder för att avläsa spelplanens rader och kolumner är också bra att definera här.. En Vy-Kontroll klass FiverVy, som ritar själva spelplanen och texterna Antal drag och Antal gula. Låt FiverVy vara en subklass till JPanel. Rita spelplanen i paintcomponent (Jag har bilagt API utskrif för klassen Graphics.). Låt lyssnarklassen (muslyssnaren) vara lokal i denna klass. (Den exakta layouten är inte viktig. Försök få utseendet att någorlunda likna bilderna ovan. Endast de layouts som är default för respektive komponent har använts för att generera figuren ovan). En Vy-Kontroll klass FiverKnapp där knapparna (JButton) och deras lyssnare finns (lyssnarna är inre klasser till klassen FiverKnapp). Klassen FiverKnapp är en subklass till JPanel. Skriv programmet enligt anvisningarna ovan. 4. (10p) Jultomten i Göteborg delar ut julklappar till ca 20.000 barn på julafton. Det är viktigt att ett barn inte får samma julklappar två år i rad, därför måste tomten hålla ordning på vilken julklapp respektive barn fick av honom förra året. Det är många barn och snart jul, därför behövs ett program där man snabbt och enkelt kan slå upp vilken julklapp ett barn fick förra året. (a) Skriv en klass som tomten kan använda för att översätta från barnets personnummer till julklapp. Det ska finnas tre metoder i klassen. En metod läggtill som man använder för att lägga in ett <personnummer,julklapp> par, en metod harfått som givet ett personnummer returnerar julklapp och en metod tabort som givet ett personnummer tar bort <personnummer,julklapp> paret. Dvs. låt klassen implementera följande interface: Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010) 5
public interface OrdningPåKlapparna{ public void läggtill(int personnummer,string julklapp); public String harfått(int personnummer); public void tabort(int personnummer); Använd en hashtabell för att lagra <personnummer, julklappar> par. (Jag har bilagt API-utskriften för HashMap). (b) Vi utökar interfacet med en metod till public Iterator klappiterator(); som returnerar ett Iterator-objekt som tomten kan använda för att iterera igenom <personnummer,julklapp> paren. Tomten vill iterera över nyckelmängden (dvs personnumren). Implementera metoden klappiterator(). (c) Tomten har använt din lösning från uppgift (a) och (b) (även om du inte gjort dem) och skapat ett objekt klappar (av typen OrdningPåKlapparna) där han har stoppat in alla 20.000 <personnummer,julklapp>-paren. Nu vill han veta vilken julklapp som flest barn fick förra året (och hur många barn som fick julklappen). Skriv ett program som använder informationen som finns i klappar och beräknar (och skriver ut) den vanligaste julklappen (samt hur många barn som fick den). 5. (5p) I många länder går julklappsutdelandet till på följande sätt: På natten när alla sover kryper tomten ner genom skorstenen och lämnar julklapparna (ofta i en strumpa) så att barnen hittar dem morgononen därpå. Det finns många hus och tiden är knapp (alla klappar ska ju delas ut på en natt). Alla hus måste hinnas med. Det har visat sig att en stor del av tiden åtgår för tomten att flytta sig från ett hus till ett annat. Tomten vill därför minimera längden av förflyttningen genom att besöka husen i lämplig ordning. Det visar sig att det är praktiskt ogenomförbart att finna den optimala lösningen till detta problem (även för ett relativt litet antal hus) 1, så vi får nöja oss med att hitta en approximativ lösning. En metod tomten kan använda för att hitta en tillräckligt bra lösning är att varje gång tomten är klar med ett hus alltid gå till det hus som ligger närmast (som han ännu inte har besökt). Husens placering kan ges som punkter i ett tvådimensionellt koordinatsystem (t.ex som koordinater på en karta) och kan lagras i två fält (ett för x-koordinaterna och ett för y- koordinaterna). 1. Problemet som beskrivs är en variant av TSP-probemet. TSP tillhör en klass av problem som kallas NPkompletta. Utmärkande för denna klass av problem är att man i praktiken kan lösa endast små instanser av problemen. Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010) 6
Skriv en metod ordning som givet koordinaterna för de hus som ska besökas beräknar och returnerar i vilken ordning husen ska besökas. public static int[] ordning(double[] x, double[] y); Metoden ska alltså börja i en godtycklig punkt och sedan välja som nästa punkt den punkt som ligger närmast (av dem man inte redan besökt). Metoden returnerar ordningen på hur husen ska besökas. Ledning: Avståndet mellan två punkter (x1, y1) och (x2, y2) ges av formeln: s = ( x1 x2) 2 + ( y1 y2) 2 Du får anta att husens koordinater är av rimlig storleksordning (tex alltid mindre än 100). Ett tips för att udvika att man förflyttar sig till ett hus som redan har besökts är att byta ut x och y koordinaterna för varje hus man besökt till ett stort tal (tex. 10 10 ) så att denna punkt kommer så långt bort att den aldrig väljs igen. Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010) 7