LC191D/LO191D Videregående programmering mai 2010



Like dokumenter
HØGSKOLEN I SØR-TRØNDELAG

LO191D/LC191D Videregående programmering

HØGSKOLEN I SØR-TRØNDELAG

Repitisjonskurs. Arv, Subklasser og Grensesnitt

HØGSKOLEN I SØR-TRØNDELAG

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Eksamensoppgave Vår 2012 Ordinær eksamen Bokmål. Videregående programmering. Eksamensdato: Studium/klasse: 2. klasse

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL

LO191D/LC191D Videregående programmering Løsningsforslag eksamen mai Oppgave 1

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

UNIVERSITETET I OSLO

. Ved sensur vl1 ahe bokstaverte deloppgaver (a, b, c,...) telle like mye.

EKSAMEN. Objektorientert programmering

UNIVERSITETET I OSLO

Løsningsforslag Videregående programmering, eksamen desember 2010

ANTDAGER = 358; I Ifra nyttår 08 til 08 1ed julaften

Kapittel 7: Mer om arv

UNIVERSITETET I OSLO

INF1010 Arv. Marit Nybakken 2. februar 2004

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

HØGSKOLEN I SØR-TRØNDELAG

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

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

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

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

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

OO-eksempel. Modellen ser slik ut: Studenter + antstudenter : int = 0

Gjennomgang av eksamen H99

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

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

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

EKSAMEN med løsningsforslag

HØGSKOLEN I SØR-TRØNDELAG

Eksamen Objektorientert Programmering 2011

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

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

INF Løsning på seminaropppgaver til uke 8

Eksamen Objektorientert Programmering 2013

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

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

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

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

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

Algoritmer og datastrukturer Løsningsforslag

UNIVERSITETET I OSLO

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

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

Sortering med tråder - Quicksort

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

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

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

INF1000: Forelesning 6. Klasser og objekter del 1

TDT4100 Objektorientert programmering

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

TDT4100 Objektorientert programmering

Enkle generiske klasser i Java

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

INF1000 Prøveeksamen Oppgave 7 og 9

INF106 Objektorientert programmering

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

UNIVERSITETET I OSLO

INF1010 Grafisk brukergrensesni3 med Swing og awt del 1 INF1010

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

UNIVERSITETET I OSLO

Kapittel 9: Sortering og søking Kort versjon

INF1010. Grensesnittet Comparable<T>

UNIVERSITETET I OSLO

INF1010 våren Arv og subklasser del 1

IN1010 våren 2018 Tirsdag 15. mai. Repetisjon av subklasser og tråder. Stein Gjessing Institutt for informatikk Universitetet i Oslo

Eksamen. Objektorientert Programmering IGR 1372

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

/** *Kamp klassen inneholder kampfakte og hoveddelen av kampmotoren. young */

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

Les gjennom hele oppgavesettet før du begynner å besvare deloppgavene.

INF1010 våren Arv og subklasser - del 2

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

Transkript:

LC191D/LO191D Videregående programmering mai 2010 Løsningsforslag Oppgave 1 Transporttype er en tekst som er felles for klassene AnnenEgenTransport og Kollektivtransport. Vi legger den derfor i klassen Transport. Vi lar prisberegningen være abstrakt i klassen Reiseelement, derfor blir også klassen Transport abstrakt. Klassene i klassetreet ser nå slik ut: abstract class Reiseelement { public abstract double finnpris(); // metoden får implementasjon i subklassene class AndreUtgifter extends Reiseelement { private final String tekst; private final double pris; public AndreUtgifter(String tekst, double pris) { this.tekst = tekst; this.pris = pris; public String gettekst() { return tekst; public double finnpris() { return pris; abstract class Transport extends Reiseelement { // REVIDERT UTGAVE private final Etappe etappe; private final String transportmiddel; public Transport(Etappe etappe, String transportmiddel) { this.etappe = etappe; 1

this.transportmiddel = transportmiddel; public String gettransportmiddel() { return transportmiddel; class Kollektivtransport extends Transport { private final double pris; public Kollektivtransport(Etappe etappe, String transportmiddel, double pris) { super(etappe, transportmiddel); this.pris = pris; public double finnpris() { return pris; class Transporttype { // HJELPEKLASSE, se kommentar nedenfor private final String type; private final double pris; public Transporttype(String type, double pris) { this.type = type; this.pris = pris; public String gettype() { return type; public double getpris() { return pris; class AnnenEgenTransport extends Transport { private final double antkm; public static Transporttype[] TRANSPORT_TYPER = {new Transporttype("motorsykkel", 2.8), new Transporttype("moped", 1.55), new Transporttype("snøscooter", 6.6), 2

new Transporttype("båt med motor minst 50 hk", 6.5), new Transporttype("båt med motor under 50 hk", 3.5), new Transporttype("EL bil", 4.0), new Transporttype("Annet", 1.5); public AnnenEgenTransport(Etappe etappe, String transportmiddel, double antkm) { super(etappe, transportmiddel); this.antkm = antkm; public double finnpris() { return antkm * finnprisprkm(gettransportmiddel()); private static double finnprisprkm(string type) { // hjelpemetode for (int i = 0; i < TRANSPORT_TYPER.length; i++) { if (TRANSPORT_TYPER[i].getType().equals(type)) { return TRANSPORT_TYPER[i].getPris(); return 0.0; Kommentar til klassene Trannsporttype og AnnenEgenTransport: Studenten bør lage en datastruktur for de ulike transporttypene. En rekke med if else setninger er ikke akseptabelt. Alle noenlunde fornuftige strukturer er vurdert omtrent likeverdige. Det mest elegante er nok å bruke ENUM det ble imidlertid før eksamen opplyst at det ikke var pensum, men det tas med her for eksemplets skyld: enum Transporttype { MOTORSYKKEL("motorsykkel", 2.8), MOPED("moped", 1.55), SNØSCOOTER("snøscooter", 6.6), BÅT_MED_STOR_MOTOR("båt med motor minst 50 hk", 6.5), BÅT_MED_LITEN_MOTOR("båt med motor under 50 hk", 3.5), EL_BIL("EL bil", 4.0), ANNET("Annet", 1.5); Private final String navn; private final double godtgjprkm; Transporttype(String navn, double godtgjprkm) { this.navn = navn; this.godtgjprkm = godtgjprkm; public String tostring() { // objektnavnet som tekst return navn; 3

public double getgodtgjprkm() { return godtgjprkm; class AnnenEgenTransport extends Transport { private final double antkm; private final double godtgjprkm; public AnnenEgenTransport(Etappe etappe, Transporttype type, double antkm) { super(etappe, type.tostring()); this.godtgjprkm = type.getgodtgjprkm(); this.antkm = antkm; public double finnpris() { return antkm * godtgjprkm; Vi lager et objekt av klassen AnnenEgenTransport slik: Reiseelement r = new AnnenEgenTransport( new Etappe("kl 0810 10.01.2010", "kl 0900 10.01.2010", "Oslo S", "Fugleøya"), Transporttype.BÅT_MED_STOR_MOTOR, 10); Oppgave 2 Klassen Person: public double finnprisallereiser() { double sum = 0.0; for (Reise r : reiser) { sum += r.finnreisenstotalpris(); return sum; public int finntotaltantovernattinger() { int ant = 0; for (Reise r : reiser) { ant += r.finnantovernattinger(); return ant; 4

Klassen Reise: public static final double DAGPRIS1 = 270.0; public static final double DAGPRIS2 = 580.0; public int finnantovernattinger() { return Math.abs(startDato.dagerForskjell(sluttDato)); public double finnkostgodtgjørelse() { int antdager = finnantovernattinger(); return (antdager == 0)? DAGPRIS1 : DAGPRIS2 * (antdager + 1); public double finnnatttillegg() { return prisprnatt * finnantovernattinger(); public double finnreisenstotalpris() { double sum = 0.0; for (Reiseelement re : reiseelementer) { sum += re.finnpris(); return sum + finnkostgodtgjørelse() + finnnatttillegg(); Oppgave 3 Reglene for bruk av privatbil var dessverre så dårlig formulert, at det måtte tas hensyn til dette ved sensureringen. Reglene er slik at grensen på 9000 km gjelder pr. person, og da slik å forstå at en må summere alle reisene for denne personen før grensen kan sjekkes. (Pussig at ingen spurte om dette på eksamen, å kjøre 9000 km på en og samme tur innenlands er da ganske uvanlig, med det ble vel bare et tall for dere uten at dere tenkte mer over det. Av 62 studenter var det kun 4 som hadde skjønt hva oppgaven innebar og for de av disse som hadde programmert dette, ble det regnet at de hadde mindre tid enn de øvrige til å gjøre resten av oppgavesettet.) Dere er ikke bedt om å tegne revidert klassediagram, men det kan se slik ut: 5

Person 1 1 person reiser * Reise 1 reiseelementer * Reiseelement Etappe etappe 1 1 Transport AndreUtgifter EgenTransport Kollektivtransport * EgenBil AnnenEgenTransport Klassen EgenBil er ny, og vi får antall kilometer som felles attributt for klassene EgenBil og AnnenEgenTransport. Denne velger vi å generalisere ut og legge i en egen superklasse, klassen EgenTransport, felles for disse to klassene. Videre må vi kople klassen EgenBil til Person slik at vi kan holde orden på antall kilometer den enkelte har fått godtgjørelse for. Klassene EgenTransport og EgenBil ser dermed slik ut: abstract class EgenTransport extends Transport { private final double antkm; public EgenTransport(Etappe etappe, String transportmiddel, double antkm) { super(etappe, transportmiddel); this.antkm = antkm; public double getantkm() { return antkm; class EgenBil extends EgenTransport { public static double GRENSE_EGENBIL = 9000.0; public static double PRIS1 = 3.65; public static double PRIS2 = 3.0; private Person person; private double beregnetpris; 6

public EgenBil(Etappe etappe, double antkm, Person person) { super(etappe, "Egen bil", antkm); this.person = person; beregnpris(); // må gjøre det her ettersom algoritmen er avhengig av antall km kjørt public double finnpris() { return beregnetpris; private void beregnpris() { double antkmhittil = person.getantkmhittil(); double nyantkmhittil = antkmhittil + getantkm(); double antkmpris1 = 0.0; double antkmpris2 = 0.0; if (nyantkmhittil <= GRENSE_EGENBIL) { antkmpris1 = getantkm(); else if (antkmhittil >= GRENSE_EGENBIL) { antkmpris2 = getantkm(); else { // litt av hvert antkmpris1 = GRENSE_EGENBIL antkmhittil; antkmpris2 = nyantkmhittil GRENSE_EGENBIL; beregnetpris = antkmpris1 * PRIS1 + antkmpris2 * PRIS2; person.setantkmhittil(nyantkmhittil); Klassen AnnenEgenTransport blir som før, men nå altså subklasse til EgenTransport. I klassen Person har vi følgende utvidelser: private double antkmhittil = 0.0; public double getantkmhittil() { return antkmhittil; public void setantkmhittil(double nyantkmhittil) { antkmhittil = nyantkmhittil; 7

Oppgave 4 class GUI extends JFrame { private Person person; private JList oversiktsliste = new JList(); private JScrollPane rulleoversiktsliste = new JScrollPane(oversiktsliste); private JList detaljliste = new JList(); // initieres som tom liste private JScrollPane rulledetaljliste = new JScrollPane(detaljliste); public GUI(Person person) { this.person = person; settitle("ekamen mai 2010"); setdefaultcloseoperation(jframe.exit_on_close); setlayout(new GridLayout(2, 1, 5, 5)); initieroversiktsliste(); initierdetaljliste(); add(rulleoversiktsliste); oversiktsliste.addlistselectionlistener(new Listelytter()); add(rulledetaljliste); pack(); private class Listelytter implements ListSelectionListener { public void valuechanged(listselectionevent hendelse) { int indeks = oversiktsliste.getselectedindex(); if (indeks >= 0) { String[] detaljer = person.hentdetaljer(indeks); // se nedenfor detaljliste.setlistdata(detaljer); private void initieroversiktsliste() { String[] s = person.lagoversikt(); oversiktsliste.setlistdata(person.lagoversikt());// se nedenfor JViewport jvp = new JViewport(); jvp.setview(new JLabel("Reiser foretatt av " + person.getnavn())); // tabelloverskrift rulleoversiktsliste.setcolumnheader(jvp); // ok om denne ikke var med i besvarelsen oversiktsliste.setselectionmode(listselectionmodel.single_selection); private void initierdetaljliste() { JViewport jvp = new JViewport(); jvp.setview(new JLabel("Detaljer, valgt reise")); // tabelloverskrift rulledetaljliste.setcolumnheader(jvp); // ok om denne ikke var med i besvarelsen 8

detaljliste.setenabled(false); // låser detaljlisten for brukeren Ang. JList: Det er helt ok om studenten brukte listemodell for datainnholdet. Men akkurat i dette tilfellet er det unødvendig ettersom hele listen skal byttes ut. Til det bruket har vi metoden setlistdata(). Det som imidlertid ikke fungerer er å opprette et nytt JList objekt. For husk at det er det første JList objektet som er lagt inn i listen med GUI komponenter. Skisse: JList detaljliste = new JList(); JScrollPane rulledetaljliste = new JScrollPane(detaljliste); add(rulledetaljliste); // her legges JList objektet inn i GUI beholderen detaljliste = new JList( ); // dette endrer ikke innholdet i GUI beholderen Prinsippet er det samme som for eksempelvis ArrayList. Kun referansene kopieres inn, ikke det de peker til. Å få fram teksten i øverste liste (formattering ikke del av oppgaven) Klassen Person: public String[] lagoversikt() { String[] liste = new String[reiser.size()]; for (int i = 0; i < reiser.size(); i++) { liste[i] = reiser.get(i).tostring(); return liste; Klassen Reise: public String tostring() { java.util.formatter f = new java.util.formatter(); f.format("kost: NOK %.2f, natt: NOK %.2f, totalpris: NOK %.2f", finnkostgodtgjørelse(), finnnatttillegg(), finnreisenstotalpris()); // fra oppgave 2 return hensikt + ", periode: " + startdato.format() + " " + sluttdato.format() + ". " + f.tostring() + "."; Å få fram teksten i nederste liste (formattering ikke del av oppgaven) Klassen Person: public String[] hentdetaljer(int indeks) { if (indeks >= 0 && indeks < reiser.size()) { return reiser.get(indeks).hentreisedetaljer(); 9

return new String[0]; Klassen Reise: public String[] hentreisedetaljer() { String detaljer[] = new String[reiseelementer.size()]; for (int i = 0; i < reiseelementer.size(); i++) { detaljer[i] = reiseelementer.get(i).finndetaljer(); return detaljer; Klassen Reiseelement: public abstract String finndetaljer(); Klassen AndreUtgifter: public String finndetaljer() { java.util.formatter f = new java.util.formatter(); f.format("%.2f", finnpris()); return "Andre utgifter: " + tekst + ": NOK " + f.tostring(); Klassen Transport: public String finndetaljer() { java.util.formatter f = new java.util.formatter(); f.format("%.2f", finnpris()); return "Transport: " + transportmiddel + ", tid fra til: " + etappe.getstarttid() + " " + etappe.getslutttid() + ", sted fra til: " + etappe.getfrasted() + " " + etappe.gettilsted() + ", NOK: " + f.tostring() + "."; Kommentar ang. tostring() : Noen har deklarert tostring() abstrakt i en av klassene, det er ikke tillatt ettersom den allerede har en standardimplementasjon (som arves, dersom du ikke lager din egen). 10