Lösningsförslag: Övning 5.

Relevanta dokument
Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 4

1 Comparator & Comparable

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3

Tentamen LÖSNINGSFÖRSLAG

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

Objektorienterad programutveckling, fk

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3

Lösningsförslag. 1 Lösningsförslag. Uppgift 1

Objektorienterad programvaruutveckling, fk, TDA550. Exempeltentamen

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

TDA550 - Objektorienterad programvaruutveckling, fk

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA550 DAG: TID: 8:30 12:30

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Tentamen i Objektorienterad programmering

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningar till tentamen i EDAF25

Lösningsförslag till tentamen i EDAF25 Objektorienterad modellering och design Helsingborg

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Föreläsning 12: Exempel och problemlösning

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

TENTAMEN OOP

Lösningsförslag till tentamen i EDA011, lördagen den 16 december 2006

Enkla variabler kontra referensvariabel

Uno Holmer, Chalmers, :17 Uno Holmer, Chalmers, :17

Övning vecka 4. Denna vecka ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Tentamen. Lösningsförslag

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Institutionen för TENTAMEN CTH HT-14 Datavetenskap TDA550 DAG: TID: 14:00 18:00

Lösningsförslag till exempeltenta 2

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen FYTA11 Javaprogrammering

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningar till tentamen i EDAF25

TENTAMEN: Objektorienterad programutveckling, fk. Läs detta! Uppgifterna är inte ordnade efter svårighetsgrad.

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen i EDAF25. 1 juni Skrivtid: Skriv inte med färgpenna enda tillåtna färg är svart/blyerts.

Lösningsförslag till tentamen

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Objektorienterad programutveckling, fk

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Enkla variabler kontra referensvariabel

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Laboration 13, Arrayer och objekt

DAT043 Objektorienterad Programmering

LÖSNINGSFÖRSLAG

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

Repetition av OOP- och Javabegrepp

Lösningsförslag övning 2.

Lösningar för tenta 2 DAT043,

Repetition av OOP- och Javabegrepp

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Lösningsförslag till tentamen

TENTAMEN OOP

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Föreläsning 6. Mer om klasser och objekt. Enkla variabler kontra referensvariabel. Omslagsklassen Integer. Referensvariabler

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

Lösningsförslag till tentamen

Svaret kan ges i Javakod (eller i UML-klassdiagram). public class A { B minb;... } public class B { <B:s många variabler och metoder> } Lösning:

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Kurskod D0010E Datum Skrivtid 5tim

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Lösningsförslag till tentamen

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDDD78 Viktiga begrepp, del 2

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 3-4 Innehåll

Tentamen LÖSNINGSFÖRSLAG

Lösningsförslag till tentamen FYTA11 Javaprogrammering

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Programmering för språkteknologer II, HT2014. Rum

Övningen vill visa på vikten av valet av datastruktur, trots att de ofta erbjuder samma funktionalitet genom sina gränssnitt.

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Transkript:

