TDT4100 Objektorientert programmering

Like dokumenter
Eksamen Oppgave a) public class DayTime { public final int hours, minutes;

TDT4100 Objektorientert programmering

TDT4100 Objektorientert programmering

TDT4100 Objektorientert programmering

TDT4100 Objektorientert programmering

Læringsmål for forelesningen

TDT4100 Objektorientert programmering

TDT4100 Objektorientert programmering

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

TDT4100 Objektorientert programmering

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

TDT4100 Objektorientert programmering

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Repitisjonskurs. Arv, Subklasser og Grensesnitt

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Læringsmål for forelesningen

EKSAMEN I FAG TDT4100 Objektorientert programmering. Fredag 6. juni 2008 Kl

TDT Prosedyre- og objektorientert programmering

Eksamensoppgave i TDT4100 Objektorientert programmering

Kontinuasjonseksamensoppgave i TDT4100 Objektorientert programmering

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Læringsmål for forelesningen

Eksamen Objektorientert Programmering 2011

LO191D/LC191D Videregående programmering

INF100 INNLEVERING 3 HØSTEN 2004

UNIVERSITETET I OSLO

Sortering med Comparable og Comparator

UNIVERSITETET I OSLO

EKSAMEN. Objektorientert programmering

TDT Prosedyre- og objektorientert programmering

UNIVERSITETET I OSLO

EKSAMEN OBJEKTORIENTERT PROGRAMMERING Alle trykte og skrevne. Java API dokumentasjon er tilgjengelig lokalt på hver maskin.

Eksamensoppgave i TDT4100 Objektorientert programmering

Del 3: Evaluere uttrykk

TDT Prosedyre- og objektorientert programmering

TDT Prosedyre- og objektorientert programmering

INF 1010, vår 2005 Løsningsforslag uke 11

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Dagens forelesning. Husk prøveeksamen Fredag 15/3-13 kl 12 i R1. Iterator-teknikken. Eksempel med bruk av Iterator og Iterable-grensesnittene

UNIVERSITETET I OSLO

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

HØGSKOLEN I SØR-TRØNDELAG

Faglærerne prøver å besøker eksamenslokalet mellom klokka 15 og 16 for å oppklare eventuelle uklarheter og feil i oppgaveteksten.

UNIVERSITETET I OSLO

Account. valideringslogikken. Det er vanligst å bruke en såkalt unchecked exception (usjekket unntak), som IllegalArgumentException.

EKSAMEN I FAG TDT4100 Objektorientert programmering. Fredag 2. juni 2006 Kl

UNIVERSITETET I OSLO

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

INF106 Objektorientert programmering

INF1000 Prøveeksamen Oppgave 7 og 9

Object interaction. Innhold. Abstraksjon Grunnleggende programmering i Java Monica Strand 3. september 2007.

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

Objektorientert Programmering Ekstraordinær eksamen 2014

Videregående programmering 6

Emnenavn: Objektorientert programmering. Faglærer: Lars Emil Knudsen

TDT Prosedyre- og objektorientert programmering

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

INF Seminaroppgaver til uke 3

lfæ~~~~:::j~~:~l -.~=:~-t::-d I Alle trykte og håndskrevne EKSAMENSOPPGA VE Side l av 5 Eksamenstid:

HØGSKOLEN I SØR-TRØNDELAG

OPPGAVE 5b og 8b Java Kode

Obligatorisk oppgave 4: Lege/Resept

UNIVERSITETET I OSLO

Eksamensoppgave i TDT4100 Objektorientert programmering

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

UNIVERSITETET I OSLO

Eksamen Objektorientert Programmering 2013

BOKMÅL Side 1 av 5. KONTERINGSEKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Onsdag 6. august 2008 Kl

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

UNIVERSITETET I OSLO

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Læringsmål for forelesningen

Læringsmål for forelesningen

Kapittel 9: Sortering og søking Kort versjon

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Eksamen

Tillatte hjelpemidler: alle skrevne og trykte. Antall sider: 2 (+ 1 side vedlegg, bakerst). Oppgave 1 [25%]

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

UNIVERSITETET I OSLO

Kapittel 7: Mer om arv

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

INF Løsning på seminaropppgaver til uke 8

hvordan du ser for deg at oppgaven kan løses, enn å ikke skrive noe i det hele tatt.

Høgskoleni østfold EKSAMEN

Kapittel 8: Programutvikling

Post-it spørsmål fra timen (Arv og subklasser)

INF1000 Eksamen 2014 (modifisert)

Tittel Objektorientert systemutvikling 1. Eksamenstid, fra-til Ant. oppgaver 6

Algoritmer og datastrukturer Eksamen

IN1010 våren januar. Objektorientering i Java

Delegeringsteknikken. public class CD { private List<Tra ck> tracks = new ArrayLis t<track> (); public int gettrack Count() { return tracks.

Transkript:

Eksamensoppgave i TDT4100 Objektorientert programmering Lørdag 19. mai 2011, kl. 09:00-13:00 Oppgaven er utarbeidet av faglærer Hallvard Trætteberg og kvalitetssikrer Trond Aalberg. Kontaktperson under eksamen Hallvard Trætteberg (mobil 918 97263) Språkform: Bokmål Tillatte hjelpemidler: C Kun Java Pocket Guide, utgitt av O Reilly forlag, er tillatt. Sensurfrist: Mandag 11. juni. Les oppgaveteksten nøye. Finn ut hva det spørres etter i hver oppgave. Dersom du mener at opplysninger mangler i en oppgaveformulering, gjør kort rede for de antagelser og forutsetninger som du finner nødvendig. Side 1 av 9

Del 1 Innkapsling (20%) Gitt følgende klasse, som representerer et tidspunkt på dagen: public class DayTime { public final int hours, minutes; public DayTime(int hours, int minutes) { this.hours = hours; this.minutes = minutes; public String tostring() { return hours + ":" + minutes; a) Hva betyr final-nøkkelordet slik det er brukt her? På hva slags måte(r) ivaretar denne klassen formålet med innkapsling og på hva slags måte(r) ikke? final betyr her at feltet ikke kan endres etter at det er satt i konstruktøren. Selv om feltene er public så sikres innkapsling ved at felt-verdiene forblir korrekte, siden kode utenfor klassen ikke kan sette feltene til ugyldige verdier. Imidlertid er det ikke i tråd med innkapsling at kode gjøres avhengig av at data er lagret i spesifikke felt. Ved bruk av get-metoder får implementasjonsklassen større frihet til å endre interne detaljer, uten at annen kode blir påvirket. b) Beskriv den generelle teknikken og navnekonvensjonen(e) for å representere og kapsle inn en enkel verdi, f.eks. tall eller objektreferanse, som skal kunne endres etter at objektet er opprettet. Gitt verdi med (logisk) navn value og type X, så vil en ha felt, get- og set-metoder som følger: private X value; public X getvalue() { return value; public void setvalue(x value) { this.value = value; Dersom X er boolean/boolean, så brukes gjerne is som prefiks istedenfor get. c) I hva slags metode(r) brukes unntak ifm. innkapsling, og hvordan? Vis gjerne med et eksempel! I metoder som endrer (en verdi i) et objekt, så bør argumenter valideres. Dette må skje før selve endringen og i tilfelle ugyldig(e) verdier så kastes et unntak av typen IllegalArgumentException( ). Eksempel: public void setvalue(int value) { if (value < 0) { throw new IllegalArgumentException( Value shouldn t be negative, but was + value); this.value = value; Side 2 av 9

d) Mange klasser inneholder et List<X>-felt og definerer addx, removex og andre metoder som tilsvarer og bruker metodene i List-grensesnittet. En alternativ løsning kunne vært å arve fra en List<X>-implementasjon, f.eks. ArrayList<X>. Hvorfor brukes aldri denne løsningen i praksis? Det vi altså spør om her er hvorfor vi f.eks. gjør slik public class Person { List<Person> children = // contains list of children public void addchild(person p) { public void removechild(person p) { og ikke slik public class Person extends ArrayList<Person> { // trenger ikke add- og remove-metoder, fordi vi arver dem fra ArrayList - Når en arver så kan en ikke kun arve de metodene en ønsker, men får alle med på kjøpet. Da vil en være nødt til å redefinere alle en ikke trenger/ønsker at skal være tilgjengelig. - Det vil ikke alltid være logisk riktig at klassen skal være instanceof List<X>. - Teknikken kan bare brukes for én slik liste, siden en bare kan arve fra én implementasjonsklasse. Del 2 Klasser (50%) I denne oppgaven skal du implementere klasser og metoder for å håndtere en dagsplan med tidsrom, f.eks. avtaler. Klassen oppgitt i oppgave 1 a) kan brukes som en del av implementasjonen din. Husk at alle metoder kan brukes i implementasjonen av andre. a) Du skal implementere en klasse TimeSlot for å representere et tidsrom innenfor en dag, f.eks. en avtale. Et TimeSlot-objekt har en beskrivelse (tekst), et start- og sluttidspunkt (time og minutt) og en varighet (minutter). Ingen av disse dataene skal kunne endres etter at TimeSlot-objektet er opprettet. Du velger selv hvordan disse dataene skal representeres og hvilke hjelpemetoder som evt. trengs. Merk at varighet kan beregnes fra starttidspunkt og sluttidspunkt, evt. at sluttidspunkt kan beregnes fra starttidspunkt og varighet. Implementer følgende konstruktører og metoder: - TimeSlot(String description, int hours, int minutes, int duration): initialiserer med oppgitt beskrivelse og starttidspunkt (timer og minutter) og varighet (minutter). F.eks. vil new TimeSlot( TDT4100-forelesning, 10, 15, 105) representere en TDT4100-forelesning i tidsrommet 10:15-12:00. - String tostring(): returnerer en String på formen beskrivelse@start-slutt hvor start og slutt er på formen tt:mm (altså to siffer pr. tall). Dersom tostring()-metoden kalles på TimeSlot-objektet fra forrige punkt skal det gi TDT4100-forelesning@10:15-12:00. - DayTime getstarttime(): returnerer starttidspunktet som et DayTime-objekt (se oppgave 1). - DayTime getendtime(): returnerer sluttidspunktet som et DayTime-objekt (se oppgave 1). - int getduration(): returnerer varighet i minutter Vi velger å representere start- og sluttidspunktene som antall minutter siden midnatt. Dette gjør mange av beregningene siden lettere. Et alternativ er å ha to DayTime-felt i stedet. private static int ashours (int minutes) { return minutes / 60; private static int asminutes(int minutes) { return minutes % 60; private String description; Side 3 av 9

private int starttime, endtime; public TimeSlot(String description, int hours, int minutes, int duration) { this.description = description; this.starttime = hours * 60 + minutes; this.endtime = this.starttime + duration; private String twodigits(int i) { return (i < 10? "0" : "") + i; public String tostring() { return description + "@" + twodigits(ashours(starttime)) + ":" + twodigits(asminutes(starttime)) + "-" + twodigits(ashours(endtime)) + ":" + twodigits(asminutes(endtime)); public DayTime getstarttime() { return new DayTime(asHours(startTime), asminutes(starttime)); public DayTime getendtime() { return new DayTime(asHours(endTime), asminutes(endtime)); public int getduration() { return endtime - starttime; public String getdescription() { return description; b) Implementer følgende metoder: - boolean contains(int hours, int minutes): returnerer om dette TimeSlot-objektet inneholder tidspunktet angitt med hours og minutes. Merk at sluttidspunktet regnes ikke som å være inneholdt i tidsrommet. Dette betyr at new TimeSlot(, 8, 0, 30).contains(8, 0) skal gi true, mens new TimeSlot(, 8, 0, 30).contains(8, 30) skal gi false. - boolean overlaps(timeslot timeslot): returnerer om dette TimeSlot-objektet overlapper med det angitte TimeSlot-objektet, dvs. om det finnes et tidspunkt som begge inneholder. Her er litt av poenget å ha riktig type sammenligning i hver ende av intervallet. public boolean contains(int hours, int minutes) { minutes = hours * 60 + minutes; return starttime <= minutes && endtime > minutes; public boolean overlaps(timeslot other) { return starttime < other.endtime && endtime > other.starttime; c) TimeSlot-klassen skal støtte sortering. TimeSlot-objektet med tidligst starttidspunkt sorteres først, og dersom starttidspunktene er like, så skal det med tidligst sluttidspunkt sorteres først. Forklar og implementer nødvendig kode. Sortering krever at klassen implementerer Comparable spesialisert til samme klasse. Side 4 av 9

public class TimeSlot implements Comparable<TimeSlot> {... public int compareto(timeslot other) { int diff = starttime - other.starttime; if (diff == 0) { diff = endtime - other.endtime; return diff; d) Du skal implementere en klasse DayPlan, for å holde oversikt over alle avtalene (altså TimeSlotobjekter) for en dag, bl.a. gi muligheten til å legge til og fjerne TimeSlot-objekter. Velg selv hvilke felt og evt. hjelpemetoder som trengs. Implementer følgende metoder: - void addtimeslot(timeslot timeslot): legger det angitte tidsrommet til denne dagsplanen - void removetimeslot(timeslot timeslot): fjerner det angitte tidsrommet fra denne dagsplanen - TimeSlot gettimeslotat(int hours, int minutes): returnerer det tidligste tidsrommet som inneholder tidspunktet angitt med hours og minutes, ellers null. private List<TimeSlot> timeslots = new ArrayList<TimeSlot>(); public void addtimeslot(timeslot timeslot) { timeslots.add(timeslot); Collections.sort(timeSlots); public void removetimeslot(timeslot timeslot) { timeslots.remove(timeslot); public TimeSlot gettimeslotat(int hours, int minutes) { for (TimeSlot timeslot : timeslots) { if (timeslot.contains(hours, minutes)) { return timeslot; return null; e) Implementer følgende to metoder for tidsplanlegging: - boolean containsoverlapping(): returnerer om det finnes overlappende tidsrom i denne dagsplanen. - Collection<TimeSlot> getfreetime(): returnerer en samling TimeSlot-objekter som representerer fritiden en har i løpet av en dag, dvs. tidsrommene som denne dagsplanen ikke dekker. For begge disse metodene kan det være lurt å definere hjelpemetoder for å gjøre løsningen ryddigere. public boolean containsoverlapping() { for (int i = 0; i < timeslots.size(); i++) { TimeSlot timeslot = timeslots.get(i); for (int j = i + 1; j < timeslots.size(); j++) { TimeSlot othertimeslot = timeslots.get(j); Side 5 av 9

if (timeslot!= othertimeslot && timeslot.overlaps(othertimeslot)) { return true; return false; private static void addtimeslotifnonempty(collection<timeslot> timeslots, DayTime starttime, DayTime endtime) { int duration = (endtime.hours * 60 + endtime.minutes) - (starttime.hours * 60 + starttime.minutes); if (duration > 0) { timeslots.add(new TimeSlot(null, starttime.hours, starttime.minutes, duration)); public Collection<TimeSlot> getfreetime() { Collection<TimeSlot> freetime = new ArrayList<TimeSlot>(); TimeSlot previous = new TimeSlot(null, 0, 0, 0); for (TimeSlot timeslot : getalltimeslots()) { DayTime starttime = timeslot.getstarttime(); addtimeslotifnonempty(freetime, previous.getendtime(), starttime); DayTime endtime = timeslot.getendtime(); if (! previous.contains(endtime.hours, endtime.minutes)) { previous = timeslot; addtimeslotifnonempty(freetime, previous.getendtime(), new DayTime(24, 0)); return freetime; Del 3 Arv og delegering (20%) a) Du skal implementere støtte for TDT4100-forelesninger, som et spesielt tidsrom som alltid er fra 10:15 til 12:00. Vis hvordan en klasse TDT4100Lecture kan implementere dette vha. arv fra TimeSlot. Velger å bruke konstruktøren for å sette riktige verdier. Alternativt kan get-metoden redefineres til å returnere riktige (konstant)verdier. public class TDT4100Lecture extends TimeSlot { public TDT4100Lecture() { super("tdt4100 lecture", 10, 15, 105); b) Du skal implementere støtte for en dagsplan som alltid inneholder et TDT4100Lecture-objekt, dvs. en TDT4100-forelesning fra 10:15-12:00. Det skal ikke være mulig å fjerne TDT4100- forelesningen eller legge inn andre tidsrom som overlapper med den. Følgende kode illustrerer hvordan det skal virke: Side 6 av 9

DayPlan tuesday = new TDT4100DayPlan(); System.out.println(tuesday.getTimeSlotAt(10, 30)); // prints "TDT4100 lecture@10:15-12:00" tuesday.addtimeslot(new TimeSlot("Coffee break", 11, 30, 60)); // throws appropriate exception, since it overlaps with the TDT4100 lecture Vis hvordan dette kan implementeres i en TDT4100DayPlan-klasse vha. arv fra DayPlan. public class TDT4100DayPlan extends DayPlan { private TDT4100Lecture tdt4100lecture; public TDT4100DayPlan() { super(); tdt4100lecture = new TDT4100Lecture(); super.addtimeslot(tdt4100lecture); @Override public void addtimeslot(timeslot timeslot) { if (timeslot.overlaps(tdt4100lecture)) { throw new IllegalArgumentException("Cannot overlap TDT4100 lecture!"); super.addtimeslot(timeslot); @Override public void removetimeslot(timeslot timeslot) { if (timeslot == tdt4100lecture) { throw new IllegalArgumentException("Cannot remove TDT4100 lecture!"); super.removetimeslot(timeslot); c) Det er ofte nyttig å kunne la én dagsplan bygge på eller inkludere en eller flere andre, f.eks. la dagsplanen for en bestemt tirsdag inkludere tirsdagsplanen som gjelder for hele semesteret (hvor bl.a. TDT4100-forelesningen ligger). Følgende kode illustrerer hvordan det skal virke: DayPlan repeatingtuesday = new TDT4100DayPlan(); DelegatingDayPlan tuesday = new DelegatingDayPlan(repeatingTuesday); System.out.println(tuesday.getTimeSlotAt(10, 30)); // prints "TDT4100 lecture@10:15-12:00" since tuesday logically includes the TDT4100Lecture in repeatingtuesday tuesday.addtimeslot(new TimeSlot("Coffee break", 11, 30, 60)); System.out.println(tuesday.containsOverlapping()); // prints "true" since timeslot in tuesday overlaps with TDT4100Lecture in repeatingtuesday Skisser med tekst og kode hvordan delegeringsteknikken og arv fra DayPlan kan brukes for å implementere denne oppførselen, inkludert hvordan du evt. vil modifisere DayPlan for å gjøre løsningen ryddigere. Side 7 av 9

Delegering er en teknikk hvor et objekt, videreformidler kall til en delegat når det er behov for delegatens ferdigheter. I dette tilfellet er det viktig at TimeSlot-objektene som ligger i delegaten regnes med i logikken. F.eks. må gettimeslotat( )-metoden sjekke egne TimeSlot-objekter og delegatens og returnere det tidligste av de to. I løsningen innføres en getalltimeslots()-metode i DayPlan, som brukes istedenfor this.timeslots i metodene containsoverlapping() og getfreetime() i DayPlan som trenger å behandle alle TimeSlot-objektene på en gang. Dermed trenger vi bare å redefinere getalltimeslots(). public class DelegatingDayPlan extends DayPlan { private DayPlan delegate; public DelegatingDayPlan(DayPlan delegate) { super(); this.delegate = delegate; // @Override public TimeSlot gettimeslotat(int hours, int minutes) { TimeSlot timeslot1 = super.gettimeslotat(hours, minutes); TimeSlot timeslot2 = delegate.gettimeslotat(hours, minutes); if (timeslot1!= null && timeslot2!= null) { return timeslot1.compareto(timeslot2) < 0? timeslot1 : timeslot2; else if (timeslot1!= null) { return timeslot1; else { return timeslot2; // @Override protected Collection<TimeSlot> getalltimeslots() { Collection<TimeSlot> timeslots = super.getalltimeslots(); if (delegate!= null) { List<TimeSlot> timeslotlist = new ArrayList<TimeSlot>(timeSlots); timeslotlist.addall(delegate.getalltimeslots()); Collections.sort(timeSlotList); timeslots = timeslotlist; return timeslots; Del 4 Input/output (IO) (10%) a) Hva er den grunnleggende forskjellen på input/output-klassene InputStream/OutputStream og deres subklasser ift. Reader/Writer og deres subklasser? InputStream-/OutputStream-klassene håndterer byte-verdier, mens Reader-/Writer-klassene håndterer char-verdier, som krever koding av tegn til/fra bytes (iht. Unicode-regler). Side 8 av 9

Powered by TCPDF (www.tcpdf.org) b) Ifm. input/output brukes en egen type unntak, hvilken? På hva slags måte påvirker det kode som driver med input/output? Input/output-metoder kaster gjerne IOException, som er en såkalt checked exception. Slike brukes gjerne for feil som er utenfor vår kontroll. Disse krever at kode må fange dem opp med try/catch eller deklarere med throws at de kastes videre. c) Hvorfor må vi lukke input- og output- strømmer med close()-metoden når vi er ferdige med dem? Hvordan sikrer man at det skjer også i tilfelle unntak? Strømmer bruker gjerne ressurser utenfor Java og close()-metoden sikrer at Java samhandler riktig med disse, f.eks. frigjør dem. For å sikre at dette alltid skjer, er det vanlig å ha close()-kallet i en try/finally-blokk. Side 9 av 9