Pedher Johansson Institutionen för datavetenskap LÖSNINGSFÖRSLAG Lösningsförslag Tentamen Programmeringsmetodik, KV: Java och OOP 17 januari 2002 Uppgift 1 (20 p) Teoriuppgifter Resultat och uppgifter finns på webben. Uppgift 2 (15 p) Java Kompilerad Java-kod kan exekveras på alla maskinplattformar, förutsatt att det finns en korrekt JVM (Java Virtual Machine). Javamaskinen tar objektkod och översätter den till maskinspecifika instruktioner, därför kan programmet köras. Java kod (.java) Kompilator (javac) Objektkod (.class) Javamaskin (java) Dator AB CADRE VRDAF FSHSJ 01 110010 011001 001011 VM AMD Uppgift 3 (20 + 15 + 15 p) Arv a) Figure Oval Triangle Rectangle Circle Square Det är nog att föredra att cirkeln ärver ovalen än tvärt om, då cirkeln är ett specialfall av ovalen. Cirkeln är en oval (om än ett specialfall), men inte tvärt om. Figure är abstrakt. 1
b) Figure Oval # int r1; # int r2; Triangle # int b; # int h; Rectangle # int w; # int h; Circle Square Cirkelns uppgift blir att se till att r1 och r2 alltid förblir lika, smma med Kvadraten när det gäller w och b. c) Med omdefeniering menas att en klass skriver en egen version av en ärvd metod. Detta omdefenierar (skymmer) den tidigare metoden. I exemplet ovan skulle t. ex. Figure implementera en abstrakt metod area() som därefter varje klass som ärver Figure måste implementera en egen version av som beräknar arean hos den specifika figuren. Figure + area(); Oval # int r1; # int r2; + area() { Triangle # int b; # int h; + area() { Rectangle # int w; # int h; + area() { Circle Square Uppgift 4 (20 + 20 + 10p) Sortering a) 1 7 4 3 5 2 6 Ursprunglig vektor 1 4 3 5 2 6 7 1 3 4 2 5 6 7 1 3 2 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 Varv 1 byten: 7 4, 7 3, 7 5, 7 2, 7 6 Varv 2 byten: 4 3, 5 2 Varv 3 byten: 4 2 Varv 4 byten: 3 2 Varv 5 inga byten (färdig) 2(8)
b) 1 7 4 3 5 2 6 Orginalvektor 1 7 3 4 2 5 6 Resultat 1:a sorteringen 1 3 4 7 2 5 6 Resultat 2:a sorteringen 1 2 3 4 5 6 7 Resultat 3:e sorteringen c) Merge sort har lägre komplexitet, O(n log(n)), jämfört med bubble sort, O(n 2 ), vilket gör att mergesort kommer att gå fortast när datamängden ökas och datat är osorterat. Beroende på hur bubble sort är implementerad kan den dock avbryta i förtid, t. ex. när inga fler byten gjorts (som i exemplet ovan), då kommer bubble sort att kunna gå fortare om enbart några byten behöver göras. Uppgift 5 (70 p) Klassdesign I klassdesignen premieras lite tankearbete och god inkapsling av data med få beroenden. Det man bör ha löst är kommunikationen med banken, ansvar för kontoinformation och uppritning, vem som talar om för bankomaten att återlämna kort och ge ut pengar m.m. Uppgift 6 (45 + 10 p) Implementation a) /* Class: TrashCan * Created: Thu Jan 17 12:01:45 2002 * Author: Pedher Johansson */ import java.util.*; public class TrashCan { private Vector bin; public TrashCan() { bin = new Vector(); public boolean isempty() { return bin.size() == 0; 3(8)
public void addtrash(object trash) { bin.addelement(trash); public void emptycan() { bin.removeallelements(); public Object restorelast() { Object o = bin.lastelement(); bin.removeelementat(bin.size()-1); return o; public Vector restoreall() { Vector v = (Vector)bin.clone(); emptycan(); return v; // End TrashCan b) Objekt som allokerats av programmet som inte har någon referens som refererar till objektet, kan inte bidra till programmet längre. Vid jämna mellanrum kollar JVM efter sådana objekt. De funna objekten kommer att avallokeras. Innan objektet avavllokeras anropas metoden finalize hos objektet. Man kan som programmerare inte styra när ett visst objekt skall avallokeras. Uppgift 7 (10 + 30 + 35 + 15 + 10 + 10 p) Del I ADT a) SimpleList måste implementera samtliga metoder specificerade i gränssnittet. Metodkroppen kan dock vara tom. b) /* Class: Stack * Created: Thu Jan 17 13:05:32 2002 * Author: Pedher Johansson */ public class Stack { List list; public Stack() { list = new SimpleList(); 4(8)
public boolean isempty() { return list.isempty(); public int size() { return list.size(); public void push(object element) { list.insert(element, list.size()+1); public Object front() { Object o = null; if (!isempty()) o = list.inspect(list.size()); return o; public Object pop() { Object o = null; if (!isempty()) { list.inspect(list.size()); list.remove(size()); return o; // End Stack c) import java.text.parseexception;... public void parseparentheses(string s) throws ParseException { Stack stack = new Stack(); for (int i = 0; i < s.length(); i++) { char c = s.charat(i); switch(c) { case ( : stack.push(new Character( ( )); case ) : if (stack.isempty()) throw new ParseException("To many )",i); stack.pop(); 5(8)
default: if (!stack.isempty()) throw new ParseException("Missing )", s.length());... Om ni inte använt objekt av typer Character ger detta inte avdrag. Fördelen att använda en komplett stack i denna uppgift är kanske inte så stor. Den typ av stack som behövs när vi enbart har en typ av värden på stacken kan enkelt lösas med en variabel, vars värde får öka och minska. Denna lösning med en stack kan dock mycket enkelt utökas att också gälla [ ] och { för se att de är nästlade på ett korrekt sätt. public void parseparentheses(string s) throws ParseException { Stack stack = new Stack(); for (int i = 0; i < s.length(); i++) { char c = s.charat(i); switch(c) { case [ case { case ( : stack.push(new Character(c)); case ) : if (stack.isempty()) throw new ParseException("To many )",i); Character c = (Character)stack.pop(); if (c.charvalue()!= ( ) throw new ParseException("Missing (",i); case : if (stack.isempty()) throw new ParseException("To many ",i); Character c = (Character)stack.pop(); if (c.charvalue()!= { ) throw new ParseException("Missing {",i); case ] : if (stack.isempty()) throw new ParseException("To many ]",i); Character c = (Character)stack.pop(); if (c.charvalue()!= [ ) throw new ParseException("Missing [",i); default: 6(8)
if (!stack.isempty()) throw new ParseException("Missing parantheses", s.length()); Del II Algoritmanalys d) metod enkellänkad vektorbaserad isempty O(1) O(1) size O(1) O(1) push O(n) O(1) front O(n) O(1) pop O(n) O(1) e) Enkellänkad lista Fördelar Listan tar enbart upp minne efter hur många element som finns lagrade. Det kan vara relativt billigt att lägga till och ta bort element. Nackdelar Det är kostsamt att leta element i listan, speciellt element som ligger före en aktuell position. Vektorbaserad lista f) Fördelar Det går snabbt att finna element på en viss position i listan. Nackdelar Det kan vara kostsamt att lägga till och ta bort element i början av listan. Listan är begränsad i storlek och tar alltid upp en viss minnesmängd. Stacken som den är implementerad fungerar dåligt med en enkellänkad lista enligt figuren. Detta beror på att vi inte utnyttjar att det är billigt att jobba i listans främre del och dyrt att finna element i slutet. Stacken som den är implementerad är däremot optimerad för en lista implementerad som en vektor. För att bättre utnyttja en enkellänkad struktur, bör vi stacken i stället jobba med listans första position. 7(8)
Uppgift 8 (30 p) Konstruktorer och överlagring /* Class: BlackBox * Created: Wed Jan 16 13:45:37 2002 * Author: Pedher Johansson */ public class BlackBox { private int a; private double b; public BlackBox(int a) { this(a, 1.0); public BlackBox(int a, double b) { this.a = a; this.b = b; public String tostring() { return "("+a+","+b+")"; // End BlackBox 8(8)