TDT4100 Objektorientert programmering



Like dokumenter
TDT4100 Objektorientert programmering

TDT4100 Objektorientert programmering

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

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

TDT4100 Objektorientert programmering

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; }

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

UNIVERSITETET I OSLO

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

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

TDT Prosedyre- og objektorientert programmering

TDT4100 Objektorientert programmering

UNIVERSITETET I OSLO

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

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

UNIVERSITETET I OSLO

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF Uke 10. Ukesoppgaver oktober 2012

Forelesning inf Java 4

UNIVERSITETET I OSLO

Løsningsforslag til eksamen i INF1000 våren 2006

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.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.

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

TDT Prosedyre- og objektorientert programmering

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

Eksamen. Objektorientert Programmering IGR 1372

Løsningsforslag ukeoppg. 3: sep (INF Høst 2011)

UNIVERSITETET I OSLO

TDT Prosedyre- og objektorientert programmering

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

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

INF1000 (Uke 4) Mer om forgreninger, While-løkker

Løse reelle problemer

Eksamen IN1010/INF1010 våren 2018

Antall sider (inkl. forsiden): 7. Alle trykte og håndskrevne

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

LO191D/LC191D Videregående programmering

UNIVERSITETET I OSLO

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

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

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

HØGSKOLEN I SØR-TRØNDELAG

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Tre måter å lese fra terminal.

INF Seminaroppgaver til uke 3

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Repetisjon. Mer om forgrening While-løkker

UNIVERSITETET I OSLO

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

UNIVERSITETET I OSLO

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

UNIVERSITETET I OSLO

2 Om statiske variable/konstanter og statiske metoder.

TDT4100 Objektorientert programmering

INF1000 oppgaver til uke 38 (17 sep 23 sep)

UNIVERSITETET I OSLO

TDT Prosedyre- og objektorientert programmering

UNIVERSITETET I OSLO

OPPGAVE 5b og 8b Java Kode

Sensur-veiledning INF1000 h 2013 (fasit) am - 6. des. 2013

UNIVERSITETET I OSLO

INF1000 : Forelesning 4

EKSAMEN med løsningsforslag

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

EKSAMEN. Algoritmer og datastrukturer

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

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

INF106 Objektorientert programmering

Algoritmer og Datastrukturer

Forelesning inf Java 5

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

Forelesning inf Java 5

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

Introduksjon til objektorientert programmering

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Eksempel: Body Mass Index (BMI) Forelesning inf Java 3. Ferdig program (første del) Ferdig program (siste del)

TDT Prosedyre- og objektorientert programmering

UNIVERSITETET I OSLO

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Transkript:

Eksamensoppgave i TDT4100 Objektorientert programmering Torsdag 12. august 2010, kl. 09:00-13:00 Oppgaven er utarbeidet av faglærer Hallvard Trætteberg og kvalitetssikret av Svein Erik Bratsberg. Kontaktperson under eksamen er Hallvard Trætteberg (mobil 918 97263) Språkform: Bokmål Tillatte hjelpemidler: C Én valgfri lærebok i Java er tillatt. Bestemt, enkel kalkulator tillatt. Sensurfrist: Torsdag 2. september. 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 det nødvendig å gjøre. Page 1 of 7

Del 1 Typer (15%) Anta at du har tre klasser A, B og C og ett grensesnitt G. B og C arver fra A (altså med extends) og B implementerer G. Anta også at du har følgende variabeldeklarasjoner (og initialiseringer): A a = new A(); B b = new B(); C c = new C(); G g = null; a) Fyll ut følgende tabell med tillatt eller ulovlig, for å angi om tilordningene a = a, a = b, a = c, a = g, b = a, g = g er tillatt eller ulovlig, iht. Java-kompilatoren (Eclipse-editoren). Som du ser er deler av tabellen fylt ut, fordi en variabel alltid kan tilordnes sin egen verdi, dvs. a = a, b = b, c = c og g = g alle er tillatt. a b c g a = tillatt tillatt tillatt ulovlig b = ulovlig tillatt ulovlig ulovlig c = ulovlig ulovlig tillatt ulovlig g = ulovlig tillatt ulovlig tillatt b) Fyll ut følgende tabell med true eller false, for å angi om instanceof-uttrykkene gir true eller false som resultat. Som du ser er deler av tabellen fylt ut, for å angi at a instanceof A, b instanceof B og c instanceof C alle gir true, dvs. at System.out.println(a instanceof A), System.out.println(b instanceof B) og System.out.println(c instanceof C) alle skriver ut true. A B C G a instanceof true false false false b instanceof true true false true c instanceof true false true false g instanceof false false false false c) Noen av instanceof-uttrykkene vil alltid gi false uavhengig av hvilken verdi variablene faktisk har, og disse vil derfor bli markert som ulovlige av Java-kompilatoren. Hvilke instanceof-uttrykk er av denne grunn ulovlige? En B kan aldri være en C eller omvendt (søsken i arvetreet), så b instanceof C og c instanceof B kan beviselig aldri bli true. Del 2 Memory (25%) Memory er et spill hvor en må huske lengre og lengre sekvenser av f.eks. tall, bokstaver eller farger. Skriv klassen Memory som implementerer et tekstbasert memory-spill hvor en må huske sekvenser av tall/sifre. Legg vekt på å gjøre koden ryddig. Et eksempel på interaksjon er vist nedenfor. Systemets utskrift er vist i kursiv, mens brukerens er i fet skrift. \c er en fiktiv spesialkode som istedenfor å synes (slik den gjør under), blanker ut det som er skrevet ut og inn tidligere, slik at en unngår juks med copy & paste. Tall 1: 2 2 Page 2 of 7

