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

Relevanta dokument
HI1007, Objektorienterad programmering med Java

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

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

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

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

OOP Objekt-orienterad programmering

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

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

Objektorienterad programmering i Java

Tentamen OOP

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

Föreläsning 10. ADT:er och datastrukturer

Tentamen, EDAA20/EDA501 Programmering

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

Generisk klass med typparameter Inre klass - ListIterator

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Kopiering av objekt i Java

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

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

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

Föreläsning 9: Arv och UML

Språkkonventioner och redigering av tal.

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

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

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

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

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

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

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

Tentamen ID1004 Objektorienterad programmering May 29, 2012

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

Objektorienterad Programmering (TDDC77)

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

Fördjupad Java. Undantagshantering. Fel

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

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

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

Introduktion till arv

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

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

Konstruktion av klasser med klasser

Lösningsförslag, tentamen FYTA11 Javaprogrammering

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

Design Patterns. En kort introduktion

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

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

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

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

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

OOP Objekt-orienterad programmering

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

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

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

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.

Kap J 7-1 Mer om arv. (superklass) (subklass)

Objektorienterad Programkonstruktion. Föreläsning jan 2016

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

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

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

TENTAMEN OOP

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

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

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

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

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

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

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.

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

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

Objektsamlingar i Java

Tentamen i Objektorienterad programmering

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

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

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

Lösningar till tentamen i EDAF25

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

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:

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

Objektorienterad Programmering (TDDC77)

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

2. Palindrom. Exempel: 1,2,3,2,1 är ett palindrom, och även 0, men inte 1,2,3,1,2,3.

Objektorienterad programmering D2

Objektorienterad programmering med Java, Generics

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

TENTAMEN OOP

Repetition av OOP- och Javabegrepp

Arrayer. results

Lösningsförslag till tentamen

ID1004 Laboration 4, November 2012

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

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

Objektorienterad programutveckling, fk

Lösningsförslag till tentamen

Transkript:

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011 Text inom [] avser kommentarer till rättningen, ofta sådant som många missuppfattat eller gjort fel på. Del A. Teoriuppgifter 1. Återanvändning: Välskrivna klasser kan återanvändas i andra applikationer som samma roll förekommer (detta förutsätter att klassen har en väl avgränsad roll, ett väl genomtänkt publikt gränssnitt och få beroenden till andra klasser). Inkapsling: Hide the implementation ; för användaren av en klass är endast klassens publika gränssnitt av intresse. Implementationen är dold, speciellt datamedlemmarna genom att synligheten är satt till private eller protected. Arv: I objektorienterade språk kan man skapa nya klasser, som specialiseringar utifrån redan existerande klasser. Arv används då en klass Sub kan beskrivas vara en specialisering av klassen Super. Subklassen ärver alla datamedlemmar och (icke privata) metoder. Nya datamedlemmar och metoder kan läggas till i subklassen och ärvda metoder kan omdefinieras. 2. En abstrakt klass kan inte instansieras, d.v.s. man kan inte skapa objekt av abstrakt typ. En abstrakt klass kan innehålla deklarationer av metoder (utan implementation), s.k. abstrakta metoder. Ett interface får innehålla endast publika, abstrakta metoder och klasskonstanter. Skillnaden mellan en abstrakt klass och ett interface är att den abstrakta klassen får innehålla datamedlemmar, konstruktorer och (implementerade) metoder, vilket inte är tillåtet i ett interface. Vidare får en klass bara ärva från en superklass (abstrakt eller icke abstrakt), medan samma klass får implementera ett godtyckligt antal interface. 3. a) i try-blocket exekveras i sin helhet, alla catch-block hoppas över och slutligen exekveras finally-blocket. ii - try-blocket exekveras fram till den punkt där FileNotFoundException kastas, catch-blocket märkt FileNotFoundException exekveras och slutligen exekveras finally-blocket. iii - try-blocket exekveras fram till den punkt där IOException kastas, catch-blocket märkt Exception (som är supertyp till IOException) exekveras och slutligen exekveras finally-blocket. b) Notera att vi inte skriver catch-block i denna metod eftersom exception inte ska fångas i denna utan kastas vidare till anropande metod. Metoden märks med throws IOException. public void readfile(string filename) throws IOException { BufferedReader fin = null; try { fin = new BufferedReader(new FileReader(filename)); String line; line = fin.readline(); 1

finally { if(fin!= null) filescan.close(); 4. a) Metoden returnerar en referens, d.v.s. adress, till privat data. Anropande kod får direkt tillgång till den (nu inte längre så) privata listan och kan modifiera denna. b) Metoden bör returnera en kopia av listan, genom att skapa ett nytt objekt med lika innehåll som det privata objektet, t.ex. genom att anropa metoden clone för listan. 5. a) Omdefiniering innebär att en ärv metod i en subklass kan ges en ny implementation. Funktionaliteten finns fortfarande i subklassen (samma metodnamn, argumentlista och returtyp), men operationen utförs på ett nytt sätt, specifikt för subklassen. b) Polymorfism = många former. I OOP syftar detta oftast på när en omdefinierad metod anropas från en superreferens. Det framgår då inte av källkoden vilken version av den omdefinierade metoden som kommer att exekveras (det beror ju på vilken typ av objekt som refereras vid exekveringen). Exempel: Bastypen Shape deklarerar metoden paint som har olika implementationer i sub klasser som Line och Circle. Shape[] shapes = new Shapes[sz]; // Skapa objekt av olika subtyper for(shape s: shapes { s.paint(g); // Polymorf kod c) De ärvda datamedlemmarna kanske ska uppfylla vissa villkor (kontrakt) och det sköts via metoder i superklassen. Om data är protected kan subklasser manipulera data så att villkoren inte uppfylls. 6. a) Kod som manipulerar och/eller avläser ändringsbart data bör synkroniseras för att undvika s.k. race conditions. public class Account { private double balance; synchronized public double getbalance() { return balance; synchronized public void deposit(double amount) { if(amount > 0.0) balance = balance + amount; synchronized public void withdraw(double amount) { I detta exempel är monitorn this, d.v.s. objektet självt. b) Då en tråd itererar genom listan får inte andra trådar manipulera listan. Lägg koden för iterationen i ett synkroniserat kodblock (en förutsättning här är att list refererar till en synkroniserad lista): synchronized(list) { for(object o: list) { // Do something with o 2

