1 (7) TENTAMEN: Objektorienterad programmering Läs detta! Uppgifterna är inte ordnade efter svårighetsgrad. Börja varje hel uppgift på ett nytt blad. Skriv inte i tesen. Ordna bladen i uppgiftsordning. Skriv din tentamenskod 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 version, och vara indenterad och renskriven. 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 (7) 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 delfrågorna 1.1-1.5 på ett blad. 1. Vilket påstående om en objektorienterad design stämmer bäst? a. Hög kohesion medför ofta hög koppling. b. Hög kohesion medför ofta låg koppling. c. Låg kohesion beror ofta på låg koppling. 2. Givet public interface A public class B public class C extends B implements A Vilket är typkorrekt? a. B x = new C(); A y = x; b. A x = new C(); B y = x; c. B y = new C(); C x = y; d. Inget av ovanstående. 3. Ett av fallen a, b eller c ger ett kompileringsfel, vilket? public class A { private void f() { protected void g() { public void h() { public class B extends A { public void f() { public void g() { private void h() { // a // b // c 4. Antag att klasserna C1 och C2 definieras: public class C1 implements Cloneable { public Object clone() throws CloneNotSupportedException {... public class C2 implements Cloneable { private int x; private String s; private C1 c; public Object clone() throws CloneNotSupportedException { // se a-d nedan forts.
3 (7) Vilken implementering av clone i C2 är korrekt? C2 copy = (C2)super.clone(); copy.c = new C1(); C2 copy = (C2)super.clone(); copy.c = (C1)c.clone(); c) C2 copy = new C2(); copy.x = x; copy.s = new String(s); copy.c = (C1)c.clone(); d) C2 copy = (C2)super.clone(); copy.s = s.clone(); copy.c = (C1)c.clone(); 5. Vilka metoder måste finnas i en klass om objekt av klassen skall lagras i ett TreeSet? a. equals, hashcode och compareto b. hashcode och compareto c. equals och hashcode d. compareto e. hashcode f. equals (10 p)
4 (7) Uppgift 2 I ett IT-system för en web-shop hanteras information om olika produkter i varulagret. Produkter beskrivs av gränssnittet public interface Product { String getid(); String getdescription(); float getprice(); void setprice(float price); Metoden getid returnerar produktens artikelnummer, getdescription dess beskrivning samt getprice priset. Med setprice kan man ändra priset. Konstruera klassen MyProduct så att den implementerar gränssnittet Product. Inför lämpliga instansvariabler. Klassen skall ha en konstruktor med parametrar så att nya produktobjekt kan initieras med produktid och beskrivning. Dessutom skall klassen ha metoderna equals och hashcode. Två produktobjekt skall vara lika om deras artikelnummer (id) är lika, annars olika. (6 p) I systemet skall också finnas ett objekt som håller reda på lagersaldot för alla produkter. När man köper in en produkt ökas saldot och när man säljer minskas det. Följande gränssnitt beskriver denna information: public interface Store { void buy(product p,int n) void sell(product p,int n) throws IllegalArgumentException; int getbalance(product p) throws IllegalArgumentException; float getvalue(product p) throws IllegalArgumentException; float gettotalsold(); Metoden buy registrerar att n st p har köpts in till lagret, metoden sell att n st p har sålts, metoden getbalance returnerar antalet p i lager, metoden getvalue ger det totala lagervärdet för produkten p och slutligen returnerar gettotalsold försäljningssumman för alla sålda produkter. IllegalArgumentException kastas av sell, getbalance och getvalue om den angivna produkten är okänd, samt av sell om angivet antal är negativt. Konstruera klassen MyStore så att den implementerar gränssnittet Store. Inför lämpliga instansvariabler och en konstruktor. Tips: Lagra informationen i en map av lämpligt slag. Exempel: Nedan visas ett exempel på hur klasserna ovan kan användas: (10 p)
5 (7) public static void main(string[] arg) { Product apple = new MyProduct("123456","Red apple"); apple.setprice(25.0); Product banana = new MyProduct("987654","Banana"); banana.setprice(39.0); Store store = new MyStore(); store.buy(apple,100); store.buy(banana,200); store.sell(apple,50); store.sell(banana,25); System.out.println("Apple(balance): " + store.getbalance(apple)); System.out.println("Apple(value): " + store.getvalue(apple)); System.out.println("Banana(balance): " + store.getbalance(banan); System.out.println("Banana (value): " + store.getvalue(banan); System.out.println("Total sold: " + store.gettotalsold()); Utskriften då main exekveras blir: Apple (balance): 50 Apple (value): 1250.0 Banana (balance): 175 Banana (value): 6825.0 Total sold: 2225.0 Uppgift 3 I klassen SomeArrayMethods finns metoden public static int[] randomarray(int n) som returnerar ett sorterat fält av n unika slumpmässiga heltal. Konstruera metoden randomarray! Tips: Utnyttja en slumptalsgenerator och en lämplig datasamling i algoritmen. Ett fält kan sorteras med metoden public static void sort(int[] i klassen Arrays. (8 p) Konstruera en testmetod i JUnit-stil, testisorderedandunique, som testar om fält som returneras av randomarray har rätt antal element, om de är sorterade och om elementen är unika. Testmetoden skall undersöka dessa egenskaper för varje n i intervallet [1,10000]. Använd lämpliga metoder i klassen Assert. (6 p)
6 (7) Uppgift 4 Konstruera metoden public static int yearofbirth(string pnr) som givet ett personnummer i strängform, returnerar födelseåret som ett heltal. En personnummersträng skall innehålla 12 siffror. Ex. 190207141236. Följande felsituationer skall identifieras och ge upphov till att ett undantag kastas: Argumentet är null. Strängen har fel längd. Strängen innehåller tecken som inte är siffror. För lämpliga undantagstyper och feltexter, se uppgift b. (8 p) Skriv en undantagshanterare som anropar metoden i a med ett personnummer som argument. Om metoden returnerar normalt skall födelseåret skrivas ut, annars skall eventuellt undantag fångas och skrivas ut. Exempel på utskrifter: 1902 NullPointerException: yearofbirth: argument is null IllegalArgumentException: yearofbirth: pnr must contain 12 digits IllegalArgumentException: yearofbirth: pnr must contain digits only (2 p) Uppgift 5 I ett program för att hantera tärningsspel finns gränssnittet public interface Die { void roll(); int getvalue(); samt klassen public class StandardDie implements Die { //code not shown here som implementerar en vanlig sexsidig tärning. Implementationen är avsiktligt dold. Nu behöver man ha tillgång till tärningar som aldrig upprepar föregående utfall vid nästföljande kast. En sådan tärning ger t.ex. aldrig två sexor i följd. Din uppgift är att implementera klassen public class NoRepeatDie implements Die Klassen NoRepeateDie har, förutom metoderna som specificeras av gränssnittet Die, även metoden public void norepeatroll() som skiljer sig från metoden roll genom att den aldrig ger samma värde två gånger i följd. Tips: Du får använda ett objekt av klassen StandardDie i lösningen.
7 (7) (10 p)