TDA550 - Objektorienterad programvaruutveckling, fk Lösningsförslag: Övning 5. Uppgift 1 Klassen är inte en singleton eftersom flera instanser kan skapas av klassen. Ett sätt att göra klassen till en singleton är enligt: public class GameUtils { private static final GameUtils instance = new GameUtils(); private GameUtils() { // Prohibits further instanciations by clients. public static GameUtils getinstance() { return instance; public GameTile[][] newboard(final int width, final int height, final GameTile basetile) { GameTile[][] board = new GameTile[width][height]; fillboard(board, basetile); return board; public void fillboard(final GameTile[][] board, final GameTile basetile) { for (GameTile[] row : board) { for (int j = 0; j < row.length; j++) { row[j] = basetile; Denna klass kan dock inte serialiseras (implementera interfacet Serializable, som vi inte behandlat ännu). För att deserialiseringen inte skall skapa nya instanser måste implementationen förändras. Detta problem kan undvikas genom att göra klassen till en enum med endast ett element. För ett mer utvecklat resonemang, se gärna Item 3 i Joshua Bloch's "Effective Java". public enum GameUtils { INSTANCE; // Marks end of enum members. public GameTile[][] newboard(final int width, final int height, final GameTile basetile) { GameTile[][] board = new GameTile[width][height]; fillboard(board, basetile); return board; public void fillboard(final GameTile[][] board, final GameTile basetile) { for (GameTile[] row : board) { for (int j = 0; j < row.length; j++) { row[j] = basetile; Kommentarer: Det finns dock inget att tjäna på att göra klassen till en singleton eftersom det inte finns något tillstånd som behöver initieras vid ett bestämt tillfälle. Men eftersom klassen bara innehåller statiska metoder bör den inte gå att instansiera överhuvudtaget (vilket vi åstadkommit genom att göra den till en singleton). Lösningsförslag: Övning 5 1 TDA550 HT-18

Uppgift 2 public class Counter { private int value; private State currentstate; private State ascendingstate; private State descendingstate; public Counter() { ascendingstate = new AscendingState(); descendingstate = new DescendingState(); setcountingup(); public void set(int value) { this.value = value; public int get() { return value; public void setcountingup() { currentstate = ascendingstate; public void setcountingdown() { currentstate = descendingstate; public void step() { value = currentstate.step(value); public interface State { int step(int value); public class AscendingState implements State { public int step(int value) { return value + 1; public class DescendingState implements State { public int step(int value) { return value - 1; Lösningsförslag: Övning 5 2 TDA550 HT-18

Uppgift 3 public interface RealFunction { double fun(double x); public class Integrator { public static double integrate(realfunction f, double a, double b, int steps) { double sum = 0.0; double previous = f.fun(a); double delta = (b - a) / steps; for (int i = 1; i <= steps; i++) { double x = a + (b - a) * i / steps; double current = f.fun(x); /* Compute the integral through Simpson's 3/8 rule. sum += delta / 8 * (previous + current + 3 * (f.fun((2 * (x - delta) + x) / 3.0) + f.fun((3 * x - delta) / 3.0))); previous = current; return sum; public class LogLog implements RealFunction { public double fun(double x) { return Math.log(Math.log(x)); public class PowXX implements RealFunction { public double fun(double x) { return Math.pow(x, x); public class SinSin implements RealFunction { public double fun(double x) { return Math.sin(Math.sin(x)); public class TestIntegrator { public static void main(string[] args) { RealFunction loglog = new LogLog(); System.out.println(Integrator.integrate(loglog, 10, 20, 1000)); RealFunction f = new RealFunction() { //anonym klass public double fun(double x) { return Math.cos(Math.sin(x)); ; System.out.println(Integrator.integrate(f, 10, 20, 1000)); Kommentarer: Strategy-mönstret bygger på principen encapsulate what varies. I detta exempel är det funktionen som skall integreras som varierar och lösningen är att kapsla in funktionen i en separat klass. Lösningsförslag: Övning 5 3 TDA550 HT-18

Uppgift 4 import java.util.arraylist; public class Flower implements Observable { private final String name; private ArrayList<Observer> observers; public Flower(String name) { this.name = name; observers = new ArrayList<Observer>(); public void addobserver(observer o) { observers.add(o); public void removeobserver(observer o) { observers.remove(o); public void notifyobservers() { for(observer o : observers) { o.update(this); public void visit(bee b) { System.out.println(name + " is being visited by " + b.getname()); public void bloom() { System.out.println(name + " is blooming!"); notifyobservers(); public class Bee implements Observer { private final String name; public Bee(String name) { this.name = name; public String getname() { return name; public void update(observable obs) { if (obs instanceof Flower) { Flower f = (Flower) obs; f.visit(this); Lösningsförslag: Övning 5 4 TDA550 HT-18

Uppgift 5 import java.util.*; public class Section { public static final String SPACE = " "; private String title; private List<Section> subsections; public Section(String title) { this.title = title; subsections = new ArrayList<Section>(); public void add(section m) { subsections.add(m); public void print() { print("1"); private void print(string sectionnumber) { printtitle(sectionnumber,title); printsubsections(sectionnumber); private void printtitle(string sectionnumber,string title) { System.out.println(sectionNumber + SPACE + title); private void printsubsections(string sectionnumber) { int i = 1; for ( Section s : subsections ) { s.print(sectionnumber + "." + i); i++; print( 1 ) A print( 1 +. + i) (i = 1,2,3) print( 1.1.1 ) E print( 1.1 ) B print( 1.2 ) C print( 1.3 ) D print( 1.1.2 ) F print( 1.3.1 ) G 1 A 1.1 B 1.1.1 E 1.1.2 F 1.2 C 1.3 D 1.3.1 G Lösningsförslag: Övning 5 5 TDA550 HT-18

Uppgift 6 public class NoRepeatDie implements Die { private Die die; public NoRepeatDie(Die die) { this.die = die; public void roll() { die.roll(); public int getvalue() { return die.getvalue(); public void norepeatroll() { int v = die.getvalue(); do { die.roll(); while ( die.getvalue() == v ); Lösningsförslag: Övning 5 6 TDA550 HT-18

Uppgift 7 a) b) public final class Car implements Comparable<Car> { //Code not shown here // Compare as lazily as possible. public int compareto(car c) { int diff = modelyear - c.modelyear; if (diff!= 0) { return diff; diff = manufacturer.compareto(c.manufacturer); if (diff!= 0) { return diff; return modelname.compareto(c.modelname); public boolean equals(object o) { // Ok to use instanceof since the class is declared "final". if (o instanceof Car) { Car c = (Car) o; return c.manufacturer.equals(manufacturer) && c.modelname.equals(modelname) && c.modelyear == modelyear; return false; Kommentarer: Att en klass implementerar Comparable innebär att objekten av klassen bli jämförbara med varandra och att det därmed kommer att existera en naturlig ordning på objekten. Informellt kan man tänka att objekten ska kunna läggas på rad i storleksordning genom att par av objekt jämförs med varandra. Detta bör vara en total ordning (linjär ordning): En mängd S är totalt ordnad under om följande villkor gäller för alla element a, b och c i S: Om a b och b a så a = b (antisymmetri) Om a b och b c så a c (transitivitet) a b eller b a (totalitet) Enligt kontraktet för compareto skall anropet a.compareto(b) returnera: 1. ett positivt heltal, om a > b 2. 0, om a == b 3. ett negativt heltal, om a < b Observera hur subtraktion modelyear - c.modelyear används för att skapa ett returvärde från compareto() utan att använda if-satser eller liknande konstruktioner. public class CarComparator implements Comparator<Car> { public int compare(car c1, Car c2) { int diff = c1.getmanufacturer().compareto(c2.getmanufacturer()); if (diff!= 0) { return diff; diff = c1.getmodelyear() - c2.getmodelyear(); if (diff!= 0) { return diff; return c1.getmodelname().compareto(c2.getmodelname()); Lösningsförslag: Övning 5 7 TDA550 HT-18

Kommentarer: För Comparator gäller det till stor del att tänka på motsvarande saker som när Comparable ska implementeras. (med metoden compare() som motsvarighet till compareto()), se därför kommentarerna till föregående uppgift. c) public abstract class AbstractComparator<T> implements Comparator<T> { // The decorator comparator private final Comparator<T> comparator; private final boolean ascending; protected AbstractComparator(Comparator<T> comparator, boolean ascending) { this.comparator = comparator; this.ascending = ascending; // Template method public int compare(t o1,t o2) { if (o1 == o2) { return 0; if (comparator!= null) { int result = comparator.compare(o1,o2); if (result!= 0) { return result; int result = docompare(o1,o2); return ascending? result : -result; // Subclasses should implement this hook method: protected abstract int docompare(t o1,t o2); Lösningsförslag: Övning 5 8 TDA550 HT-18

* Comparator for comparing car manufacturers public class ManufacturerComparator extends AbstractComparator<Car> { * @param comparator other decorator possible null * @param ascending public ManufacturerComparator(Comparator<Car> comparator, boolean ascending) { super(comparator, ascending); // Note : docompare NOT compare public int docompare(car c1, Car c2) { String name1 = c1.getmanufacturer(); String name2 = c2.getmanufacturer(); return name1.compareto(name2); * Comparator for comparing car model names public class ModelNameComparator extends AbstractComparator<Car> { * @param comparator other decorator possible null * @param ascending public ModelNameComparator(Comparator<Car> comparator, boolean ascending) { super(comparator, ascending); public int docompare(car c1, Car c2) { String name1 = c1.getmodelname(); String name2 = c2.getmodelname(); return name1.compareto(name2); Lösningsförslag: Övning 5 9 TDA550 HT-18

* Comparator for comparing car model years public class ModelYearComparator extends AbstractComparator<Car> { * @param comparator other decorator possible null * @param ascending public ModelYearComparator(Comparator<Car> comparator, boolean ascending) { super(comparator, ascending); public int docompare(car c1, Car c2) { int year1 = c1.getmodelyear(); int year2 = c2.getmodelyear(); if (year1 == year2) return 0; else if (year1 > year2) return 1; return -1; * Comparator for comparing car serial numbers public class SerialNumberComparator extends AbstractComparator<Car> { * @param comparator other decorator possible null * @param ascending public SerialNumberComparator(Comparator<Car> comparator, boolean ascending) { super(comparator, ascending); public int docompare(car c1, Car c2) { String name1 = c1.getserialnumber(); String name2 = c2.getserialnumber(); return name1.compareto(name2); Lösningsförslag: Övning 5 10 TDA550 HT-18

Exempel: Sortering av en lista av bilar i stigande ordning på tillverkarnamn och om lika i stigande ordning på modellnamn och om lika i avtagande ordning på modellår. import java.util.*; public static void main(string[] args) { List<Car> cars = new ArrayList<Car>(); cars.add(new Car("Volvo","Amazon",1969,"12345678")); cars.add(new Car("Saab","9000",1988,"3463658")); cars.add(new Car("Volvo","PV",1962,"34853648")); cars.add(new Car("Rover","Streetwise",2004,"7744229")); cars.add(new Car("Volvo","Amazon",1968,"10857043")); cars.add(new Car("Saab","900",1982,"12345678")); Comparator<Car> mycarcomp = new ModelYearComparator( new ModelNameComparator( new ManufacturerComparator(null,true),true),false); Collections.sort(cars,myCarComp); for ( Car c : cars ) System.out.println(c); Utskriften blir: manufacturer: Rover, modelname: Streetwise, modelyear: 2004, serialnumber: 7744229 manufacturer: Saab, modelname: 900, modelyear: 1982, serialnumber: 12345678 manufacturer: Saab, modelname: 9000, modelyear: 1988, serialnumber: 3463658 manufacturer: Volvo, modelname: Amazon, modelyear: 1969, serialnumber: 12345678 manufacturer: Volvo, modelname: Amazon, modelyear: 1968, serialnumber: 10857043 manufacturer: Volvo, modelname: PV, modelyear: 1962, serialnumber: 34853648 Lösningsförslag: Övning 5 11 TDA550 HT-18