1 (13) TENTAMEN: Objektorienterad programmering Läs detta! Uppgifterna är inte ordnade efter svårighetsgrad. Börja varje uppgift på ett nytt blad. Skriv ditt idnummer på varje blad (så att vi inte slarvar bort dem). Skriv rent dina svar. Oläsliga svar r ä t t a s e j! Programkod som finns i tentamenstesen behöver ej upprepas. Programkod skall skrivas i Java 5 (eller senare) och vara indenterad och kommenterad. Onödigt komplicerade lösningar ger poängavdrag. Givna deklarationer, parameterlistor etc. får ej ändras. Läs igenom tentamenstesen och förbered ev. frågor. I en uppgift som består av flera delar får du använda dig av funktioner klasser etc. från tidigare deluppgifter, även om du inte löst dessa. Lycka till!
2 (13) Uppgift 1 Välj ett alternativ för varje fråga! Garderingar ger noll poäng. Inga motiveringar krävs. Varje korrekt svar ger två poäng. Besvara direkt i tesen! 1. Ett av villkoren är sant, vilket? Integer i1 = new Integer(123), i2 = new Integer(123), i3 = i1; a. i2.equals(i3) b. i1 == i2 c. i2 == i3 2. Vilket påstående är korrekt om Register på basis av vad som visas nedan? public class Register private LinkedList list; private String name; public Register(String name) this.name = name; public void add(person p) list.add(p); a. Klassen går ej att kompilera b. Det går ej att skapa objekt av klassen c. Exekveringen riskerar att avbrytas om objekt av klassen används d. Klassen är felfri 4. Vilket påstående är mest korrekt? a. En klass med hög kohesion har låg koppling till andra klasser. b. En klass med hög koppling till andra klasser har låg kohesion. c. En klass med låg koppling har få kontakter med andra klasser. d. En klass med hög kohesion löser många olika problem. 4. Vilken aktivitet bör alltid utföras efter förändring av programkod? a. Modellering b. Regressionstestning c. Refaktorering
3 (13) 5. Vilken av satserna a eller b ger ett kompileringsfel? public class A private int x; public int y; public class B extends A public void f() x = 10; B obj = new B(); obj.y = 11; // a // b (10 p)
4 (13) Uppgift 2 Ett alarm med snooze-funktion skall ha följande funktionalitet. Man skall kunna ange alarmtid och påminnelseschema med tidsintervall mellan påminnelserna och maximalt antal påminnelser. För enkelhets skull anges här tid i hela sekunder och vi avstår från akustiska alarm utan nöjer oss med visuella i form av pop-up-dialoger. Vid det första alarmet och alla påminnelser utom den sista skall följande dialogfönster komma upp på skärmen: Användaren kan nu välja att somna om genom att trycka på Ja, eller att avbryta alarmet med Nej. Om Ja väljs fås ett nytt larm efter inställt tidsintervall. Den sista påminnelsen skall ha formen Man skall i en och samma applikation kunna starta flera oberoende alarm. Ett alarm motsvaras av ett objekt av klassen SnoozeAlarm. Definiera klassen enligt ovanstående beskrivning. Klassen skall ha en konstruktor som tar tre parametrar enlig ovan. Exempel: SnoozeAlarm a = new SnoozeAlarm(3600,60,5); Efter att tråden för a startats skall det första alarmet komma efter en timma, och max fem påminnelser med en minuts intervall. Lösningen skall baseras på Javas trådmekanism. Plats finns på nästa sida. (8 p)
5 (13) public class SnoozeAlarm
6 (13) Uppgift 3 a) I en viss prisjämförelsesajt ger sökningar resultatobjekt av typen public class Product private String id; // produktnummer private String description; // produktbeskrivning private float price; // konsumentpris inkl. moms private int deliverytime; // max leveranstid (dagar) private int returnlimit; // max tid för returrätt (dagar) Antag att man vill addera jämförelsemetoden compareto i Product så att följande gränssnitt implementeras public interface Comparable<T> int compareto(t obj); Visa i koden ovan tillägget skall se ut. Du kan lämna metodkroppen tom. (2 p) b) Implementera metoden compareto i Product som skall fungera så att a.compareto(b) returnerar -1 om a beskriver en produkt som är ett bättre köp än b, 0 om de två är likvärdiga, och 1 om a är ett sämre alternativ än b. Följande kriterier gäller för denna speciella metod: En billigare vara är alltid ett bättre köp än en dyrare. Om två varor har samma pris är den med kortast leveranstid att föredra. Av två varor med samma pris och leveranstid föredras den som har längst ångervecka. Två varor med samma pris, leveranstid och returtid är likvärdiga. Exempel: Product a = new Product("123456","USB memory,64gb",125,3,10); Product b = new Product("987987","USB memory,64gb",120,3,10); Product c = new Product("675654","USB memory,64gb",120,2,10); Product d = new Product("919283","USB memory,64gb",120,2,20); a.compareto(a); 0 a.compareto(b); 1 b.compareto(a); -1 c.compareto(b); -1 d.compareto(c); -1 b.compareto(d); 1 (6 p)
7 (13) c) I en viss programvara hos prisjämförelsesajten finns klassen public class Kelko private ArrayList<Product> searchresult = new ArrayList<Product>(); public Product findbestbuy() Implementera metoden findbestbuy. Metoden skall returnera ett produktobjekt som motsvarar bästa köp enligt metoden compareto i a) och b). (6 p)
8 (13) Uppgift 4 Designen av nedanstående klasser har bristen att Clock beror av gränssnittsklasserna Display och Console. Det borde vara tvärtom. Komplettera koden på nästa sida så att designmönstret Observer realiseras. Det räcker om du visar mönstret för klasserna Clock och Display (Console blir analogt). public class Clock private Time time; Display display; Console console; public void tick() time++; display.show( time ); console.print( time ); public class Display public show( Time time ) public class Console public print( Time time ) forts.
9 (13) public class Clock private Time time; public void tick() time++; public class Display public Display( Clock clock ) private show( Time time ) (6 p)
10 (13) Uppgift 5 Följande program konverterar mellan olika valutakurser. Man väljer mellan vilka kurser som konverteringen skall ske i menyn Actions. Uppgiften går ut på att implementera en sådan konvertering, från dollar till svenska kronor (för enkelhets skull hårdkodat nedan). Inläsningen av dollarbeloppet skall ske med ett dialogfönster (pop-up). Komplettera koden nedan med kod som skapar menyalternativet Dollars to SEK en lyssnare som när Dollars to SEK väljs begär $-input via pop-up-dialogen och visar både dollarbeloppet och beloppet i svenska kronor i fönstret enligt ovan. (12 p) Fyll i dina lösningar nedan. public class CurrencyConverter public final static double dollartosek = 7.81; private JFrame frame; private JLabel sekdigits; private JLabel dollardigits; public CurrencyConverter() makeframe();
11 (13) private void makeframe() frame = new JFrame("Currency converter"); makemenubar(frame); JPanel contentpane = (JPanel)frame.getContentPane(); contentpane.setlayout(new GridLayout(2,2)); sekdigits = new JLabel(); dollardigits = new JLabel(); contentpane.add(new JLabel("$")); contentpane.add(dollardigits); contentpane.add(new JLabel("SEK")); contentpane.add(sekdigits); frame.pack(); frame.setvisible(true); private void makemenubar(jframe frame) JMenuBar menubar = new JMenuBar(); frame.setjmenubar(menubar); JMenu menu = new JMenu("Actions"); menubar.add(menu); // end of CurrencyConverter
12 (13) Uppgift 6 Iteratorer kan som bekant användas för att navigera i olika datastrukturer, t.ex. listor. Antag att man vill utvidga sina iteratorer med ytterligare operationer. I java möter detta vissa problem eftersom de konkreta iteratorklasserna i standardbiblioteket inte är åtkomliga för arv. En lösning är att istället använda ett av designmönstren som behandlats i kursen. Med detta mönster kan man istället för att använda arv komplettera objekt med nya operationer. Exempel: I Iterator finns metoden next som returnerar nästa element i strukturen den är kopplad till, och därefter avancerar iteratorn till nästa element. En användbar metod som inte finns i Iterator skulle kunna vara chop(n) som returnerar en lista av de n följande elementen. chop kan ses som en generalisering av next eftersom next() är ekvivalent med chop(1).get(0), d.v.s. chop(1) returnerar en lista med ett element som plockas ut med get(0). Så här kan ett stycke applikationskod som använder chop se ut: List<Integer> l = new ArrayList<Integer>(); for ( int i = 0; i < 10; i++ ) l.add(i); ChopIterator<Integer> it = new ChopIterator<Integer>(l.iterator()); int i = 0; while ( i < 3 && it.hasnext() ) System.out.println(it.next()); i++; List<Integer> l2 = it.chop(5); for ( Integer x : l2 ) System.out.println(x); l2 = it.chop(100); for ( Integer x : l2 ) System.out.println(x); 0 1 2 3 4 5 6 7 8 9 Implementera klassen ChopIterator. Metoderna hasnext, next och remove skall fungera precis som i Iterator. Metoden chop skall ha följande egenskaper: public List<T> chop(int n) Returns a list consisting of the next n elements in the iteration. If there are fewer than n elements left, all remaining elements are returned. If n is less than or equal to zero, or the iteration has no more elements, an empty list is returned. Iterator finns i hjälpmedelsbilagan Java API. Välj själv vilken sorts lista som returneras från chop. Plats för lösningen finns på nästa sida. (10 p)
13 (13) public class ChopIterator<T> implements Iterator<T>