Objektorienterad programutveckling, fk

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

Lösningsförslag till tentamen

Objektorienterad programutveckling, fk

Lösningsförslag till tentamen

Lösningsförslag till tentamen

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

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

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

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

Tentamen LÖSNINGSFÖRSLAG

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

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

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

Lösningar för tenta 2 DAT043,

DAT043 Objektorienterad Programmering

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

Kopiering av objekt i Java

Föreläsning 2, vecka 8: Repetition

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

TDA550 - Objektorienterad programvaruutveckling, fk

Tentamen Programmering fortsättningskurs DIT950

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

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

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Enkla variabler kontra referensvariabel

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

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

OOP Objekt-orienterad programmering

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

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

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

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

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

DAT043 - Föreläsning 7

Objektorienterad Programmering (TDDC77)

Objektorienterad programvaruutveckling, fk, TDA550. Exempeltentamen

Del A (obligatorisk för alla)

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

Tentamen ID1004 Objektorienterad programmering May 29, 2012

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

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

Lycka till! TENTAMEN: Objektorienterade applikationer. Läs detta! 1 (6) Tentamen

Instuderingsuppgifter läsvecka 2

Instuderingsfrågor, del D

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

Språkkonventioner och redigering av tal.

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

TENTAMEN OOP

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

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

Enkla variabler kontra referensvariabel

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

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

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

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

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

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

Tentamen för TTIT71 Programmering kl Institutionen för datavetenskap Linköpings universitet. Uppgift 1. (2 p)

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Arv (Inheritance) Multipelt arv finns i verkligheten. Överskuggning, metodbindning. Läsanvisning: ! Arv! Object, instanceof! Relationer!

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

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)

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

LÖSNINGSFÖRSLAG

Lösningsförslag: Övning 5.

Föreläsning 6: Metoder och fält (arrays)

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

Sammanfattning och repetition utgående från typiska tentamensuppgifter

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

Den som bara har en hammare tror att alla problem är spikar

Föreläsning 3. Stack

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

Fördjupad Java. Undantagshantering. Fel

Föreläsning 4. Polymorfism. Polymorfism Dynamisk bindning Inkapsling Information hiding Access-metoder och mutator-metoder

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

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

1 Comparator & Comparable

Föreläsning 3. Stack

Föreläsning 14. Filhantering

Föreläsnings 9 - Exceptions, I/O

Lösningsförslag till tentamen

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

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

Föreläsning 9-10 Innehåll

Classes och Interfaces, Objects och References, Initialization

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Mer om metoder och abstraktioner

Tentamen. Lösningsförslag

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

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Föreläsning 9: Arv och UML

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

Föreläsning 2. Länkad lista och iterator

Arv innebär att man skapar en ny klass (subklass) utifrån en redan existerande klass (superklass, basklass).

TENTAMEN OOP

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

Transkript:

till tentamen P r e l i m i n ä r 1 (6) Kurs Objektorienterad programutveckling, fk Program DAI2 Läsår 2017/2018, lp 2 Examinator Uno Holmer Uppgift 1 (7 p) Metoden i tesen bryter mot designprincipen separation of concern. Den löser fyra olika uppgifter: Beräknar medelvärdet av fältelementen, väljer väg beroende på vad medelvärdet blev, samt utför två olika beräkningar (normaliseringar) av fälten. Detta kan delas upp i metoderna: public void funcrefactored(int[] arr) normalize(arr,computemean(arr)); private double computemean(int[] arr) int sum = 0; for ( int x : arr ) sum += x; return sum/(double)arr.length; private void normalize(int[] arr,double mean) if ( mean < 10 ) normalizelow(arr,mean); else if ( mean > 20 ) normalizehigh(arr,mean); private void normalizelow(int[] arr,double mean) for ( int i = 0; i < arr.length; i++) arr[i] = arr[i] + 42; private void normalizehigh(int[] arr,double mean) for ( int i = 0; i < arr.length - 1; i++) arr[i] = (arr[i] + arr[i+1])*2; Uppgift 2 (6 p) public class MySingletonClass private Set<String> set; private static MySingletonClass instance = null; private MySingletonClass() set = new HashSet<>(); public synchronized static MySingletonClass getinstance() if ( instance == null ) instance = new MySingletonClass(); return instance; public void add(string s) set.add(s); public boolean contains(string s) [] Objektorienterad programutveckling, fk, TDA550, 17/18, lp 2

2 (6) return set.contains(s); Uppgift 3 (8 p) Designen bryter mot designprinciperna DIP och LSP. Fallanalysen över olika personalkategorier är oflexibel och typosäker. Om metoderna take och receive unifieras kan vi införa ett övergripande gränssnitt för anställda. Även bonusklasserna bör ha ett övergripande gränssnitt. public interface Employee void receive(bonus x); public int yearsemployed(); public class Academic implements Employee public void receive(bonus x)... public int yearsemployed()... public class OfficeClerk implements Employee public void receive(bonus x)... public int yearsemployed()... public interface Bonus public class CheapBonus implements Bonus... public class DefaultBonus implements Bonus... public class MediumBonus implements Bonus... public class ExpensiveBonus implements Bonus... Koden som skapar bonusobjekten med utgångspunkt i anställningsår är starkt beroende av specifika typnamn. Detta placeras lämpligen i en objektfabrik. public class BonusFactory public static Bonus createbonus(int years) if ( years > 30 ) return new ExpensiveBonus(); else if ( years > 20 ) return new MediumBonus(); else if ( years > 10 ) return new CheapBonus(); else return new DefaultBonus(); Metoden givebonus kan nu skrivas om på ett typsäkert sätt genom att tillämpa polymorfism: public static void givebonus(arraylist<employee> l) for ( Employee e : l ) e.receive(bonusfactory.createbonus(e.yearsemployed())); [] Objektorienterad programutveckling, fk, TDA550, 17/18, lp 2