\criktig! Tall 2: 1 21 \criktig! Tall 3: 2 212 \criktig! Tall 4: 4 2123 \cfeil! Du klarte 3 tall! En må ha en liste som fylles med nye tilfeldige tall og kode (helst i en metode) som sammenligner lista med tall (på en eller annen form) som brukeren skriver inn. Hovedprogrammet blir en løkke som lager et nytt tilfeldig tall, legger det inn i lista, leser input fra brukeren og sammenligner inputet med tall-lista. public class Memory { private List<Integer> numbers = new ArrayList<Integer>(); int nextnumber() { int next = (int)(math.random() * 10); numbers.add(next); return next; int digitvalue(char digit) { return digit - '0'; boolean comparenumbers(string digits) { if (digits.length()!= this.numbers.size()) { return false; for (int i = 0; i < digits.length(); i++) { if (digitvalue(digits.charat(i))!= this.numbers.get(i)) { return false; return true; public static void main(string[] args) { Memory memory = new Memory(); Scanner scanner = new Scanner(System.in); while (true) { int next = memory.nextnumber(); System.out.println("Tall " + memory.numbers.size() + ": " + next); String line = scanner.nextline(); if (line == null) { break; else if (memory.comparenumbers(line)) { System.out.println("Riktig!"); else { System.out.println("Feil!"); break; Page 3 of 7

System.out.println("Du klarte " + (memory.numbers.size() - 1) + " tall!"); Del 3 GPS (30 %) Du skal implementere (deler av) et system for å håndtere GPS-data. Et GPS-punkt (GPSPoint) består av to koordinater (desimaltall). En GPS-måling (GPSSample) består av et GPS-punkt og et tidspunkt (antall sekunder relativt til et eller annet starttidspunkt). a) Lag klasser for GPS-punkt (GPSPoint) og GPS-måling (GPSSample) slik at de inneholder nødvendige felt, konstruktører og metoder. Informasjonen skal ikke kunne endres etter at objektene er laget. Med disse klassene implementert, skal det være lov å skrive følgende kode: GPSPoint point = new GPSPoint(72.4, 32.5); GPSSample sample = new GPSSample(point, 724567); En trenger felt med riktig type. Siden informasjonen ikke skal kunne endres, så trengs en konstruktør som tar inn to verdier og en kan ikke ha set-metoder. En bør ha get-metoder, og kan deklarere feltene final: public class GPSPoint { private final double v1, v2; public GPSPoint(double v1, double v2) { this.v1 = v1; this.v2 = v2; public double getv1() { return v1; public double getv2() { return v2; En trenger felt med riktig type. Samme logikk som over når det gjelder konstruktører og metoder. Vi har tatt med en konstruktør som tar inn koordinater, lager GPSPoint-objektet selv og kaller den andre konstruktøren. public class GPSSample { private final GPSPoint point; private final long timestamp; public GPSSample(GPSPoint point, long timestamp) { this.point = point; this.timestamp = timestamp; public GPSSample(double v1, double v2, long timestamp) { this(new GPSPoint(v1, v2), timestamp); Page 4 of 7

public GPSPoint getgpspoint() { return point; public long gettimestamp() { return timestamp; b) Anta det finnes en GPSUtil-klasse med metoden static double distance(gpspoint pkt1, GPSPoint pkt2), som returnerer avstanden mellom to GPS-punkt i meter. Implementer metodene double distance(gpspoint) og double distance(gpssample) i GPSSample-klassen, slik at disse returnerer avstanden (i meter) fra et GPSSample-objekt til parameteret (henholdsvis GPSPointobjektet og GPSSample-objekt). Med disse metodene implementert, skal det altså være lov å skrive følgende kode: GPSPoint point = new GPSPoint(72.4, 32.5); GPSSample sample = new GPSSample(point, 724567); System.out.println(sample.distance(point)); System.out.println(sample.distance(sample)); De to siste linjene skal begge skrive ut 0 (tallet 0), siden avstanden fra et punkt til seg selv er 0. Her er poenget å forstå hvordan vanlige metoder er knyttet til en eksisterende instans og kan kalle den statiske metoden med data knyttet til denne instansen (this) og data knyttet til parameteret (hhv. pt og sample). public double distance(gpspoint pt) { return GPSUtil.distance(this.point, pt); public double distance(gpssample sample) { return GPSUtil.distance(this.point, sample.point); c) GPS-dataene skal lagres i og håndteres av klassen GPSData, som en liste med GPS-målinger. Skriv GPSData-klassen. Det skal (i første omgang) kun være mulig å legge til nye GPS-målinger og lese dem én og én vha. en Iterator. Lag metoder for dette. En må han en intern liste og en metode for å legge til en GPS-måling i denne. Iteratoren hentes ut fra den interne lista. public class GPSData implements Iterable<GPSSample> { private List<GPSSample> samples; public void addgpssample(gpssample sample) { samples.add(sample); public Iterator<GPSSample> iterator() { return samples.iterator(); Page 5 of 7

d) Hva må til (hvordan må GPSData-klassen kodes) for at en skal kunne iterere over GPS-målingene i et GPSData-objekt vha. for-each-løkker, slik: GPSData gpsdata = for (GPSSample sample: gpsdata) { kode med sample her GPSData-klassen må implementere Iterable<GPSSample> for at for-each-syntaksen skal kunne brukes. Da må metoden som returnerer iteratoren deklareres og navngis som over. Del 4 Ekstra GPSData-metoder (15 %) a) For lengre turer kan det bli mange GPS-målinger å lagre. Skriv en metode int reduce() i GPSData-klassen som går gjennom lista og fjerner GPSSample-objekter som 1) ligger nærmere forrige måling i tid enn 30 sekunder, eller 2) er mindre enn 15 meter unna forrige måling. Metoden skal returnere antall GPS-målinger som ble fjernet. Denne kan være litt vrien. Trikset er å huske forrige liste-element og sammeligne med denne. Det er unaturlig å bruke en for-løkke siden lista skal endres underveis. public void reduce() { GPSSample lastsample = null; int i = 0; while (i < samples.size()) { GPSSample sample = samples.get(i); if (lastsample!= null && (sample.gettimestamp() - lastsample.gettimestamp() < 30 sample.distance(lastsample) < 15)) { samples.remove(i); else { lastsample = sample; i++; b) Lag en metode boolean contains(gpspoint point, double distance) i GPSData, som returnerer true dersom det inneholder en GPS-måling som er nærmere point enn distance. public boolean contains(gpspoint pt, double distance) { for (GPSSample sample: samples) { if (sample.distance(pt) < distance) { return true; return false; c) Lag en metode GPSSample closest(gpspoint) som returnerer den målingen i lista som er nærmest det oppgitte punktet. public GPSSample closest(gpspoint pt) { GPSSample closest = null; for (int i = 0; i < samples.size(); i++) { GPSSample sample = samples.get(i); if (closest == null sample.distance(pt) < closest.distance(pt)) { Page 6 of 7

closest = sample; return closest; Del 5 Testing (15%) a) Forklar hvordan du vil teste GPSPoint og GPSData. Eksemplifiser med testkode og kommenter eventuelle forskjeller i testeteknikken. Vi er ikke så nøye på detaljene, bare den generelle testeteknikken kommer tydelig frem. GPSPoint er enkel å teste, siden den ikke er modifiserbar. En oppretter objekter med konstruktøren og sjekker at get-metodene gir riktig verdi med en assert-metode. GPSData kan endres og må en må derfor sjekke i flere trinn. En må legge til én og én GPS-måling og sjekke at iteratoren gir de samme elementene i samme rekkefølge. Ekstra-metodene må sjekkes med ulike sett med GPS-målinger, inkludert sett med 0 og 1 GPS-måling, for å se om logikken er riktig implementert. Page 7 of 7