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



Relevanta dokument
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:

Lösningsförslag till tentamen

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

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

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

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

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

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

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

Tentamen LÖSNINGSFÖRSLAG

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

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

Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad. Skriv ditt idnummer på varje blad (så att vi inte slarvar bort dem).

Objektorienterad programutveckling, fk

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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 HT-13 Datavetenskap TDA550 DAG: TID: 8:30 12:30

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

Institutionen för TENTAMEN CTH VT-16 Datavetenskap TDA550

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

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

TENTAMEN OOP

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

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

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

TENTAMEN OOP

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

Objektorienterad Programmering (TDDC77)

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

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

Objektorienterad programmering D2

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

Tentamen LÖSNINGSFÖRSLAG

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Språkkonventioner och redigering av tal.

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

DAT043 Objektorienterad Programmering

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

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Föreläsnings 10 - Överlagring, Konstruerare, Arv, Mer Exceptions, Reguljära Uttryck

Tentamen, EDAA20/EDA501 Programmering

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

Objektorienterad programvaruutveckling, fk, TDA550. Exempeltentamen

OOP Objekt-orienterad programmering

Lösningsförslag till tentamen

TDDD78 Viktiga begrepp, del 2

Tentamen Programmering fortsättningskurs DIT950

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

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

F4. programmeringsteknik och Matlab

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

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

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

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

OOP Objekt-orienterad programmering

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

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

Klasser och objekt i C#

Institutionen för TENTAMEN CTH HT-17 Datavetenskap TDA550

Lösningsförslag till tentamen

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

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

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

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

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

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

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

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

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

Computer projekttid. Objektorienterad modellering och diskreta strukturer / design. Rapporter från verkligheten. EDAF10 i HT2

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

DAT043 - Föreläsning 7

Mera om generik. Innehåll. Generik och arv Wildcards Vektorer och generik Generiska metoder. EDA690 (Mera om generik) HT / 24

TDDC77 Objektorienterad Programmering

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Tentamen i Objektorienterad programmering

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

Objektorienterad programutveckling, fk

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

Programmering A. Johan Eliasson

Objektorienterad programmering i Java

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

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

Parallellism, återblick

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

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

Classes och Interfaces, Objects och References, Initialization

Föreläsning 9: Arv och UML

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

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

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

Föreläsning 9. Generiska enheter Inre klasser Anonyma klasser Kloning

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

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

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

Föreläsning 13 Innehåll

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

Tentamen OOP

Transkript:

Institutionen för TENTAMEN CTH VT-12 Datavetenskap 2012-04-10 TDA550 Tentamen för TDA550 Objektorienterad programvaruutveckling IT, fk DAG: 12-04-10 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 7/5 kl 12-13 och torsdag 8/5 kl 12-13, 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 a(double x); //A public interface B { public void b(); //B public abstract class C implements A { public void a(double x) { System.out.println( "a() in C" ); //a public abstract void c(); //C public class D extends C implements B { public void b() { System.out.println( "b() in D" ); //b public void c() { System.out.println( "c() in D" ); //c //D public class E extends D { public void a(double x) { System.out.println( "a() in E" ); //a //E public class F extends D implements B { public void a(int i) { System.out.println( "a() in F" ); //a public void b() { System.out.println( "b() in F" ); //b //F <<interface>> A a(double): void {abstract C a(double): void c(): void D b(): void c(): void E a(double): void <<interface>> B b(): void F a(int): void b(): void Vad blir resultatet för var och en av följande satser (ger kompileringsfel, ger exekveringsfel, skriver ut xxx, etc)? a) A x = new C(); x.a(5); b) D x = new F(); x.a(5); c) F x = new F(); x.a(5); d) B x = new F( ); D y = (D) x; y.b(); e) B x = new D( ); F y = (F) x; y.b(); f) B x = new E( ); D y = (D) x; y.c(); (6 poäng)