Uppgift 4 (8 p) 3 (6) public abstract class AbstractDieDecorator implements Die private Die die; public AbstractDieDecorator(Die die) this.die = die; @Override public int getvalue() return die.getvalue(); @Override public void roll() die.roll(); public class HistoryDie extends AbstractDieDecorator private LinkedList<Integer> history; private final int capacity; public HistoryDie(Die die,int capacity) super(die); this.capacity = capacity; history = new LinkedList<>(); @Override public void roll() super.roll(); if ( capacity > 0 ) if ( history.size() == capacity ) history.removelast(); history.addfirst(getvalue()); public int available() return history.size(); public int lookback(int n) throws IndexOutOfBoundsException if ( n < 0 n >= available() ) throw new IndexOutOfBoundsException("HistoryDie: index out of range"); return history.get(n); [] Objektorienterad programutveckling, fk, TDA550, 17/18, lp 2

Uppgift 5 (8 p) 4 (6) I gruppklassens add-metod adderas muterbara rektangelobjekt till gruppens interna lista. Inget hindrar att sådana objekt delas av flera gruppobjekt. När resize anropas för ett gruppobjekt kan därför ett annat muteras implicit genom att ett delat rektangelobjekt muteras av resize. Gruppklassens klassinvariant håller alltså inte. Group g = new Group(); Rectangle r = new Rectangle(10,20); g.add(r); System.out.println("Total area of g: " + g.getarea()); Group g2 = new Group(); g2.add(r); // r delas nu av både g och g2 g2.resize(2); // Invarianten bryts System.out.println("Total area of g: " + g.getarea()); En lösning på problemet är att göra rektangelklassen kopierbar och låta gruppklassen addera kopior av rektangelobjekt. public class Rectangle implements Cloneable... public Rectangle clone() try return (Rectangle)super.clone(); catch (CloneNotSupportedException e) throw new InternalError(); public class Group... public void add(rectangle r) checkinvariant(); allrectangles.add(r.clone()); totalarea += r.getarea(); checkinvariant();... Uppgift 6 (3+4 p) a) Metoden client har en parameter av typen Int och kan anropas med vilket implementerande objekt som helst förutsatt att dess service-metod har minst lika stark specifikation som i Int. Den enda klassen som uppfyller detta är Impl4. I Impl1 är specifikationen svagare och i de två övriga ojämförbara. b) I en klass som implementerar Int måste func i subklassen: vara minst lika synlig som i Int ha en returtyp som är en subtyp till B (kovarians) ha samma parametertyp kasta kompatibla undantag: inga undantag, E2, E3 eller E2 och E3 Detta uppfylls av fallen a,b,e, och f. [] Objektorienterad programutveckling, fk, TDA550, 17/18, lp 2

5 (6) Uppgift 7 (8 p) Variabeln p har statisk typ A. Den dynamiska typen går från A till B och slutligen till C. Variabelns statiska typ bestämmer vilken klassmetod som anropas, dess dynamiska typ vilken instansmetod som anropas. Metoden h överlagras i A. Vid överlagring matchas anropet mot den metod vars parameterprofil överensstämmer bäst med typerna i anropet. Därefter anropas den valda metoden eller en överskuggning av den. Utskrifterna blir: A p = new A(); // Utskrift p.f(); // A.f trivialt p.g(); // A.g trivialt p = new B(); p.f(); // B.f f är en instansmetod omdef. i B p.g(); // A.g g är en klassmetod p.h("apa"); // A.h(String) apa 1) p.h(123); // B.h(Object) 123 2) p.i("bepa"); // A.i(Object)bepa 3) p = new C(42); print(p.equals(new C(42))); // false 4) 1) h överlagras i A. Anropet matchar A.h(String) vilken anropas. 2) Anropet matchar A.h(Object) som överskuggas av B.h(Object) vilken anropas. 3) Anropet matchar A.i(Object) vilken anropas eftersom den inte överskuggas i B. 4) Anropet matchar Object.equals(Object) vilken anropas. Den överskuggas inte i C. Anropet p.equals(new C(42)) returnerar förstås false eftersom Object.equals baseras på referenslikhet. Uppgift 8 (8 p) public static void main(string[] arg) try copybinarytotext(arg[0]); catch ( FileNotFoundException e ) System.out.println("Cannot open " + e.getmessage()); catch ( IOException e ) e.printstacktrace(); private static void copybinarytotext(string infilename) DataInputStream in = openbinaryinfile(infilename); PrintWriter out = createtextoutfile(infilename + ".txt"); copyfile(in,out); in.close(); out.close(); private static DataInputStream openbinaryinfile(string filename) return new DataInputStream(new FileInputStream(fileName)); private static PrintWriter createtextoutfile(string filename) [] Objektorienterad programutveckling, fk, TDA550, 17/18, lp 2

6 (6) return new PrintWriter(new FileWriter(fileName)); private static void copyfile(datainputstream in,printwriter out) while ( in.available() > 0 ) long value = in.readlong(); out.println("" + value); [] Objektorienterad programutveckling, fk, TDA550, 17/18, lp 2