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



Relevanta dokument
Tentamen LÖSNINGSFÖRSLAG

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

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

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

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

Tentamen Programmering fortsättningskurs DIT950

Tentamen LÖSNINGSFÖRSLAG

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

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

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

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

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

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

Institutionen för TENTAMEN CTH HT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Grundläggande programmering med C# 7,5 högskolepoäng

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Institutionen för TENTAMEN CTH HT-13 Datavetenskap TDA550 DAG: TID: 8:30 12:30

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

Lösningsförslag: Övning 5.

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

Objektorienterad programutveckling, fk

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

Objektorienterad programmering i Java

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

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

Tentamen OOP

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

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

Tentamen, EDAA20/EDA501 Programmering

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

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

TENTAMEN OOP

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

DAT043 - Föreläsning 7

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Objektorienterad programvaruutveckling, fk, TDA550. Exempeltentamen

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

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

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

Tentamen. Grundläggande programmering i Java A 5p, DTAA

Objektorienterad programutveckling, fk

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Objektorienterad Programmering (TDDC77)

Tentamen i Objektorienterad programmering

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

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

TENTAMEN: Objektorienterad programmering. Läs detta! Börja varje hel uppgift på ett nytt blad. Skriv inte i tesen.

Tentamen LÖSNINGSFÖRSLAG

Concurrency Saker händer samtidigt. Process En instans av ett program

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

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

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

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Föreläsning 9: Arv och UML

Instuderingsuppgifter läsvecka 2

Institutionen för TENTAMEN CTH HT-17 Datavetenskap TDA550

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

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

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

DAT043 - föreläsning 8

TDDD78 Viktiga begrepp, del 2

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

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

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Objektorienterad Programmering (TDDC77)

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.

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

DAT043 Objektorienterad Programmering

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

OOP Objekt-orienterad programmering

OOP Objekt-orienterad programmering

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

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

TENTAMEN OOP

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:

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

TENTAMEN: Objektorienterad programutveckling, fk. Läs detta! Börja varje hel uppgift på ett nytt blad. Skriv inte i tesen.

F4. programmeringsteknik och Matlab

The Last Adventure. Innehåll. Objektorientering. Språket Java. Java - Paket. Java - synlighet. Den sista lektionen. Repetition.

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Objektsamlingar i Java

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

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

Repetition av OOP- och Javabegrepp

Parallellism, återblick

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

Repetition av OOP- och Javabegrepp

Programmering A. Johan Eliasson

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

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Classes och Interfaces, Objects och References, Initialization

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Språkkonventioner och redigering av tal.

TENTAMEN OOP

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

Transkript:

Institutionen för TENTAMEN CTH VT-15 Datavetenskap 2015-04-13 TDA550 Tentamen för TDA550 Objektorienterad programvaruutveckling IT, fk DAG: 15-04-13 TID: 8:30 12:30 Ansvarig: Christer Carlsson, ankn 1038 Förfrågningar: Resultat: Christer Carlsson erhålls via Ladok Betygsgränser: 3:a 24 poäng 4:a 36 poäng 5:a 48 poäng maxpoäng 60 poäng Siffror inom parentes: Granskning: Hjälpmedel: Var vänlig och: Observera: anger maximal poäng på uppgiften. Måndag 11/5 kl 14-15 och tisdag 12/5 kl 14-15, rum 6128 i EDIT-huset. Inga hjälpmedel är tillåtna förutom bilagan till tesen. Skriv tydligt och disponera papperert på lämpligt sätt. Börja varje uppgift på nytt blad. Skriv ej på baksidan av papperet. Uppgifterna är ej ordnade efter svårighetsgrad. Titta därför igenom hela tentamen innan du börjar skriva. Alla program skall vara välstruktruerade, lätta att överskåda samt enkla att förstå. Vid rättning av uppgifter där programkod ingår bedöms principella fel allvarligare än smärre språkfel. LYCKA TILL!!!!