Uppgift 2. a) Vad blir utskriften av nedanstående program? public class ExceptionStuff { private static boolean throwexception = true; public static void main(string[ ] args) { try { methoda(); catch (Exception e) { System.out.println("Caught Exception in main"); //main private static void methoda( ) throws Exception { System.out.println( "Enters methoda" ); try { methodb(); catch (Exception e) { System.out.println("Caught Exception in methoda"); finally{ System.out.println("finally in methoda"); System.out.println("Exits methoda"); // methoda private static void methodb( ) throws Exception { System.out.println("Enters methodb"); if (throwexception == true) { throw new Exception(); System.out.println("Exits methodb"); // methodb // ExceptionStuff b) Vad blir utskriften av ovanstående program om vi initierar variabeln throwexception till false? (4 poäng) Uppgift 3. Är nedanstående klass trådsäker? Motivera ditt svar! public class Utilities { public final int extra; public Utilities(int extra) { this.extra = extra; //constructor public int sum(int x, int y) { return x + y + extra; //sum public int product(int x, int y) { return x * y * extra; //product // Utilities (2 poäng)

Uppgift 4. a) Skriv specifikationen för nedanstående metod /** @pre... @post... @returns... **/ public static double mean (int[] a, int n) { double sum = 0; for (int i = 0; i < n; i++) sum = sum + a[i]; return sum / n; //mean b) Betrakta följande specfikation för metoden getmostfrequent: Uppgift 5. /* @returns returns the character that appears most frequently in str @throws throws NullPointerException if str == null */ public char getmostfrequent(string str) {... Denna specifikation är inte väldefinierad för alla möjliga indatavärden. Det är inte uppenbart vad metoden skall returnera när str är en tom sträng. Ge ytterligare ett exempel på en indatasträng för vilken beteendet av metoden inte är väldefinierat. Betrakta nedanstående klass för att simulerar händelser: public class Event { public final static int ARRIVAL = 0, DEPARTURE = 1, MEASUREMENT = 2; private int kind, time; public void execute(context context) { switch (kind) { case ARRIVAL: context.arrival(time); break; case DEPARTURE: context.departure(time); break; default: context.measurement(time); //execute public String tostring() { switch (kind) { case ARRIVAL: return "ARRIVAL" + " " + time; case DEPARTURE: return "DEPARTURE" + " " + time; default: return "MEASUREMENT" + " " + time; //tostring //Event (2 poäng) (2 poäng) Klassen bryter mot Open/Closed-principen. Man kan inte lägga till fler sorters händelser utan att ändra i metoderna execute och tostring. Använd designmönstret Template Method för att göra en bättre design som följer Open/Closedprincipen. Lösningen redovisas med Java-kod. (6 poäng)

Uppgift 6. Anta att standardklassen Float, som representerar reella tal som objekt, är implementerad enligt följande: public class Float { private float f; public Float(float f) { this.f = f; //constructor public float floatvalue() { return f; //floatvalue public boolean equals(object o) { if (! (o instanceof Float)) return false; float f1 = this.floatvalue(); float f2 = ((Float) o).floatvalue(); return (f1 == f2); //equal // more methods here that don t interest us now //Float Pelle Hacker beslutar att skriva en förbättrad variant av Float-klassen genom att göra en subklass TolerantFloat som tolererar små avvikelser när man jämför huruvida två reella värden är lika. Pelles kod har följande utseende: public class TolerantFloat extends Float { public static final float TOLERANCE = 0.01; public TolerantFloat(float f) { super (f); //constructor public boolean equals(object o) { if (!(o instanceof Float)) return false; float f1 = this.floatvalue(); float f2 = ((Float) o).floatvalue(); return (Math.abs(f1 f2) <= TOLERANCE); //equals // TolerantFloat I The Java Language Specification anges att en equals-metod skall vara reflexiv, symmetrisk och transitiv. i) Är TolerantFloat.equals() reflexiv? Om inte, ge ett exempel som visar detta. ii) Är TolerantFloat.equals() symmetrisk? Om inte, ge ett exempel som visar detta. iii) Är TolerantFloat.equals() transitiv? Om inte, ge ett exempel som visar detta. Uppgift 7. (6 poäng) Skriv om nedanstående klass så att den blir generisk och därmed kan användas för att handha andra klasser än bara String. public class Col { private ArrayList<String> c; public String get() { return c.remove(0); //get public void insert(string value) { c.add(value); //insert //Col (2 poäng)

Uppgift 8. I ett röstprogram med grafiskt användargränssnitt ingår bl.a. följande klasser: public class Counter { private int yescounter, nocounter; private View view; public Counter(View view) { this.view = view; public void incrementyes() { yescounter++; updateview(); public void incrementno() { nocounter++; updateview(); private void updateview() { view.update(yescounter, nocounter); //Counter import javax.swing.*; public class View extends JPanel { public void update(int yescounter, int nocounter) { // visar, på ett eller annat sätt, upp värdena av yescounter och nocounter på panelen //View public class Main { public static void main(string[] args) {... View view = new View(); Counter counter = new Counter(view);... //Main Designen har är bristfällig eftersom modellklassen Counter är beroende av vyklassen View. Modifiera designen med användning av Observer-mönstret så att vyn kan uppdateras utan att modellen känner till vyn. Lösningen redovisas med Java-kod. (6 poäng) Uppgift 9. Betrakta nedanstående klasser: public class Course implements Cloneable, Serializable { //... implementation are omitted for the sake of brevity //Course public class Student { private List<Course> courses; private String name; private int year; private double gpa; //... constructors and methods are omitted for the sake of brevity //Student a) Överskugga (implementera) metoden clone() i klassen Student. Djup kloning skall användas. (5 poäng) b) Gör de tillägg som behövs för att kunna skriva ut objekt av klassen Student på en fil. (1 poäng)

Uppgift 10. Antag att man har tillgång till följande klasser för att representera geometriska figurer <<interface>> Shape +getwidth(): double +getlength(): double +getarea(): double +draw(): void +erase(): void +move(dx:double, dy: double): void +resize(factor: double): void Point {abstract #x: double #y: double -width:double -height: double Rectangle +getwidth(): double +getlength(): double +getarea(): double +draw(): void +erase(): void +move(dx:double, dy: double): void +resize(factor: double): void -xradius:double -yradius: double Ellipse +getwidth(): double +getlength(): double +getarea(): double +draw(): void +erase(): void +move(dx:double, dy: double): void +resize(factor: double): void Klasserna är givna och får inte ändras. Antag att man vill kunna addera en tredje dimension till rektangel- och ellipsobjekt så att de får en volym. De skall alltså även ha en höjd. Inför klassen Volume. Klassen skall bl.a ha metoden public double getvolume() För att göra detta skall du använda designmönstret Decorator enligt figuren nedan: <<interface>> Shape +getwidth(): double +getlength(): double +getarea(): double +draw(): void +erase(): void +move(dx:double, dy: double): void +resize(factor: double): void Point {abstract #x: double #y: double. -height:double Volume +getwidth(): double +getlength(): double +getarea(): double +draw(): void +erase(): void +move(dx:double, dy: double): void +resize(factor: double): void +getvolume(): double -width:double -height: double Rectangle +getwidth(): double +getlength(): double +getarea(): double +draw(): void +erase(): void +move(dx:double, dy: double): void +resize(factor: double): void -xradius:double -yradius: double Ellipse +getwidth(): double +getlength(): double +getarea(): double +draw(): void +erase(): void +move(dx:double, dy: double): void +resize(factor: double): void a) Implementera klassen Volume i Java. (5 poäng) b) Ge ett kodexempel som skapar en kub och skriver ut dess volym. (1 poäng)

Uppgift 11. Klassen Assistants används för att hålla reda på vilka övningsassistenter som deltar på vilka kurser. Klassen använder sig av en Map där kurserna (som representeras av strängar) utgör nycklar och där övningsassistenterna på kursen (som också representeras som strängar) lagras i ett Set. public class Assistants { private Map<String, Set<String>> map; public Assistants() { // skall implementeras i deluppgift a) public void addta(string course, String taname) { // skall implementeras i deluppgift b) public void displaytaspercourse() { // skall implementeras i deluppgift c) // Assistants a) Implementera konstruktorn som skapar en tom Map. Deluppgift c) ger nödvändig information för att du ska kunna bestämma vilken konkret implementation av Map som skall användas. b) Implementera metoden addta som lägger till en övningsassistent på en specifik kurs. Om kursen inte redan finns i Map:en skall en map entry för kursen skapas. Deluppgift c) ger nödvändig information för att du ska kunna bestämma vilken konkret implementation av Set som skall användas. c) Implementera metoden displaytaspercourse som, på System.out, skriver ut namnet på samtliga kurser samt de övningsassistenter som finns på kurserna. Kurserna och övningsassistenterna skall skrivas ut i alfabetisk ordning enligt: Diskret matematik Anne Andersson Bo Bertilsson Pelle Persson Objektorienterad programmering Lisa Larsson Pelle Persson Sara Svensson (6 poäng) Uppgift 12. Betrakta nedanstående klass: public class Shutdown { /** Print msg and shut down JVM */ public static void shutdownnow(string msg) { System.out.println(msg); System.exit(1); //cause entire JVM to shut down // shutdownnow //Shutdown Klassen innehåller endast den statiska metoden shutdownnow, som har en sträng msg som parameter. Metoden skriver ut msg varefter programmet skjuts ner. Din uppgift är att utöka klassen med en metod public static void delayedshutdown(int seconds, String msg) som skall fungera som metoden shutdownnow förutom att det skall dröja seconds sekunder innan strängen mgs skrivs ut och programmet skjuts ned. Tips: Låt klassen Shutdown antingen implementera interfacet Runnable eller utöka klassen Thread. (6 poäng)

Uppgift 1. Tentamen 120410- LÖSNINGSFÖRSLAG a) Tilldelningen A x = new C() ger kompileringsfel eftersom klassen C är abstrakt. b) Ger utskriften a() in C c) Ger utskriften a() in F d) Ger utskriften b() in F e) Ger exekveringsfel, eftersom den dynamiska typen på x är D och typen D kan inte typomvandlas till typen F. f) Ger utskriften c() in D Uppgift 2. a) Utskriften blir: Enters methoda Enters methodb Caught Exception in methoda finally in methoda Exits methoda b) Utskriften blir: Uppgift 3. Enters methoda Enters methodb Exits methodb finally in methoda Exits methoda Ja, klassen är trådsäker eftersom den är icke-muterbar. Uppgift 4. a) /** @pre a!= null and 0 < n <= a.length @post none @returns returns the mean of the first n numbers in a **/ b) Till exempel är beteendet inte väldefinierat för strängen ab. Eller mer generellt, varje sträng där en eller flera tecken förekommer med samma frekvens, så är most frequently inte tillräckligt definierat.

Uppgift 5. public abstract class Event { protected int time; public abstract void execute(context context); public abstract String kind(); public String tostring() { return kind() + " " + time; //tostring //Event public class Arrival extends Event { public void execute(context context) { context.arrival(time); //execute public String kind() { return "ARRIVAL"; //kind // Arrival public class Departure extends Event { public void execute(context context) { context.departure (time); //execute public String kind() { return "DEPARTURE"; //kind // Departure public class Measurement extends Event { public void execute(context context) { context. measurement (time); //execute public String kind() { return "MEASUREMENT"; //kind // Measurement Uppgift 6. i) Ja, equals() är reflexiv. x.equals(x) ger true för alla objekt x av type Float och för alla objekt x av typen TolerantFloats. ii) Nej, equals() är inte symmetrisk. Om vi skapar objekten Float f = new Float(1.0f); TolerantFloat tf = new TolerantFloat(1.01f); erhåller vi att tf.equals(f) == true men att f.equals(tf) == false iii) Nej, equals() är inte transitiv. Om vi skapar objekten Uppgift 7. TolerantFloat tf1 = new TolerantFloat(1.0f); TolerantFloat tf2 = new TolerantFloat(1.01f); TolerantFloat tf3 = new TolerantFloat(1.02f); erhåller vi att tf1.equals(tf2) == true tf2.equals(tf3) == true men att tf1.equals(tf3) == false public class Col<E> { private ArrayList<E> c; public E get() { return c.remove(0); //get public void insert(e value) { c.add(value); //insert //Col

Uppgift 8. import java.util.observable; public class Counter extends Observable { private int yescounter, nocounter; public Counter() { public void incrementyes() { yescounter++; setchanged(); notifyobservers(); // incrementyes public void incrementno() { nocounter++; setchanged(); notifyobservers(); // incrementno public int getyescounter() { return yescounter; // getyescounter public int getnocounter() { return nocounter; // getnocounter //Counter import javax.swing.*; import java.util.*; public class View extends JPanel implements Observer { public void update(observrable o, Object obj) { if (o instanceof Counters) { Counter counter = (Counter) o; int yescounter = counter.getyescounter(); int nocounter = counter.getnocounter(); // visar, på ett eller annat sätt, upp värdena av yescounter och nocounter på panelen //View public class Main { public static void main(string[] args) {... View view = new View(); Counter counter = new Counter(); counter.addobserver(view);... //Main

Med användning av PropertyChangeSupport och PropertyChangeListener import java.beans.propertychangesupport; import java.beans.propertychangelistener; public class Counter { private PropertyChangeSupport pcs = new PropertyChangeSupport(this); private int yescounter, nocounter; public Counter() { public void addobserver(propertychangelistener observer) { pcs.addpropertychangelistener(observer); public void removeobserver(propertychangelistener observer) { pcs.removepropertychangelistener(observer); public void incrementyes() { yescounter++; pcs.firepropertychange("yescounter",new Integer(0),this); public void incrementno() { nocounter++; pcs.firepropertychange("nocounter", new Integer(0), this); public int getyescounter() { return yescounter; public int getnocounter() { return nocounter; //Counter import javax.swing.*; import java.util.*; import java.beans.propertychangelistener; import java.beans.propertychangeevent; public class View extends JPanel implements PropertyChangeListener { public void propertychange(propertychangeevent ev) { if (ev.getsource() instanceof CounterPC) { Counter c = (Counter) ev.getsource(); int yescounter = c.getyescounter(); int nocounter = c.getnocounter(); // visar, på ett eller annat sätt, upp värdena av yescounter och nocounter på panelen //View public class Main { public static void main(string[] args) {... View view = new View(); Counter counter = new Counter(); counter.addobserver(view);... //Main

Uppgift 9. public class Student implements Cloneable, Serializable { private List<Course> courses; private String name; private int year; private double gpa; public Student clone() { try { Student copy = (Student) super.clone(); copy.courses = new ArrayList<Course>(); for (Course course : courses) { copy.courses.add(course.clone()); return copy; catch (CloneNotSupportedException cnse) { return null; //clone //Student Med användning av kopieringskonstruktor: public class Student implements Cloneable, Serializable { private List<Course> courses; private String name; private int year; private double gpa; public Student(Student other) { this.name = other.name; this.year = other.year; this.gpa = other.gpa; this..courses = new ArrayList<Course>(); for (Course course : other.courses) { this.courses.add(course.clone()); public Student clone() { return new Student(this); //clone //Student Observera att i tesen fanns inga konstruktorer för klassen Student angivna, varför lösningar som anväder ickedefinierade konstruktorer inte accepteras.

Uppgift 10. a) public class Volume implements Shape { private Shape obj; private double height; public Volume(Shape obj, double height) { this.obj = obj; this.height = height; public double getwidth() { return obj.getwidth(); public double getlength() { return obj.getlength(); public double getarea() { return obj.getarea(); public void draw() { obj.draw(); public void erase() { obj.erase(); public void move(double dx, double dy) { obj.move(dx, dy); public void resize(double factor) { height = height * factor; obj.resize(factor); public double getvolume() { return obj.getarea()*height; b) Volume cube = new Volume( new Rectangle(0,0,10, 10), 10); System.out.println(cube.getVolume());

Uppgift 11. import java.util.*; public class Assistants { private Map<String, Set<String>> map; public Assistants() { map = new TreeMap<String, Set<String>>(); public void addta(string course, String taname) { Set<String> tas = map.get(course); if (tas == null) { tas = new TreeSet<String>(); map.put(course, tas); tas.add(taname); //addta public void displaytaspercourse() { for (String c : map.keyset()) { System.out.println(c); for (String taname: map.get(c)) System.out.println(taName); //displaytaspercourse // Assistants public void displaytaspercourse() { Iterator<Map.Entry<String, Set<String>>> itr1 = map.entryset().iterator(); while (itr1.hasnext()) { Map.Entry<String, Set<String>> me = itr1.next(); System.out.println(me.getKey()); Iterator<String> itr2 = me.getvalue().iterator(); while (itr2.hasnext()) { System.out.println(" " + itr2.next()); //displaytaspercourse public void displaytaspercourse() { Set<String> keys = map.keyset(); Iterator<String> itr1 = keys.iterator(); while (itr1.hasnext()) { String course = itr1.next(); System.out.println(course); Set<String> names = map.get(course); Iterator<String> itr2 = names.iterator(); while (itr2.hasnext()) { System.out.println(" " + itr2.next()); //displaytaspercourse

Uppgift 12. Klassen Shutdown implementerar interfacet Runnable: public class Shutdown implements Runnable { private int secs; private String msg; public Shutdown(int secs, String msg) { this.secs = secs; this.msg = msg; //construktor public static void shutdownnow(string msg) { System.out.println(msg); System.exit(1); // cause entire JVM to shut down // shutdownnow public static void delayedshutdown(int seconds, String msg) { Thread t = new Thread(new Shutdown(seconds, msg)); t.start(); // delayedshutdown public void run() { try { Thread.sleep(secs*1000); catch (InterruptedException e) { e.printstacktrace(); shutdownnow(msg); //run //Shutdown Alternativ lösning som där klassen Shutdown utökar klassen Thread: public class Shutdown extends Thread { private int secs; private String msg; public Shutdown(int secs, String msg) { this.secs = secs; this.msg = msg; //construktor public static void shutdownnow(string msg) { System.out.println(msg); System.exit(1); // cause entire JVM to shut down // shutdownnow public static void delayedshutdown(int seconds, String msg) { Thread t = new Shutdown(seconds, msg); t.start(); // delayedshutdown public void run() { try { Thread.sleep(secs*1000); catch (InterruptedException e) { e.printstacktrace(); shutdownnow(msg); //run //Shutdown