Lösningsförslag Programmeringsmetodik, KV: Java och OOP 17 januari 2004 Examinator: Johan Karlsson Skrivtid: 9-15 Hjälpmedel: En av följande böcker: Barnes & Kölling: Objects First With Java a practical introduction using BlueJ Lewis & Loftus: Java Software Solutions Holm: Objektorienterad programmering och Java (eller motsvarande) Maxpoäng: 600 (plus 280 om du inte skrev duggan) För godkänt krävs normalt 500 poäng på kursen. Observera att uppgift 9-13 enbart ska lösas av de som inte skrev duggan! Betyg som ges är U, G och VG. Börja varje uppgift på ett nytt blad och skriv uppgiftsnummer längst uppe till höger. Skriv namn och personnummer på varje blad Uttryck dig mycket tydligt. Alla otydligheter tolkas till din nackdel. Om du är osäker på tolkningen av en fråga, skriv ner en rimlig tolkning av frågan och lös enligt den tolkningen. Är frågan uppdelad i flera deluppgifter kan man klara senare deluppgifter även om man inte klarat första. Försök därför lösa alla deluppgifter. Resultat kommer att tillkännages via webben. Lärare kommer förbi kl. 11.00 Lycka till!
Uppgift 1 (10 p) Uppgift 2 (40 p) public class Train { private int maxpassengers; private int current = 0; public Train(int maxpassengers) { this.maxpassengers = maxpassengers; public void addpassenger() throws TrainFullException { if (current < maxpassengers) { current++; else { throw new TrainFullException(); public class TrainFullException() extends Exception { public TrainFullException() { super(); public class MyClass { public void mymethod() { Train t = new Train(); try { t.addpassenger(); catch (TrainFullException() { System.err.println( MyClass: addpassenger: Train was full! ); 2
Uppgift 3 (60 p) public class Person { private String name; private int yearofbirth; /** * Create a Person object with name n * and year of birth y */ public Person(String n, int y) { name = n; yearofbirth = y; public class Employee extends Person { private String room; /** * Create an Employee object with * name n, year of birth y och room number room */ public Employee(String n, int y, String room) { super(n, y); this.room = room; /** * Create an Employee object with standard values for * name, year of birth och room number */ public Employee() { this( Olle Olsson, 1954, C321 ); 3
Uppgift 4 (100 p) 1. m firststar secondstar 4.3 false 2. m firststar secondstar 4.3 true 3. s m 1.2 false firststar secondstar 1.2 false 4.3 true 4
Uppgift 5 (120 p) Viktigt i designen var att ni fördelat ansvaret väl på olika klasser med så få beroenden som möjligt. Dessutom att ni klart visat på relationerna mellan klasserna. Uppgift 6 (60 p) Operation 1 Operation 2 Operation 3 Operation 4 Operation 5 Operation 6 Operation 7 Operation 8 Operation 9 Operation 10 Operation 11 Operation 12 Ej tillåten, attributet är final Ej tillåten, privata attribut ärvs ej Ej tillåten, privata attribut ärvs ej 5
Uppgift 7 (70 + 30 p) a) public class MySet implements Set { private int[] a = new int[20]; private int currentfreeindex = 0; public boolean contains(int elem) { boolean containsit = false; for (int i = 0; i < length(); i++) { if (a[i] == elem) { containsit = true; break; return containsit; public void add(int elem) { if (!contains(elem)) a[currentfreeindex++] = elem; public boolean equals(set s) { boolean equal = length() == s.length(); for (int i = 0; i < length(); i++) { if (!s.contains(a[i])) { equal = false; break; return equal; public int length() { return currentfreeindex; 6
b) Värstafalls-komplexitet: contains O(n) add O(n) equals O(n 2 ) length O(1) Då det finns n andra element i mängden och vi måste kontrollera om något av dom är likadant som det givna elementet så blir det O(n) För varje element som vi lägger till måste vi kontrollera de n andra elementen. Således O(n) Eftersom ordningen inte spelar nån roll i mängden (t.ex. är {2,3,4 samma mängd som {3,2,4) så måste vi för varje element i den ena mängden kontrollera detta mot alla andra element i den mängden. Då mängderna i värsta fallet -scenariot är lika stora (är de inte lika stora behöver vi inte ens kontrollera alla element) blir det n kontroller av n element, O(n 2 ) I implementationen i a) fanns det en räknare som höll reda på hur stor mängden var, alltså bara att kontrollera värdet av den, O(1) I a) uppgiften så var det angivet att ni skulle använda en array för att implementera ert Set. Exempelvis ett binärt sökträd som grund för implementationen hade snabbat upp metoden contains betydligt (och därmed de övriga metoderna). 7
Uppgift 8 (40 + 60 + 10 p) a) Vi måste som det står i uppgiften ha ett numeriskt värde på båda operanderna (barnen) för att kunna evaluera en operator (föräldern). Exempelvis så måste vi för att beräkna / måste vi ha ett numeriskt värde klart på både 12-4 (ej klart) och 2 (klart), dvs vi måste beräkna både vänster och höger barn innan vi beräknar en operand. Alltså, vi måste använda post-order. b) public String tostring() { return String.valueOf(value); // alternativt return + value; public String tostring() { return ( +leftchild.tostring()+ +operator+ +rightchild.tostring()+ ) ; c) Eftersom vi i b) först besöker vänster barn, sedan oss själva och till sist höger barn blir det in-order. 8