7. 8. I Model-View-Controller separeras klasserna i nedanstående grupper. Model klasser som representerar datat i applikationen (och som ska presenteras), samt funktionalitet för att manipulera dessa data. Modellen ska inte ha något beroende till vyn. View klasser för att presentera datat. View hämtar information om det ska presenteras från modellen. Controller hanterar händelser, t.ex. input från användaren, som sedan resulterar i uppdatering av datat. Poänger med MVC: - Olika roller i ett problemområde bör alltid modelleras i separata klasser/grupper av klasser, med så få beroenden som möjligt. Detta gör det lättare att skriva koden och testa denna. I detta fall kan klasserna i model testas innan view och controller existerar. - Modellen blir helt oberoende av vyn. Det går alltså att byta ut vyn utan att detta påverkar modellen och att det går att presentera flera vyer av samma modell. 3

Del B. Programmeringsuppgifter Uppgift 1, Vårdcentralen 0.1 public class Person { public Person(String name, String ssn) { this.name = name; this.ssn = ssn; public String getname() { return name; public String getssn() { return ssn; public String tostring() { String info = name + ", SSN " + ssn; return info; private String name; private String ssn; // Social Security Number public class Physician extends Person { public Physician(String name, String ssn, String speciality) { super(name, ssn); this.speciality = speciality; public String getspeciality() { return speciality; public String tostring() { String info = super.tostring(); info += ", " + speciality; return info; private String speciality; 4

import java.util.date; public class JournalNote { public JournalNote(String text, Physician physician) { this.text = text; this.date = new Date(); this.physician = physician; public String gettext() { return text; public Date getdate() { return (Date) date.clone(); public Physician getphysician() { return physician; public String tostring() { String info = date + ", " + physician.tostring(); info += "\n" + text; return info; private String text; private Date date; private Physician physician; import java.util.arraylist; public class Uppgift1 { public static void main(string[] args) { Physician ph1 = new Physician("Sweeny Todd","111-111","kirurgi"); Physician ph2 = new Physician("Lisa Larsson","222-222","medicin"); ArrayList<JournalNote> journal = new ArrayList<JournalNote>(); journal.add(new JournalNote("Höger ben måste amputeras.", ph1)); journal.add(new JournalNote("Vaccinerad mot influensa.", ph2)); journal.add(new JournalNote("Hoppsan, fel ben.", ph1)); for(journalnote note: journal) { System.out.println(note.toString()); 5

Uppgift 2, Vårdcentralen 0.2 import java.util.arraylist; public class Patient extends Person { public Patient(String name, String ssn) { super(name, ssn); journal = new ArrayList<JournalNote>(); /** * Returns a copy of the journal. This is to make sure the * caller can not change the private journal via the copy * returned. */ @SuppressWarnings("unchecked") public ArrayList<JournalNote> getjournal() { return (ArrayList<JournalNote>) journal.clone(); public void addnote(string text, Physician physician) { JournalNote note = new JournalNote(text, physician); journal.add(note); public String tostring() { StringBuffer buffer = new StringBuffer(); buffer.append("patient " + super.tostring()); for(journalnote note: journal) { buffer.append("\n" + note); return buffer.tostring(); private ArrayList<JournalNote> journal; public class Uppgift2 { public static void main(string[] args) { Physician ph1 = new Physician("Sweeny Todd","111-111","kirurgi"); Physician ph2 = new Physician("Lisa Larsson","222-222","medicin"); Patient patient = new Patient("Anders Lindström", "333-333"); patient.addnote("höger ben måste amputeras.", ph1); patient.addnote("vaccinerad mot influensa.", ph2); patient.addnote("hoppsan, fel ben.", ph1); System.out.println(patient.toString()); 6

Uppgift 3, Min egen lista Metoden clone är här skriven enligt anvisningarna i Javas API. Detta är dock inte nödvändigt, lösningar som inte använder sig av Object s clone-metod är ok (om de utför uppdraget korrekt). Denna klass innehåller även delar av lösningen till uppgift 4 (metoden iterator). import java.util.iterator; import java.util.nosuchelementexception; public class SList implements Cloneable, Iterable<String> { // To allow cloning public SList(int capacity) { thelist = new String[capacity]; noofelements = 0; public SList() { this(10); // Call to previous constructor public int size() { return noofelements; public String get(int index) { checkindex(index); return thelist[index]; public void add(string s) { if(noofelements >= thelist.length) { resize(); thelist[noofelements] = s; noofelements++; public void clear() { noofelements = 0; public boolean equals(slist other) { if(this == other) return true; if(this.noofelements!= other.noofelements) return false; for(int i = 0; i < noofelements; i++) { if(!this.thelist[i].equals(other.thelist[i])) { return false; return true; public SList clone() { try { SList newlist = (SList) super.clone(); // The clone has a reference to this.thelist. // Create a copy of the array! newlist.thelist = this.thelist.clone(); return newlist; 7

catch(clonenotsupportedexception cnse) { // This should never happen (if Cloneable is implemented) return null; public String remove(int index) { checkindex(index); String removed = thelist[index]; pack(index); return removed; public Iterator<String> iterator() { return new SListIterator(this); public String tostring() { StringBuffer buffer = new StringBuffer(); buffer.append("["); for(int i = 0; i < noofelements; i++) { buffer.append(thelist[i] + ", "); buffer.append("]"); return buffer.tostring(); private void checkindex(int index) { if(index < 0 index >= noofelements) { throw new IndexOutOfBoundsException("index = " + index); private void resize() { // Double the capacity String[] templist = new String[theList.length*2]; for(int i = 0; i < noofelements; i++) { templist[i] = thelist[i]; thelist = templist; private void pack(int index) { for(int i = index+1; i < noofelements; i++) { thelist[i-1] = thelist[i]; noofelements--; private String[] thelist; private int noofelements; 8

public class Uppgift3 { public static void main(string[] args) { SList list = new SList(); list.add("java"); list.add("c#"); list.add("c++"); list.add("objective-c"); System.out.println(list.toString()); String s = list.remove(1); System.out.println("Removed: " + s); System.out.println(list.toString()); // Check whether we get a copy/clone or not SList copy = list.clone(); copy.remove(0); System.out.println("Original list: " + list.tostring()); System.out.println("The copy: " + copy.tostring()); 9

Uppgift 4, Iterator Denna klass definieras lämpligen i samma fil som SList, med synligheten package. class SListIterator implements Iterator<String> { SListIterator(SList list) { this.list = list; currentposition = -1; public boolean hasnext() { // NB: if current position is last element, there's no next element return currentposition < list.size()-1; public String next() { if(!this.hasnext()) throw new NoSuchElementException(); currentposition++; return list.get(currentposition); public void remove() { throw new UnsupportedOperationException("SListIterator.remove()"); private SList list; private int currentposition; import java.util.iterator; public class Uppgift4 { public static void main(string[] args) { SList list = new SList(); list.add("java"); list.add("c#"); list.add("c++"); list.add("objective-c"); // Test the iterator (should also work with the "for each" loop Iterator<String> it = list.iterator(); String s; while(it.hasnext()) { s = it.next(); System.out.println(s); // At this point, this should cause an exception s = it.next(); 10