TENTAMEN KURSNAMN Objektorienterad programmering, 7.5p PROGRAM: DAI 2 (TIDAL-2) 2018/2019, lp 1 KURSBETECKNING EXAMINATOR DAT050 Uno Holmer TID FÖR TENTAMEN Onsdagen den 28/8 2019, 08.30 12.30 HJÄLPMEDEL ANSV LÄRARE Java API (delas ut av skrivningsvakten) Uno Holmer tel. 772 5730 besöker tentamen ca kl. 9.30 samt ca 11.15 DATUM FÖR ANSLAG Senast den 16/9 2019 datum för granskning meddelas senare ÖVRIG INFORM. Betygsgränser: 3-24p, 4-36p, 5 48p. (max 60p)
1 (8) TENTAMEN: Objektorienterad programmering Läs detta! Uppgifterna är inte ordnade efter svårighetsgrad. Börja varje uppgift på ett nytt blad. 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 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 (8) 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. 1. Givet klassen public class Counter { private int i = 0; public Counter(int initialvalue) { i = initialvalue; public Counter next1() { ++i; return this; public Counter next2() { return new Counter(i+1); och kodavsnitten 1-3 List<Counter> list = new ArrayList<Counter>(); // 1 for ( Counter x : list ) x = x.next1(); // 2 for ( Counter x : list ) x = x.next2(); // 3 for ( Counter x : list ) x.next1(); Vilket påstående är sant om vi antar att list inte är tom? a. kodavsnitt 1 ändrar inga element i list, men 2 och 3 gör det. b. kodavsnitt 2 ändrar inga element i list, men 1 och 3 gör det. c. kodavsnitt 3 ändrar inga element i list, men 1 och 2 gör det. d. inget av kodavsnitten ändrar något element i list. 2. Vilket påstående är falskt? a. testning kan påvisa förekomsten av fel i ett program. b. avlusning kan avslöja orsaken till fel i ett program. c. testning och avlusning är samma sak. d. regresionstestning bör utföras efter refaktorering. 3. Antag att man vill överskugga metoden equals i klassen Circle i laboration 5. Vilken deklaration av parametern är korrekt? public boolean equals(circle obj) // 1 public boolean equals(shape obj) // 2 public boolean equals(object obj) // 3 a. bara 1 b. bara 2 c. 2 och 3 d. bara 3
3 (8) 4. Betrakta följande javapaket och klasser: package module1; public class C1 { private int x; protected int y; public int z; package module2; import module1.*; public class C4 extends C1 {... public class C5 {... public class C2 extends C1 {... public class C3 {... Låt C i (v 1,,v n ) beteckna att variablerna v 1,,v n är synliga i klassen C i. Vilket av alternativen beskriver synligheten hos variablerna x, y och z i klasserna ovan? a. C1 (x,y,z), C2(y,z), C3(z), C4(y,z), C5(z) b. C1 (x,y,z), C2(y,z), C3(z), C4(z), C5(z) c. C1 (x,y,z), C2(y,z), C3(y,z), C4(z), C5(z) d. C1 (x,y,z), C2(y,z), C3(y,z), C4(y,z), C5(z) 5. Följande kodavsnitt avser att beräkna totala antalet heltal i en tabell av listor. Map<String,List<Integer>> m = new HashMap<String,List<Integer>>();... int count = 0; for ( String key : m.keyset() ) { List<Integer> l = m.get(key); count += l.size(); System.out.println(count); a. koden är inte säker, ett exekveringsfel kan uppkomma b. deklarationen på första raden är inte typkorrekt c. koden är felfri så långt man kan se av vad som visas ovan (10 p)
4 (8) Uppgift 2 I ett lagerhanteringssystem hos företaget X sker med ojämna mellanrum uppdatering av lagerlistor med nya priser. I lagerlistan finns för varje artikel uppgift om artikelnummer, pris, samt antal artiklar i lager. Prislistan med aktuella priser innehåller för varje artikel uppgift om artikelnummer och pris. Exempel: Om lagerlistan till vänster uppdateras med de nya priserna till höger Artikelnr Pris Lagersaldo 12345 100 23 78901 200 8 76563 300 1034 27276 400 199 99213 500 0 så skall lagerlistan ha följande innehåll efter uppdateringen: Artikelnr Pris Lagersaldo 12345 120 23 78901 200 8 76563 1270 1034 27276 400 199 99213 596 0 Artikelnr Pris 99213 596 76563 1270 12345 120 I uppgiften finns tre klasser som skall kompletteras: Item (prisuppgift i prislistan), StoreItem (information om en vara i lagerlistan), samt Store (lagerlistan). Se kodskelett på nästa sida. a) Implementera metoden equals i Item så att den returnerar sant om två objekt innehåller likadana artikelnummer, och falskt annars. Metoden skall ej vara överskuggningsbar vid arv. (4 p) b) Implementera metoden hashcode i Item. c) Implementera metoden tostring i Item. (se även uppgift g) d) Definiera konstruktorn i StoreItem. Konstruktorn skall ha inparametrar motsvarande samtliga instansvariabler. e) Implementera metoden tostring i StoreItem. (se även uppgift g) f) Implementera metoden add i Store som adderar ett nytt artikelobjekt till lagerlistan. Metoden skall bara lägga till objektet om det inte redan finns i listan. Returvärdet skall avspegla om objektet adderades eller ej. g) Implementera metoden update i Store. Metoden skall uppdatera priset på alla artiklar i lagerlistan som finns i listan som ges som inparameter. (4 p) h) Implementera metoden print i Store. Varje rad i utskriften skall ha formen artikelnr: pris (antal)
5 (8) public class Item { private String productid; private int price; public Item(String productid,int price) { this.productid = productid; this.price = price;... equals hashcode tostring public int getprice() { return price; public void setprice(int price) { this.price = price; public class StoreItem extends Item { private int storelevel = 0; // Number of items in the store... public int getstorelevel() { return storelevel; konstruktor tostring public void addtostore(int noofitems) { storelevel += noofitems; public class Store { private List<StoreItem> items = new ArrayList<StoreItem>();... add update print
6 (8) Uppgift 3 En klassisk fransk kortlek har fyra färger (suit) och 13 valörer (rank) av varje kort. Följande gränssnitt beskriver ett minimum av metoder: public interface FrenchCard { enum Suit {HEARTS,SPADES,CLUBS,DIAMONDS int getrank(); Suit getsuit(); Vidare finns följande klass, som vi inte beskriver närmare: public class Card implements FrenchCard,Cloneable,Comparable<Card> Uppgiften är nu att konstruera två metoder (se nedan) i klassen CardHand för att representera en hand av kort. En hand är en samling kort ur en eller flera kortlekar. Klassen har bl.a. följande metoder: public void add(card c) public int size() public Card look(int i) throws IndexOutOfBoundsException public boolean discard(int i) throws IndexOutOfBoundsException adderar kortet c till handen returnerar antalet kort i handen returnerar det i:te kortet i handen tar bort det i:te korten ur handen Dessutom skall klassen ha metoderna clone som returnerar en djup kopia av handen, samt equals som avgör om två händer är lika. Två händer är lika om de innehåller lika många kort, samt lika många av varje kort. Den interna ordningen bland korten spelar ingen roll för om två händer är lika eller ej. Ex. Card c1 = new Card(4,FrenchCard.Suit.DIAMONDS); Card c2 = new Card(12,FrenchCard.Suit.SPADES); Card c3 = new Card(9,FrenchCard.Suit.HEARTS); CardHand h1 = new CardHand(); h1.add(c1); h1.add(c2); h1.add(c3); CardHand h2 = new CardHand(); h2.add(c3); h2.add(c1); h2.add(c2); System.out.println(h1.equals(h2)); // true System.out.println(h2.equals(h1)); // true Du kan anta att handen är representerad som en lista av kort. Implementera metoderna clone och equals. Ingen av metoderna får ändra kortens inbördes ordning. Tips: Utnyttja clone och Collections.sort i equals! (12 p)
7 (8) Uppgift 4 Vilka av arven 1-7 är tillåtna i Java, vilka ger kompileringsfel? Motivera svaret! a) public interface I1 {... 1. public interface I2 extends I1 {... 2. public interface I3 extends I1 {... 3. public interface I4 extends I2, I3 {... 4. public class C1 implements I3 {... 5. public class C2 extends C1 implements I4 {... 6. public class C3 extends C1 {... 7. public class C4 extends C2, C3 {... (7 p) b) Vissa av klasserna nedan måste deklareras som abstrakta, vilka? Vilka klasser kan instansieras? Motivera svaret! public interface I1 { void f(); public interface I2 { void g(); public class C1 implements I1, I2 { public void f() {... public void h() {... public class C2 implements I2 { public void g() {... abstract public void i(); public class C3 extends C1 { public void g() {... public class C4 extends C2 { public void i() {... (5p)
8 (8) Uppgift 5 Följande klass kan användas för att lagra temperaturuppgifter i en liten enkel väderstation: public class TemperatureDatabase { private... public TemperatureDatabase() {... public int update(string city,int newtemperature) {... Skriv färdigt klassen. Använd en lämplig samlingsklass för att associera stadsnamn med temperaturvärden. Metoden update skall byta ut det gamla temperaturvärdet mot det nya och returnera det gamla om ett sådant finns registrerat, annars sätts den nya staden och temperaturvärdet in och -1 returneras. (12 p)