Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010) Tid: 2:a september 200, klockan 8:30-12:30. Plats: V Ansvarig lärare: Katarina Blom, tel 772 10 0. Läraren besöker tentamen kl 9:30 och 11:30 Tillåtna hjälpmedel: En (valfri) inbunden bok om Java (mindre anteckningar i boken tillåtna). Poänggränser: G 28p, VG 48p, max 0p Lösningsförslag finns på kurshemsidan dagen efter tentamensdagen. Resultat Anslås senast 19 kalenderdagar efter tentamensdagen Granskning 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, utom ifall du använder av static import (statisk import). Lycka till! Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010) 1
1. Man har skrivit programmet Ruta nedan Programmet går igenom utan kompileringsfel och fungerar fint när man kör det (observera att endel av programmet finns på nästa sida). (a) (p) Vad gör programmet när det exekveras? (Beskriv kort, helst inte mer än 4- meningar). (b) (3p) På 4:e raden i programmet har man skrivit public class Ruta extends JPanel implements MouseListener Vad betyder det? Vad hade hänt om man istället skrivit public class Ruta extends MouseListener implements JPanel (c) (3p) På sista raden i programmet har man skrivit f.setdefaultcloseoperation(jframe.exit_on_close); Vad är EXIT_ON_CLOSE för något? Var finns den förmodligen deklareread? (d) (3p) Det finns fyra metoder som är tomma (mouseexited, mouseentered, mousereleased och mousepressed). Varför har man skrivit dit dem? Vad händer om man tar bort dem? import javax.swing.*; import java.awt.event.*; import java.awt.*; public class Ruta extends JPanel implements MouseListener{ private int DIM = 20; private Color marked; public Ruta(Color m){ marked = m; addmouselistener(this); setpreferredsize(new Dimension(DIM,DIM)); public void mouseclicked(mouseevent e){ double slump = Math.random(); if(slump<.1) marked=color.red; else if(slump<.2) marked = Color.blue; else if(slump<.3) marked = Color.yellow; else if(slump<.4) marked = Color.cyan; else marked = Color.black; repaint(); public void mouseexited(mouseevent e){ public void mouseentered(mouseevent e){ public void mousereleased(mouseevent e){ Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010) 2
public void mousepressed(mouseevent e){ public void paintcomponent(graphics g){ g.setcolor(marked); g.fillrect(0,0,dim,dim); public static void main(string[] args){ JFrame f = new JFrame(); f.add(new Ruta(Color.yellow)); f.pack(); f.setvisible(true); f.setdefaultcloseoperation(jframe.exit_on_close); 2. Sudoku 1 går ut på att placera siffrorna 1 till 9 i 9x9 (=81) rutor. Siffrorna ska inte bilda någon speciell summa. Det enda som gäller är att ingen siffra får förekomma mer än en gång per rad och kolumn. Dessutom ska alla nio siffrorna finnas med i var och en av de nio 3x3-rutor (regioner) som krysset är indelat i. När spelet börjar finns vissa siffror redan givna på spelplanen. Ju färre givna siffror, desto svårare Sudoku. (En äkta Sudoku har bara en lösning). Man kan börja var som helst i rutsystemet med att fylla i siffrorna. I Sudoku-spelet nedan är 30 siffor ifyllda. För att lösa spelet ska man fylla i de övriga sifforna enligt reglerna ovan. 1 4 8 3 2 1 8 4 7 3 7 9 1 4 2 7 2 9 4 8 7 Tex. är det möjligt att placera 3 eller 9 i rutan högst upp till vänster (1, 4, och finns på första raden, 2,, 7 och 8 finns i första kolumnen, och 2, och 8 finns i samma region, kvar blir 3 och 9). 1. Spelet förekommer i de flesta dagstidningar och det finns mängder med websidor om spelet, se tex www.sudoku.com Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010) 3
Skriv en klass som heter Sudoku. (Läs igenom hela uppgiften innan du börjar lösa den). (1p) Det ska finnas en instansvariabel, ett tvådimensionellt heltalsfält (9x9 heltal) som representerar ett sudoku-spel. För att markera att en ruta är tom (oifylld) kan man tex låta motsvarande position i fältet vara 0. (1p) Det ska finnas en instansvariabel, ett tvådimensionellt heltalsfält (9x9 heltal) som representerar lösningen till sudoku-spelet. Instansvariabeln initieras i konstruktorerna (se nedan). Låt instansvariabeln heta lösning. (12p) Klassen ska innehålla en konstruktor med en parameter (lösningen till spelet). Man vill använda denna kostruktor då ett spel med alla rutor oifyllda ska skapas. Om lösningen som ges är giltig ska instansvariabeln lösning initieras med dessa värden. Om lösningen som ges inte är giltig vidtas lämplig åtgärd (Skriv gärna en kort kommentar och förklara varför denna åtgärd är lämplig). I en gilitig lösning är alla heltal på alla positioner tillåtna. Tips: Skriv en privat hjälpmetod private boolean numberok(int row,int kol,int num,int[][] spel) som returnerar true ifall heltalet num är tillåtet på positionen row, kol i spelet spel. Använd sedan metoden i konstruktorn. (4p) Fyra metoder public void put(int row, int kol, int num) public int get(int row, int kol) public int getsol(int row, int kol) public int remove(int row, int kol) put stoppar in heltalet num på position row, kol i sudokuspelet (ifall det är tillåtet). get returnerar heltalet från position row, kol i sudoku-spelet, getsol returnerar heltalet på position row, kol i lösnigen (lösning) och remove tar bort heltalet på position row, kol i sudoku-spelet och returnerar det.. (p) Det ska finnas en metod public boolean solutionok() som kontrollerar ifall sudokuspelet är löst (dvs. att spelet är lika med lösningen), isåfall returneras true Om du behöver några lokala hjälpmetoder eller fler instansvariabler går det naturligtvis bra. Men du måste implementera dem för att kunna få full poäng på de metoder som använder dem. 3. (1p) Låt klassen Sudoku ovan utgöra en modell-klass för ett Sudokuspel. Det ska också finnas en vy-kontroll-klass till spelet, som ritar upp sudoku-spelet (rutmönster med aktuella siffror). Låt klassen heta SudokyKontrollVy och vara en subklass till JPanel. Sudoku-spelet i exemplet ovan ska ge följande vy (se Bild 1). Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010) 4
Bild1: Om man placerar musen på fönstret ska lösningen skrivas ut. Med exemplet ovan skulle det se ut enligt Bild 2: Bild 2: Så fort musen avlägsnas från fönstret visas bara de siffror som just nu är ifyllda (dvs. enligt Bild 1 igen). Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)
4. (8p)Du har fått jobb som labrättare på kursen i objektorienterad programmering. Du sitter just nu och rättar laborationer på kursen. Du har n stycken laborationer att rätta. Olika laborationer tar olika lång tid att rätta (vissa grupper har lämnat in ganska omfattande lösningar, andra grupper har lämnat in lite kortare lösningar). Men du vet på förhand hur många minuter det tar att rätta en viss laboration. Du vill nu rätta laborationerna i en sådan ordning att hon minimerar väntetiden för alla labgrupper. Exempel: Antag att du har fått in 3 laborationer och tiderna det tar att rätta dem är: lab1 = minuter, lab2 = 10 minuter, lab3 = 3 minuter. Om du väljer att rätta lab1 först, sedan lab2 och sist lab3 blir den totala väntetiden för alla grupper + (+10) + (+10+3) = 38 minuter. Om du istället väljer att rätta lab3 först, följt av lab1 och sist lab2 blir den totala väntetiden istället 29 minuter ( 3 + (3+) + (3++10) ). Man kan visa att det lönar sig bäst att rätta laborationerna i ordningen så att du börjar med den som går fortast, följt av den som går näst fortast osv. Skriv en metod int [] labrättningsoptimering(int[] di) som givet ett heltalsfält (di) med tider för hur lång tid det tar att rätta respektive laboration, beräknar (och returnerar) ett fält som innehåller den ordning som laborationerna ska rättas i. Metoden ska kunna hantera godtyckligt långa fält di. Exempel: Om di = [10,4,,2] ska metoden returnera fältet [4,2,3,1] (dvs. man ska börja med den 4:e laborationen, sedan rätta den 2:a, följt av den 3:e och rätta den första sist). Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)