Uppgift 1. Betrakta nedanstående klasser och interface: public interface A { public void print(); //A public class B implements A { public void print() { System.out.println("In class B print"); public void fax() { System.out.println("In class B fax"); //B public class C implements A { public void print() { System.out.println("In class C"); public void fax() { System.out.println("In class C fax"); public void print(object o) { System.out.println("In the object"); //C public class D extends C { public double storage1; private double storage2; public D() { storage1 = 0; storage2 = 0; public D(double x, double y){ storage1 = x; storage2 = x; public void print() { System.out.println("First print in D"); public static void print(double storage1, double storage2) { System.out.println("Second print in D"); private void print(int x) { System.out.println("Third print in D"); public void print(double y) { System.out.println("Fourth print in D"); public double getstorage1() { return storage1; public double getstorage2() { return storage2; //D Vad blir resultatet för var och en av följande satser (ger kompileringsfel, ger exekveringsfel, skriver ut xxx, ect)? Motivera dina svar! i) D foo = new D(3.0,2.0); foo.print(); ii) D bar = new D(); bar.print(1 + " "); iii) A apple = new A(); apple.print(); iv) A grannysmith = new B(); grannysmith.fax(); v) A reddelicious = new D(); C pear = (D)redDelicious; pear.print(); vi) A peach = new D(); B banana = (B) peach; banana.print(); vii) A strawberry = new D(); ((D)strawberry).print(1.0,2.0); viii) A blackberry = new D(); B latte = (B) blackberry; latte.fax(); (8 poäng)

Uppgift 2. Betrakta nedanstående klass: public class Zoo { public enum Animal {DOG, CAT, BIRD public void feedtheanimal(animal theanimal) { switch (theanimal) { case DOG: // Complex code special for Dog break; case CAT: // Complex code special for Cat break; case BIRD: // Complex code special for Bird //feedtheanimal //code not shown here //Zoo a) Klassen bryter mot en grundläggande designprincip. Vilken? Förklara vad principen innebär och på vilket sätt klassen Zoo bryter mot principen. b) Åtgärda problemet. Förklara din lösning och visa den i Java-kod. (2 + 5 poäng) Uppgift 3. Vad skriver koden nedan ut? IllegalArgumentException och NullPointerException är båda subklasser till RuntimeException. public static void main(string[] args) { try { doit(); System.out.println("main after doit"); doother(); System.out.println("main after doother"); catch (IllegalArgumentException e) { System.out.println("main IllegalArgumentException"); catch (RuntimeException e) { System.out.println("main RuntimeException"); public static void doit() { System.out.println("enter doit"); try { doother(); catch (IllegalArgumentException e) { System.out.println("doIt IllegalArgumentException"); throw new NullPointerException(); catch (NullPointerException e) { System.out.println("doIt NullPointerException"); throw new NullPointerException(); finally { System.out.println("doIt finally"); System.out.println("exit doit"); public static void doother() { System.out.println("enter doother"); throw new IllegalArgumentException(); (5 poäng)

Uppgift 4. Betrakta nedanstående specifikationer för metoden public static void addscore(string name, List<Double> scores, Map<String, Double> gradebook) S1) @requires name!= null and scores!= null and gradebook!= null @modifies gradebook @effects add a mapping <name, overallscore> to gradebook S2) @requires name!= null and scores!= null @modifies gradebook @effects add a mapping <name, overallscore> to gradebook @throws IllegalArgumentException if gradebook is null a) Är någon av de båda specifikationerna starkare än den andra? Ange i så fall vilken. Motivera ditt svar! b) Nedan ges en möjlig implementation av metoden addscore: public static void addscore(string name, List<Double> scores, Map<String, Double> gradebook) { if (name == null scores == null gradebook == null) throw new IllegalArgumentException(); double grade = 0.0; for (double s : scores) grade = grade + s; if (scores.size() > 0) grade = grade / scores.size(); gradebook.put(name, grade); //addscore i) Uppfyller denna implementation specifikationen S1 ovan? Motivera ditt svar! ii) Uppfyller denna implementation specifikationen S2 ovan? Motivera ditt svar! c) Ovanstående implementation bryter mot en grundläggande designprincip. Vilken? Uppgift 5. (2+2+2 poäng) Antag att vi har klassen Movie nedan, för att representera filmer: public class Movie { private String title; private int year; private int minutes;... //Movie // movie title // year released // length of the movie a) Skriv en lämplig equals-metod för klassen. Två objekt av klassen Movie skall betraktas som lika om de har samma titel och samma utgivningsår. b) Nedan ges fyra möjliga implementationer av metoden hashcode för klassen Movie. Vilka av dessa är korrekta? Vilken implementation är att föredra? Motivera dina svar! i) public int hashcode() { return 331; iii) public int hashcode() { return title.hashcode() + minutes; ii) public int hashcode() { return title.hashcode(); iv) public int hashcode() { return title.hashcode() + year; (3 + 3 poäng)

Uppgift 6. Betrakta klasserna Bee och Flower nedan public class Bee { private final String name; public Bee(String name) { this.name = name; public String getname() { return name; //... //Bee public class Flower { private final String name; public Flower(String name) { this.name = name; public void visit(bee b) { System.out.println(name + " is being visited by " + b.getname()); public void bloom() { System.out.println(name + " is blooming!"); //... //Flower Komplettera dessa klasser så att designmönstret Observer realiseras (genom att använda Observable och Observer eller genom att använda PropertyChangeSupport och PropertyChangeListener). När en blomma blommar meddelar den detta till alla bin som är observatörer, och när ett bi som får reda på att en blomma blommar besöker biet blomman. Nedanstående huvudprogram illustrerar hur det hela är tänkt att fungera: public static void main(string[] args) { Flower f = new Flower("Blossom"); Bee b1 = new Bee("Bob"); Bee b2 = new Bee("Fred"); f.addobserver(b1); f.addobserver(b2); f.bloom(); //main Utskriften blir: Blossom is blooming! Blossom is being visited by Fred Blossom is being visited by Bob (6 poäng)

Uppgift 7. Betrakta följande klass: import java.util.*; public class CrossReferenceList { private Map<String, Set<Integer>> map; public CrossReferenceList() { //skall implementeras i deluppgift a) public void add(string word, int sidenbr) { //skall implementeras i deluppgift b) public String getpagenumbersofword(string word) { //skall implementeras i deluppgift c) public String getreferencelistasstring() { //skall implementeras i deluppgift d) //CrossReferenceList Klassen CrossReferenceList används för att skapa ett register (en korsreferenslista) till en bok, där orden i registret skall skrivas ut i alfabetisk ordning och där sidnumren för varje ord ska vara ordnade i stigande följd. Exempel: class 3, 5, 7, 9 int 6 interface 5, 19 java 1, 2, 5, 8, 19 object 2, 6, 7, 9 Även om samma ord finns flera gånger på samma sida ska sidnumret bara förekomma en gång. I implementationen ovan implementeras registret med hjälp av datatypen Map, med orden som nycklar och en mängd (Set) med sidnummer som värde. a) Implementera konstruktorn som skapar en tom Map. b) Implementera metoden add, som uppdaterar registret med ordet word på sidan sidenr. c) Implementera metoden getpagenumbersofword, som returnerar en sträng som innehållet ordet word följt av de sidnummer som ordet förekommer på (dvs. en sträng som representerar en rad i exemplet ovan).. d) Implementera metoden getreferencelistasstring, som returnerar en sträng som representerar hela registret (dvs. samtliga rader i exemplet ovan). (1+3+3+2 poäng)

Uppgift 8. a) Skriv en trådsäker klass Counter som representerar en heltalsräknare. Klassen skall innehålla en konstruktor som sätter räknaren till 0, samt metoderna void add(int number) int getvalue() som adderar number till räknaren som returnerar värdet av räknaren b) Skriv ett program som beräknar summan av elementen i ett heltalsfält genom att använda två trådar. Den ena tråden beräknar summan för elementen som finns i den första halvan av fältet, och den andra tråden beräknar summan för elementen som finns i den andra halvan av fältet. Den totala summan av samtliga element skrivs ut av huvudtråden som exekverar main-metoden. En instans av klassen Counter (från deluppgift a) används för att sköta kommunikationen mellan trådarna. Nedanstående (ofullständiga) main-metod visar hur det skall fungera: Uppgift 9. import java.util.arrays; public class MainThread { public static void main(string[] arg) throws InterruptedException { int[] arr = {1,2,3,4,5,6,7,8,9,10, 11; int[] firsthalf = Arrays.copyOfRange(arr, 0, arr.length/2); int[] secondhalf = Arrays.copyOfRange(arr, arr.length/2, arr.length); Counter counter = new Counter(); ArrayAdder a1 = new ArrayAdder(firstHalf, counter); ArrayAdder a2 = new ArrayAdder(secondHalf, counter); //kod som saknas, din uppgift att skriva //main //MainThread //första halvan av fältet //andra halvan av fältet //"kommunikationskanalen" //a1 beräknar första halvan //a2 beräknar andra halvan Färdigställ main-metoden och implementera klassen ArrayAdder. Det är ditt val om du låter klassen ArrayAdder utöka klassen Thread eller implementerar interfacet Runnable. Antag att följande klasser är givna: public class ArtistTool {... public class Brush extends ArtistTool {... public class DetailBrush extends Brush {... public class Pencil extends ArtistTool {... Antag vidare att vi i ett program har gjort följande deklarationer: ArtistTool t; Brush b; DetailBrush d; Pencil p; List<Brush> lb; List<? extends Brush> leb; List<? super Brush> lsb; (3 + 6 poäng) Ange för var och en av nedanstående satser om satsen är korrekt eller ger kompileringsfel. Svaren skall motiveras! a) lb.add(d); b) lsb.add(d); c) leb.add(d); d) t = lsb.get(0); e) t = leb.get(0); f) d = leb.get(0); g) lsb.add(b); h) leb.add(b); (4 poäng)

Uppgift 1. Tentamen 150413 - LÖSNINGSFÖRSLAG i) Utskriften blir First print in D. Både statisk och dynamisk typ är D. Klassen D överskuggar metoden print(), varför denna metod exekveras. ii) iii) iv) Utskriften blir In the object. Både statisk och dynamisk typ är D. Metoden print(string) finns inte i klassen D. Inte heller superkalssen C tillhandahåller denna metod, men dock metoden print(object) och eftersom String är en subtyp till Object är det denna metod som exekveras. Kompileringsfel. A är ett interface och kan inte instansieras. Kompileringsfel. Den statiska typen är A och A definierar inte metoden fax. v) Utskriften blir: First print in D. A är supertyp till D, varför ett objekt av typen D kan tilldelas till en variabel av typen A. C är en supertyp till D, varför ett objekt av typen D kan tilldelas till en variabel av typen C. C definierar metoden print(). Den dynamiska typen vid exekveringen av pear.print() är D. vi) vii) Exekveringsfel: B och D är inkompatibla typer. Kompileringen lyckas eftersom explicit typomvandling är ett direktiv till kompilatorn att bortse typkontrollen. Utskriften blir Second print in D. viii) Exekveringsfel: B och D är inkompatibla typer. Kompileringen lyckas eftersom explicit typomvandling är ett direktiv till kompilatorn att bortse typkontrollen. Uppgift 2. a) Klassen bryter mot Open Closed Principle (OCP), som säger att en klass skall vara utvidgningar men stängd för förändringar. Klassen Zoo måste förändras om flera typer av djur skall läggas till. b) Lösningen på problemet är att använda polyformism. public abstract class Animal { abstract void feed(); //Animal public class Dog extends Animal { @Override public void feed(){ // Complex code special for Dog //feed //Dog public class Cat extends Animal { @Override public void feed(){ // Complex code special for Cat //feed //Cat public class Bird extends Animal { @Override public void doit(){ // Complex code special for Bird //feed //Bird public class Zoo { public void feedtheanimals(animal theanimal){ theanimal.feed(); //feedtheanimal //code not shown here //Zoo

Uppgift 3. Utskriften blir: enter doit enter doother doit IllegalArgumentException doit finally main RuntimeException Uppgift 4. a) Specifikation S2 är starkare, eftersom den har svagare förvillkor. b) Implementationen uppfyller båda specifikationerna. c) Implementationen bryter mot principen Separation of Concern. Metoden gör två saker: beräknar medelvärdet av score och lagrar denna information i datastrukturen. För att efterleva Separation av Concern skall beräkningen av medelvärdet göras i en egen metod. public void addscore(string name, List<Double> scores, Map<String,Double> gradebook) { if (name == null scores == null gradebook == null) throw new IllegalArgumentException(); double grade = averagegrade(scores); gradebook.put(name,grade); //addscore private double averagegrade( List<Double> scores) { double grade = 0.0; for (double s : scores) grade = grade + s; if (scores.size() > 0) grade = grade / scores.size(); return grade; //averagegrade

Uppgift 5. a) @Override public boolean equals(object o) { if (this == o) return true; if (o == null) return false; if (this.getclass()!= o.getclass()) return false; Movie other = (Movie) o; return this.title.equals(other.title) && this.year == other.year; //equals Även nedanstående implementation accepteras: @Override public boolean equals(object o) { if (! (o instanceof Movie)) { return false; Movie other = (Movie) o; return this.title.equals(other.title) && this.year == other.year; //equals b) Implementation i), ii) och iv) är korrkta. Implementation iii) felaktig eftersom den använder instansvariabeln minutes vilket inte equals-metoden gör. Alternativ iv) är att föredra då den ger bäst spridning av hashkoderna, eftersom både title och year används vid beräkningen. Alternativ i) ger att alla instanser får samma hashkod, och alternativ iii) ger att alla instanser med samma titel får samma hashkod. Uppgift 6. Lösning med Observer och Observable: import java.util.observer; import java.util.observable; 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, Object obj) { if (obs instanceof Flower) { Flower f = (Flower) obs; f.visit(this); //Bee import java.util.observable; public class Flower extends Observable { private final String name; public Flower(String name) { this.name = name; public void visit(bee b) { System.out.println(name + " is being visited by " + b.getname()); public void bloom() { System.out.println(name + " is blooming!"); setchanged(); notifyobservers(); //Flower

Lösning med PropertyChangeSupport och PropertyChangeListener: Om inga förändringar skall göras i main-metoden i uppgiften måste vi införa ett interface: import java.beans.propertychangelistener; public interface IObservable { void addobserver(propertychangelistener observer); void removeobserver(propertychangelistener observer); //IObserver import java.beans.propertychangesupport; import java.beans.propertychangelistener; import java.beans.propertychangeevent; public class Flower implements IObservable { private PropertyChangeSupport pcs = new PropertyChangeSupport(this); private final String name; public Flower(String name) { this.name = name; public void addobserver(propertychangelistener observer) { pcs.addpropertychangelistener(observer); public void removeobserver(propertychangelistener observer) { pcs.removepropertychangelistener(observer); public void visit(bee b) { System.out.println(name + " is being visited by " + b.getname()); public void bloom() { System.out.println(name + " is blooming!"); pcs.firepropertychange("some text", this, name); // eller några andra lämpliga parametrar //Flower import java.beans.propertychangelistener; import java.beans.propertychangeevent; public class Bee implements PropertyChangeListener { private String name; public Bee(String name) { this.name = name; public String getname() { return name; public void propertychange(propertychangeevent ev) { if (ev.getsource() instanceof Flower) { Flower f = (Flower) ev.getsource(); f.visit(this); //Bee

Uppgift 7. import java.util.*; public class CrossReferenceList { private Map<String, Set<Integer>> map; public CrossReferenceList() { map = new TreeMap<String, Set<Integer>>(); //constructor public void add(string word, int sidenbr) { Set<Integer> nbrs = map.get(word); if (nbrs == null) { nbrs = new TreeSet<Integer>(); map.put(word, nbrs); nbrs.add(sidenbr); //add public String getpagenumbersofword(string word) { Set<Integer> nbrs = map.get(word); if (nbrs == null) { return word; StringBuilder b = new StringBuilder(); b.append(word); b.append(' '); Iterator<Integer> itr = nbrs.iterator(); while (itr.hasnext()) { int i = itr.next(); b.append(i); if (itr.hasnext()) { b.append(", "); return b.tostring(); //getasstring public String getreferencelistasstring() { String b = ""; Set<String> keys = map.keyset(); for (String s : keys) { b = b + getpagenumbersofword(s) + "\n"; return b; // getreferencelistasstring //CrossReferenceList

Uppgift 8. a) public class Counter { private int value; public Counter() { value = 0; //constructor public synchronized void add(int number) { value = value + number; //add b) public int getvalue() { return value; //getvalue //Counter Lösning med som utökar klassen Thread: import java.util.arrays; public class MainThread { public static void main(string[] arg) throws InterruptedException { int[] arr = {1,2,3,4,5,6,7,8,9,10, 11; int[] firsthalf = Arrays.copyOfRange(arr, 0, arr.length/2); int[] secondhalf = Arrays.copyOfRange(arr, arr.length/2, arr.length); Counter counter = new Counter(); ArrayAdder a1 = new ArrayAdder(firstHalf, counter); ArrayAdder a2 = new ArrayAdder(secondHalf, counter); a1.start(); a2.start(); a1.join(); a2.join(); System.out.println(counter.getValue()); //main //MainThread public class ArrayAdder extends Thread { private int[] arr; private Counter counter; public ArrayAdder(int[] arr, Counter counter) { this.arr = arr; this.counter = counter; //constructor public void run() { int sum = 0; for (int i = 0; i < arr.length; i = i + 1) { sum = sum + arr[i]; counter.add(sum); //run //ArrayAdder

Lösning med som inplementerar interfacet Runnable: import java.util.arrays; public class MainThread { public static void main(string[] arg) throws InterruptedException { int[] arr = {1,2,3,4,5,6,7,8,9,10, 11; int[] firsthalf = Arrays.copyOfRange(arr, 0, arr.length/2); int[] secondhalf = Arrays.copyOfRange(arr, arr.length/2, arr.length); Counter counter = new Counter(); ArrayAdder a1 = new ArrayAdder(firstHalf, counter); ArrayAdder a2 = new ArrayAdder(secondHalf, counter); Thread t1 = new Thread(a1); Thread t2 = new Thread(a2); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(counter.getValue()); //main //MainThread public class ArrayAdder implements Runnable { private int[] arr; private Counter counter; public ArrayAdder(int[] arr, Counter counter) { this.arr = arr; this.counter = counter; //constructor public void run() { int sum = 0; for (int i = start; i < arr.length; i = i + step) { sum = sum + arr[i]; counter.add(sum); //run //ArrayAdder

Uppgift 9. Deklarationen List<? extends Brush> leb; innebär att leb kan referera till följande typer av listor: List<Brush>, List<DetailBrush> och List<OtherType>, där OtherType är en (för oss okänd) godtycklig subtyp till Brush. Deklarationen List<? super Brush> lsb; innebär att lsb kan referera till följande typer av listor: List<Brush>, List<ArtistTool> och List<Object>. a) Korrekt! DetailBrush är en subklass till Brush. b) Korrekt! DetailBrush är en subklass till alla klasser som inkluderas i <? super Brush>, dvs ett element av typen DetailBrush kan läggas i listor av typerna List<Brush>, List<ArtistTool> och List<Object>, eftersom DetailBrush kär subtyp till Brush, ArtistTool och Object. c) Kompileringsfel. DetailBrush är inte subklass till alla klasser som inkluderas i <? exdends Brush>. Antag att vi deklarerar en ny typ OtherType som är en subtyp till Brush. Det går det inte att lägga in ett objekt av DetailBrush i en lista av typen List<OtherType> eftersom DetailBrush inte är en subtyp till OtherType. d) Kompileringsfel. ArtistTool är inte superklass till alla klasser som inkluderas i <? super Brush>. Eller mer specifikt: List<Object> inkluderas av <? super Brush> och ArtistTool är inte superklass till Object. e) Korrekt. ArtistTool är superklass till alla klasser som inkluderas i <? extends Brush>. Eller mer specifikt: ett objekt av klassen ArtistTool kan kan läggas in i en lista som är av typen List<Bursh>, List<ArtistTool> eller List<Object>. f) Kompileringsfel. DetailBrush är inte superklass till alla klasser som inkluderas i <? exdends Brush>. I en lista av typen List<Bursh>, kan elementen vara av typen Brush eller typen OtherType som är en, för oss okänd, subtyp till Brush. g) Korrekt! Brush är subklass till alla klasser som inkluderas i <? super Brush>., dvs ett objekt av typen Brush kan läggas in i en lista av typerna List<Bursh>, List<ArtistTool> och List<Object>. h) Kompileringsfel. Brush är inte subklass till alla klasser som inkluderas i <? extends Brush>. Exempelvis kan inte ett objekt av typen Brush läggas in i en lista av typerna List<DetailBrush>.