1 (9) 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 metoder klasser etc. från tidigare deluppgifter, även om du inte löst dessa. Lycka till!
2 (9) 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-5 på ett blad. 1. Vilken av clone-metoderna kopierar B på korrekt sätt? public class A { public A clone() { public class B { private int x; private A a; public B clone() { se nedan a) public B clone() { return (B)super.clone(); c) public B clone() { B tmp = new B(); tmp.x = x; tmp.a = a.clone(); return tmp; b) public B clone() { B tmp = (B)super.clone(); tmp.a = a.clone(); return tmp; d) public B clone() { B tmp = this.clone(); tmp.a = a.clone(); return tmp; 2. Vilket påstående om klasserna nedan stämmer bäst? public class Person { private String name; private ContactInfo contact; public class ContactInfo { private String address; private String phone; private String email; private List<Person> friends; public int getnooffriends() { public Person getfriend(int i) { a. Klasserna har hög kohesion och kopplingen mellan klasserna är hög. b. Klasserna har låg kohesion och kopplingen mellan klasserna är låg. c. Klasserna har hög kohesion och kopplingen mellan klasserna är låg. d. Klasserna har låg kohesion och kopplingen mellan klasserna är hög.
3 (9) 3. En av deklarationerna ger ett typfel, vilken? a. List<LinkedList> l = new ArrayList<LinkedList>(); b. ArrayList<List> l = new ArrayList<List>(); c. ArrayList<List> l = new ArrayList<LinkedList>(); d. List<List> l = new ArrayList<List>(); 4. Givet klassen Num public class Num { private int x; public Num() { x = 0; public void set(int x) { this.x = x; public int get() { return x; vad skrivs ut om detta exekveras: ArrayList<Num> list = new ArrayList<Num>(); Num n = new Num(); for (int j = 0; j < 3; j++) list.add(n); int k = 1; for (Num x : list) x.set(k++); for (Num x : list) System.out.println(x.get()); a. 0 0 0 b. 3 3 3 c. 1 2 3 d. 3 2 1 5. 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. C2(y,z), C3(z), C4(y,z), C5(z) b. C2(y,z), C3(z), C4(z), C5(z) c. C2(y,z), C3(y,z), C4(y,z), C5(z) d. C2(y,z), C3(y,z), C4(z), C5(z) (10 p)
4 (9) Uppgift 2 Följande klass kan användas för att lagra intresseanmälningar för mötestider: public class Bokningssystem { private public Bokningssystem() { public void boka(string tid,string namn) { public void listaalla() { För att boka en person för en mötestid anger man en tidpunkt och personens namn. Tidpunkter anges som strängar på formen åååå_dagnr_hh:mm, t.ex. 2006_123_08:30. Om tidpunkten t1 kommer före t2 så kommer t1 före t2 i bokstavsordning, och vice versa, om de representeras på ovanstående sätt. Skriv färdigt klassen. Använd en lämplig struktur för att associera tidpunkter med intresseanmälningar och en lämplig struktur för att lagra namnen. Metoden listaalla skall ge en utskrift på formen 2006_137_10:30 Kalle, Ville, Ylva 2006_137_11:40 Svea 2006_138_14:00 Lisa 2006_263_20:15 Niklas Tiderna skall listas i tidsordning. // bokstavsordning (12 p)
5 (9) Uppgift 3 Betrakta följande klasser public class Base { private int a; protected int b; public class Sub1 extends Base { private int c; protected int d; public void func( Base obj ) { obj.a = 1; obj.b = 2; obj.c = 3; obj.d = 4; obj.e = 5; obj.f = 6; public class Sub2 extends Base { private int e; protected int f; Om vi definierar Sub1 sub1 = new Sub1(); sub1.func( new Sub1() ); sub1.func( new Sub2() ); Vilka av variablerna a f är synliga i de två olika anropen av func? Vilka ger kompileringsfel? Varför? För full poäng krävs en ordentlig motivering av svaret. (8 p)
6 (9) Uppgift 4 a) Konstruera en klass som kan användas som en timer för tidmätning. Följande publika metoder skall finnas i klassen: public void start() Public void stop() Public void reset() Public long getvalue() Startar tidmätning. Stoppar tidmätning. Nollställer timern. Returnerar ackumulerad tid i millisekunder. En timer kan vara vilande eller gående. En timer kan ackumulera tid. Man kan alltså addera gångtid för flera mätperioder genom att starta och stoppa den omväxlande. Detta fortgår tills timern nollställs i viloläge. Timern skall uppfylla följande krav: En nyskapad timer är nollställd och vilande. Anrop av getvalue på en nollställd vilande timer skall returnera 0. Efter anropet av start på en vilande timer blir timern gående. Anrop av metoderna start och reset har ingen effekt på en gående timer. Anrop av stop har ingen effekt på en vilande timer. Efter anrop av reset på en vilande timer skall timern vara nollställd. Tidsackumulering: Vid ett anrop av stop på en gående timer blir timern vilande. Om den senaste gångperioden varat tiden t och getvalue skulle returnerat t om den anropats före det senaste anropet av start, så skall getvalue nu returnera t + t. Om getvalue anropas på en gående timer skall den returnera samma värde som om den anropats före det senaste anropet av start. Tiden för den senaste gångperioden adderas alltså inte förrän timern stoppas. Exempel: (returvärdet anges i kommentaren) Timer t = new Timer(); t.getvalue(); // 0 t.start(); t.stop(); t.getvalue(); // 100 t.start(); t.getvalue(); // 100 t.stop(); t.getvalue(); // 300 t.reset(); t.getvalue(); // 0 0 100 200 300 400 500 600 tidpunkt för anropet (ms) Implementera klassen Timer. Klassens instansvariabler skall vara privata.
7 (9) Ett enkelt sätt att mäta tid i Java är att använda klassen Date. Exempel: Date d = new Date(); d.gettime() returnerar tiden i millisekunder sedan 1970-01-01 00:00:00 Tidskillnad kan mätas på följande sätt: Date d = new Date(); long start = d.gettime(); // det går lite tid d = new Date(); long tidskillnad = d.gettime() start; System.out.println( Det tog + tidskillnad + ms ); Tips: Använd en boolesk instansvariabel i timerklassen för att hålla reda på om timern går eller inte. (10 p) b) Definiera en subklass ClockTimer till Timer som fungerar precis som Timer med tillägg av följande tre metoder: Exempel: public int gethours() public int getminutes() public int getseconds() ClockTimer ct = new ClockTimer(); ct.start(); det går 9978000 ms returnerar timdelen av timerns tid returnerar minutdelen av timerns tid returnerar sekunddelen av timerns tid ct.stop(); System.out.println( ct.getvalue() ); 9978000 System.out.println( ct.gethours() ); 2 System.out.println( ct.getminutes() ); 46 System.out.println( ct.getseconds() ); 18 Bivillkor: 0 x.gethours()< 24 0 x.getminutes()< 60 0 x.getseconds()< 60 (6 p)
8 (9) Uppgift 5 I en av kursens laborationer arbetade vi med olika klasser för geometriska figurer, däribland Group för att representera sammansatta figurer. Uppgiften går ut på att konstruera en likhetsmetod för sammansatta figurer. Basklass för alla figurklasserna är Point. Vi bortser från alla detaljer som saknar relevans för uppgiften. public abstract class Point { public int getxposition() public int getyposition() public abstract boolean equals(object other); // Ny Klassen Group har i korthet följande utseende: public class Group extends Point { private ArrayList<Point> subpictures; public boolean equals(object other) { // Ny Vi skall tillämpa principen att om a.equals(b) returnerar true för figurerna a och b så skall de se likadana ut när de ritas upp. Att de är lika innebär dock inte att de måste finnas på samma plats. Enkla figurer, t.ex. cirklar, kvadrater eller trianglar är lika om de har samma dimensioner och färg. För figurgrupper blir det lite mer komplicerat. Två grupper är lika om de har lika många delfigurer och dessa är parvis lika, men det räcker inte. Delfigurernas inbördes geometriska orientering måste också vara lika. I exemplet nedan innebär det att vektorerna u 1 = v 1, u 2 = v 2 och u 3 = v 3. En följd av sådana vektorer skall vi kalla en promenad (walk) genom gruppen. Ex. (v 1,v 2,v 3 ) och (u 1,u 2,u 3 ). u 1 u 2 u 3 v 1 v 2 v 3 För representation av vektorer finns den färdiga klassen (detaljer utelämnade): public class Vector { public Vector(int x,int y) public int getx() public int gety() public boolean equals(object other) a) Skriv en metod walk som givet en lista av punkter (Point) returnerar en lista av vektorer. Tips: Skriv en privat hjälpmetod diff som returnerar skillnadsvektorn mellan två punkter. (7 p) forts.
9 (9) b) Inför metoden public boolean equals(object other) i Group. Om objekten a och b båda är av typen Group så skall a.equals(b) returnera true om grupperna som a och b representerar är lika enligt principerna ovan, annars false. Tips: Utnyttja att listklassen har en equals-metod. (7 p)