Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk



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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

Om oppgaveteksten på noe punkt er uklar eller upresis, kan du gjøre egne presiseringer. Formulér i så fall disse tydelig i oppgavebesvarelsen din.

UNIVERSITETET I OSLO

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

UNIVERSITETET I OSLO

TOD063 Datastrukturer og algoritmer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

UNIVERSITETET I OSLO

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

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

EKSAMEN I EMNET INF100/INF100-F Grunnkurs i programmering (Programmering 1) Fredag 16. desember 2005 Tid: 09:00 14:00

INF1000 Metoder. Marit Nybakken 16. februar 2004

TDT4102 Prosedyreog objektorientert programmering Vår 2016

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

Forelesning inf Java 4

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF Seminaroppgaver til uke 3

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

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

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

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

Oblig4 - obligatorisk oppgave nr. 4 (av 4) i INF1000

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

81,9(56,7(7(7,26/2 'HWPDWHPDWLVNQDWXUYLWHQVNDSHOLJHIDNXOWHW

Eksamen IN1010/INF1010 våren 2018

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

Innlesning fra tastatur med easyio. INF1000 høst Vi må først skrive i toppen av programmet: import easyio.*;

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

INF Uke 10. Ukesoppgaver oktober 2012

Forelesning inf Java 5

Forelesning inf Java 5

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

UNIVERSITETET I OSLO

EKSAMEN. Objektorientert programmering

Løse reelle problemer

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

UNIVERSITETET I OSLO

Obligatorisk oppgave nr. 3 (av 4) i INF1000, våren 2006

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I)

HØGSKOLEN I SØR-TRØNDELAG

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

HØGSKOLEN I SØR-TRØNDELAG

Ol Emnekode: Faglig veileder: I L~~25 A - E!8 Viho~d~.1. F ntall oppga~ forsiden): ;;;handskr~vn-;

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

LO191D/LC191D Videregående programmering

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

OPPGAVE 5b og 8b Java Kode

TDT4100 Objektorientert programmering

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

Repetisjon: operatorene ++ og -- Java 5. Nøtt. Oppgave 1 (fra forrige gang) 0 udefinert udefinert. Alternativ 1 Prefiks-operator

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

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF 1000 høsten 2011 Uke september

UNIVERSITETET I OSLO

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

INF109 - Uke 1b

INF1000 undervisningen INF 1000 høsten 2011 Uke september

G høgskolen i oslo. Emne: Algoritmer og datastrukturer. Emnekode: 80131A. Faglig veileder: UlfUttersrud. Gruppe(r) : Dato:

Informasjon Prøveeksamen i IN1000 høsten 2018

INF1000 : Forelesning 4

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

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

INF1000 Variable. Marit Nybakken 27. januar 2004

INF1010 Sortering. Marit Nybakken 1. mars 2004

UNIVERSITETET I OSLO

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

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

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

Transkript:

Side 1 av 20 Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk Bokmål Eksamen i emnet INF100 Grunnkurs i programmering Torsdag 27. november 2014 Tid: 09:00 14:00 Tillatte hjelpemidler: Alle trykte og skrevne Oppgavesettet består av 4 oppgaver og er på 20 sider. Viktige generelle råd og kommentarer: Kontroller at oppgavesettet er fullstendig. Les nøye gjennom hele oppgavesettet før du begynner å besvare de enkelte delspørsmålene. Mange av deloppgavene gjør bruk av metoder fra andre deloppgaver. Derfor er det viktig å merke seg hva de forskjellige metodene i deloppgavene gjør og hvilke verdier de returnerer. Det er ikke nødvendig å innføre ytterligere feltvariabler eller metoder i klassene for å besvare oppgavene i oppgavesettet. Det er viktig å holde seg til momenter som er nevnt i oppgaven, og ikke trekke inn andre aspekter. Dersom det er noen deler som du ikke får besvart, kan du likevel fortsette med de øvrige deloppgavene og anta at disse er tilgjengelige. Det er en fordel å kladde algoritmebeskrivelse og/eller diagram for bedre forståelse av program du utvikler. Koden din bør være formatert slik at den er leselig og enkel å forstå. Kontroller parameterverdier der det er hensiktsmessig. I kildekoden kan du anta at alle nødvendige import-setninger er inkludert. Synes du at oppgaveteksten er uklar eller ufullstendig noe sted, må du lage dine egne presiseringer og angi disse i besvarelsen. Prosentsatsene ved hver deloppgave angir omtrentlig vektlegging ved sensur. Lykke til! Fredrik Manne Atle Geitung

Side 2 av 20 Oppgave 1a (7%) Metoden finnminste er en del av et større programsystem og skal finne og skrive ut verdien og plassen til det minste tallet i en tabell med flyttall. Du kan anta at tabell[] er en tabell med double-verdier som er korrekt deklarert og initialisert. Linjenumrene er bare gitt for at det skal være lettere å referere til en linje. De påvirker ikke koden. 1: static void finnminste(double[] tabell) { 2: int N = tabell.length; 3: double minverdi = 0; 4: int minplass = 0; 5: for(int i = 1;i < N; i++) { 6: if (tabell[i] < minverdi) 7: minverdi = tabell[i]; 8: minplass = i; 9: 10: System.out.print("Den minste verdien er tabell["); 11: System.out.println(minPlass + "] = " + minverdi); 12: Beskriv tre feil i koden som enten vil føre til et ukorrekt svar eller til at programmet vil krasje. Skriv maksimalt 10 ord for hver feil. Løsningsforslag: 1. Linje 3: Dersom tabell inneholder negative tall vil disse ikke bli returnert. Kunne byttet linje 3 med: double minverdi = tabell[0]; Da forsvinner neste feil: 2. Linje 5: Løkken begynner på 1 og ikke på 0. 3 (- 4). Linje 7-8: Mangler {... rundt linje 7 og 8. Oppgave1b (8%) Skriv en metode som tar en rektangulær tabell med flyttall og skriver ut summen av verdiene nedenfor hoved-diagonalen. En hver rektangulær tabell har eksakt en hoved-diagonal. I de første tre eksemplene er elementene på hoved-diagonalen merket med D, mens elementene nedenfor hoved-diagonalen er merket med x. Det er disse du skal summere. I det siste eksemplet er tallene vist og svaret for denne tabellen vil være 19.0. Du kan gå ut ifra at tabellen er korrekt definert og initialisert. D o o o D o o o D o o o o o 1.0 2.0 3.0 x D o o x D o o x D o o o o 4.0 5.0 6.0 x x D o x x D o x x D o o o 7.0 8.0 9.0 x x x D x x x D x x x D o o x x x x x x x x

Side 3 av 20 static void sum(double[][] tabell) { // Skriv kode her Løsningsforslag: static void sum(double[][] tabell { int n = tabell.length; int m = tabell[0].length; int minste; if (n < m) minste = n; else minste = m; double sum = 0.0; for(int i=0;i<minste;i++) for(int j=i+1;j<n;j++) sum += tabell[i][j]; System.out.println(sum); Oppgave 1c (8%) Hva blir skrevet ut når dette programmet kjøres? Du trenger ikke å grunngi svaret ditt. public class ShellGame { public static void main(string[] args) { Kopp kopp1 = new Kopp(true); Kopp kopp2 = new Kopp(false); Kopp kopp3 = new Kopp(false); byttom(kopp1,kopp2,kopp3); System.out.println(kopp1.hentErt()); System.out.println(kopp2.hentErt()); System.out.println(kopp3.hentErt()); static void byttom(kopp k1,kopp k2,kopp k3) {

Side 4 av 20 boolean b1 = k1.hentert(); boolean b2 = k2.hentert(); boolean b3 = k3.hentert(); k1.settert(b2); k2.settert(b3); k3.settert(b1); Kopp temp = k1; k1 = k3; k3 = k2; k2 = temp; / klasse for en kopp som kan inneholde en ert / public class Kopp { / Sann dersom koppen inneholder en ert, ellers falsk / boolean harert; Kopp(boolean harert) { this.harert = harert; boolean hentert() { return this.harert; void settert( boolean verdi) { this.harert = verdi; Løsningsforslag: false false true Opplysninger til oppgavene 2, 3 og 4. I de resterende oppgavene skal det skrives metoder for å administrere et reisebyrå som selger billetter (klassen Billett) til togruter (klassen TogRute). For hver togrute har vi et billettsystem (klassen BillettSalg) som organiserer selve salget og holder orden på billettene. En togrute går mellom to stasjoner (klassen Stasjon) og kan stoppe på andre stasjoner underveis. Toget kan ikke snu og går derfor bare i en retning. På hver stasjon gjør toget et opphold for å slippe av og ta på passasjerer. Vi bruker følgende klasser med tilhørende feltvariabler: TogRute: Informasjon om en bestemt togrute. stoppesteder En tabell med samtlige stasjoner langs ruten.

Side 5 av 20 antallstasjoner avgangstid stoppetid antallseter Antall stasjoner langs ruten (inkludert utgangspunkt og endepunkt). Klokkeslettet når toget forlater første stasjon. Hvor lenge toget stopper på hver stasjon (unntatt første og siste stasjon). Antall seter på toget. Stasjon: Informasjon om en bestem stasjon. stasjonsnavn Navnet til stasjonen. reisetid Reisetid til neste stasjon (0 hvis det er siste stasjon). Billett: Informasjon om en billett. frastasjon Navnet på stasjonen som billetten gjelder fra. tilstasjon Navnet på stasjonen som billetten gjelder til. avgangstid Klokkeslettet når toget går fra <frastasjon>. ankomsttid Klokkeslettet når toget ankommer <tilstasjon>. pris Hva billetten koster. tog Hvilken togrute billetten gjelder for. BillettSalg: Informasjon om billettsalg for en bestemt togrute. tog Togruten som det selges billetter for. reserverteplasser En tabell som viser hvor mange plasser som er opptatt mellom hvert par av påfølgende stasjoner. Dvs at reserverteplasser[i] inneholder hvor mange som reiser mellom stasjon i og stasjon i+1. solgtebilletter: En tabell med alle billetter som er solgt. antallsolgtebilletter: Antall billetter som er solgt. Alle tidspunkt representeres som minutter (heltall). Det gjør at vi enkelt kan legge sammen tidspunkt. Det er kun ved utskrift vi konverterer tidspunkt tilbake til timer og minutter. For å gjøre dette bruker vi en hjelpeklasse Tid med to statiske metoder, en for å konvertere timer og minutter til minutter og en som konverterer minutter til en tekststreng på formatet tt:mm. Disse metodene er gitt i oppgaven. Klassen ReiseByraa er gitt helt til slutt i oppgavesettet. Denne klassen inneholder en main-metode som setter opp en togrute fra Bergen til Voss med tilhørende billettsalg. Deretter selges det tre billetter før togruten og billettsalget blir skrevet ut. Det gir følgende utskrift: Tog fra Bergen til Voss med avgang 20:29 og ankomst 21:25. Antall plasser: 12 Rute: Bergen Arna Avgang 20:29, Ankomst 20:39 Arna Dale Avgang 20:42, Ankomst 21:02 Dale Voss Avgang 21:05, Ankomst 21:25

Side 6 av 20 Billettsalg for tog fra Bergen til Voss med avgang klokken 20:29. Antall solgte billetter: 3 Omsetning: 685.0 kroner. Seteutnyttelse: 0.17. I oppgave 2, 3 og 4 skal du nå skrive kode for flere av metodene som brukes. Hva metodene gjør er beskrevet i tilhørende kommentarer. Oppgave 2 Skriv kode for følgende metoder i klassen TogRute: a) (5%) TogRute b) (6%) finnstasjonsindeks c) (7%) finnankomsttid d) (6%) finnavgangstid e) (7%) skrivtogrute Oppgave 3 Skriv kode for følgende metoder i klassen Billett: a) (5%) Billett b) (6%) finnpris Oppgave 4 Skriv kode for følgende metoder i klassen BillettSalg: a) (5%) BillettSalg b) (6%) ledigsete c) (6%) setereservasjon d) (6%) samletomsetning e) (6%) seteutnyttelse f) (6%) skrivbillettsalg

Side 7 av 20 Her følger koden for de ulike klassene. / Klasse for å håndtere tid. Innholder ingen oppgaver./ public class Tid { / Statisk metode for å regne om et tidspunkt gitt som timer og minutter til bare minutter. @param timer antall timer. @param minutter antall minutter. @return tidspunkt gitt som minutter. / public static int tilminutter(int timer,int minutter) { return timer60 + minutter; / Statisk metode for å formatere et tidspunkt gitt i minutter til en tekstreng på formen tt:mm. @param timer antall timer. @param minutter antall minutter. @return tidspunkt angitt som tekststreng på formen tt:mm. / public static String formater(int minutter) { // String.format(streng, liste) oppfører seg akkurat som System.out.printf(streng,liste) // bare at strengen returneres istedenfor å skrives ut til skjermen. return String.format("%02d:%02d",minutter/60, minutter%60);

Side 8 av 20 / Klasse for å representere en togstasjon. Inneholder ingen oppgaver./ public class Stasjon { / Navn på stasjonen. / private String stasjonsnavn; / Reisetid i minutter til neste stoppested, 0 dersom dette er siste stopp. / private int reisetid; / Konstruktør for å opprette en stasjon. @param stasjonsnavn gir navn på stasjonen @param reisetid gir reisetid i minutter til neste stasjon / public Stasjon(String stasjonsnavn, int reisetid) { this.stasjonsnavn = stasjonsnavn; this.reisetid = reisetid; / @return navn til stasjonen. / public String hentnavn() { return stasjonsnavn; / @return reisetid til neste stasjon. / public int hentreisetid() { return reisetid;

Side 9 av 20 / Klasse for å representere en togrute. Inneholder oppgave 2. / public class TogRute{ / Tabell med samtlige stasjoner langs ruten (inkludert første og siste stasjon). Stasjonene ligger i samme rekkefølge som toget vil besøke dem. / private Stasjon[] stoppesteder; / Antall stasjoner langs ruten (inkludert første og siste stasjon). / private int antallstasjoner; / Tidspunktet (i minutter) når toget kjører fra første stasjon. / private int avgangstid; / Antall minutter som toget står på hver stasjon før det kjører videre. / private int stoppetid; / Antall seter på toget (merk vi har ingen ståplasser). / private int antallseter; / Konstruktør for å opprette en togrute. @param avgangstid tidspunktet (i minutter) når toget starter fra første stasjon. @param stoppetid antall minutter toget står på hver stasjon. @param antallseter antall seter på toget. @param stoppesteder tabell med alle stasjoner langs ruten. / public TogRute(int avgangstid,int stoppetid,int antallseter,stasjon[] stoppesteder) { / Oppgave 2a / this.avgangstid = avgangstid; this.stoppetid = stoppetid; this.antallseter = antallseter; this.stoppesteder = stoppesteder; this.antallstasjoner = stoppesteder.length; / @return antall stasjoner. / int hentantallstasjoner() { return antallstasjoner; / @return antall seter. /

Side 10 av 20 int hentantallseter() { return antallseter; / @return avgangstid (i minutter) fra første stasjon. / int hentavgangstid() { return avgangstid; / @return den i'te stasjonen på togruten. Første stasjon er nummer 0. / Stasjon hentstopp(int i) { return stoppesteder[i]; / Gitt navnet på et stoppested, så returneres posisjonen til stoppestedet i stasjonstabellen. Dersom stoppestedet ikke finnes returneres 1. @param navn gir navnet til stasjonen. @return posisjonen til stasjonen. / public int finnstasjonsindeks(string navn){ / Oppgave 2b / for(int i=0;i<antallstasjoner;i++) if (stoppesteder[i].hentnavn().equals(navn)) return i ; return 1 ; / Metode for å bestemme når et tog ankommer en stasjon. Returnerer 1 hvis stasjonen ikke ligger på ruten eller hvis "navn" er første stasjon. @param navn gir navnet på stasjonen. @return tidspunkt (i minutter) for når toget ankommer stasjonen. / public int finnankomsttid(string navn){ / Oppgave 2c /

Side 11 av 20 int indeks = finnstasjonsindeks(navn); if ((indeks == 1) (indeks == 0)) return 1; int ankomst = this.avgangstid; for (int i=0;i<indeks;i++) { ankomst += stoppesteder[i].hentreisetid(); ankomst += (indeks 1) this.stoppetid; return ankomst; / Metode for å bestemme når et tog forlater et stoppested. Returnerer 1 hvis stasjonen ikke finnes på ruten, eller hvis "navn" er siste stasjon på ruten. @param navn gir navnet på stasjonen. @return tidspunkt (i minutter) for når toget forlater stasjonen. / public int finnavgangstid(string navn){ / Oppgave 2d / int indeks = finnstasjonsindeks(navn); if ((indeks == 1) (indeks == antallstasjoner 1)) return 1; if (indeks == 0) return this.avgangstid; return finnankomsttid(navn) + this.stoppetid;

Side 12 av 20 / Utskrifts metode for TogRute. (Se eksemplet som er gitt i oppgavebeskrivelsen) Utskriften skal se ut som følger: Tog fra <første stasjon> til <siste stasjon> med avgang tt:mm og ankomst tt:mm. Antall plasser: <antall plasser>. Rute: <navn til første stasjon> <navn til andre stasjon> Avgang tt:mm, Ankomst tt:mm <navn til andre stasjon> <navn til tredje stasjon> Avgang tt:mm, Ankomst tt:mm... <navn til nest siste stasjon> <navn til siste stasjon> Avgang tt:mm, Ankomst tt:mm / public void skrivtogrute() { / Oppgave 2e / String start = stoppesteder[0].hentnavn(); String stopp = stoppesteder[antallstasjoner 1].hentNavn(); String str = "Tog fra " + start + " til " + stopp; str += " med avgang " + Tid.formater(avgangsTid) + " og ankomst "; str += Tid.formater(finnAnkomstTid(stopp)) + ".\n"; str += "Antall plasser: " + antallseter + "\n"; str += "Rute: \n"; for(int i=0;i<antallstasjoner 1;i++) { String fra = stoppesteder[i].hentnavn(); String til = stoppesteder[i+1].hentnavn(); str += fra + " " + til + "\n"; str += "Avgang " + Tid.formater(finnAvgangsTid(fra)) + ", "; str += "Ankomst " + Tid.formater(finnAnkomstTid(til)) + "\n"; System.out.println(str);

Side 13 av 20 / Klasse for å representere en togbillett. Inneholder oppgave 3. / public class Billett { / Fra hvilken stasjon billetten gjelder / private String frastasjon; / Til hvilken stasjon billetten gjelder / private String tilstasjon; / Avreisetidspunkt / private int avgangstid; / Ankomsttidspunkt / private int ankomsttid; / Prisen til billetten / private double pris; / Togruten som billetten gjelder for / private TogRute tog; / Konstruktør for å opprette en billett. @param frastasjon stasjonen som billetten gjelder fra. @param tilstasjon stasjonen som billetten gjelder til. @param tog togruten som billetten gjelder for. / public Billett(String frastasjon, String tilstasjon, TogRute tog){ / Oppgave 3a / this.frastasjon = frastasjon; this.tilstasjon = tilstasjon; this.tog = tog; this.avgangstid = tog.finnavgangstid(frastasjon); this.ankomsttid = tog.finnankomsttid(tilstasjon); this.pris = finnpris();

Side 14 av 20 / @return pris til billetten. / public double hentpris() { return pris; / Metode for å bestemme pris på en billett. Du kan anta at feltvariablene "frastasjon" og "tilstasjon" angir lovlige stasjoner slik at "frastasjon" kommer før "tilstasjon". Startprisen for en billett er 30 kroner. Dessuten betaler man 5 kroner for hvert minutt reisen varer. @return prisen på billetten. / private double finnpris() { / Oppgave 3b / return 30.0 + (this.ankomsttid this.avgangstid)5.0;

Side 15 av 20 / Klasse for å organisere billettsalget til en togrute. Inneholder oppgave 4./ public class BillettSalg{ / Det maksimale antallet billetter som kan selges for en togrute. / final private static int MAX_BILLETTER = 500; / Togruten som det selges billetter til. / private TogRute tog; / Antall opptatte plasser mellom to påfølgende stasjoner. reserverteplasser[i] gir antall opptatte plasser mellom stasjon i og stasjon i+1. / private int[] reserverteplasser; / Tabell med alle solgte billetter. / private Billett[] solgtebilletter; / Samlet antall solgte billetter. / private int antallsolgtebilletter; / Konstruktør for å opprette et billettsalg. @param tog togruten som det selges billetter for. / public BillettSalg(TogRute tog) { / Oppgave 4a / this.tog = tog; int antallstasjoner= tog.hentantallstasjoner(); this.reserverteplasser = new int[antallstasjoner 1]; this.antallsolgtebilletter = 0; this.solgtebilletter = new Billett[MAX_BILLETTER];

Side 16 av 20 / Metode for å bestemme om det finnes en sitteplass mellom to stasjoner gitt ved sine indekser langs togruten. Returnerer sann dersom det finnes plass, ellers usann. Du kan anta at "fraindeks" og "tilindeks" er gyldige verdier. @param fraindeks indeks til stasjonen det reises fra. @param tilindeks indeks tilstasjonen det reises til. @return sant om det finnes ledig plass, ellers falsk. / public boolean ledigsete(int fraindeks, int tilindeks) { / Oppgave 4b / for(int i=fraindeks;i<tilindeks;i++) if (reserverteplasser[i] >= tog.hentantallseter()) return false; return true; / Metode for å reservere et sete og få returnert en billett for ønsket reise dersom den er mulig å gjennomføre. Billetten lagres også i billett tabellen. Dersom reisen ikke lar seg gjennomføres skrives det ut en passende feilmelding og det returneres en null referanse. @param fra stasjonen som det ønskes en billett fra. @param til stasjonen som det ønskes en billett til. @return billett for reisen, eventuelt null dersom reisen ikke lar seg gjennomføre. / public Billett setereservasjon(string fra,string til){ / Oppgave 4c / int f = tog.finnstasjonsindeks(fra);

Side 17 av 20 int t = tog.finnstasjonsindeks(til); if ((t<=f) (f == 1) (t == 1)) { System.out.println("Reisen lar seg ikke gjennomføre. \n"); return null; if (antallsolgtebilletter >= MAX_BILLETTER ) { System.out.println("Kan ikke selge flere billetter! Billetsystemet er fullt."); return null; if (ledigsete(f,t)) { for(int i=f;i<t;i++) reserverteplasser[i]++; else { System.out.println("Det er ikke plass på toget. \n"); return null; Billett b = new Billett(fra,til,tog); solgtebilletter[antallsolgtebilletter++] = b; return b; / Metode for å beregne samlet omsetning i kroner basert på billetter solgt så langt. @return samlet omsetning. / public double samletomsetning() { / Oppgave 4d / double omsetning = 0.0; for(int i=0;i<this.antallsolgtebilletter;i++) { omsetning += solgtebilletter[i].hentpris(); return omsetning;

Side 18 av 20 / Metode for å beregne seteutnyttelse. Seteutnyttelsen mellom to påfølgende stasjoner er antall reserverte seter for denne strekningen delt på totalt antall seter. Dvs at dersom det finnes 100 seter på toget og det er reservert 25 seter mellom stasjon i og stasjon i+1 så er seteutnyttelsen for denne strekningen 25/100 = 0.25. Metoden skal beregne og returnere gjennomsnittlig seteutnyttelse for alle par av stasjoner som kommer direkte etter hverandre. @return gjennomsnittlig seteutnyttelse. / public double seteutnyttelse() { / Oppgave 4e / int antallstasjoner = tog.hentantallstasjoner(); double sum = 0.0; for(int i=0;i<antallstasjoner 1;i++) { sum += (double) reserverteplasser[i]/tog.hentantallseter(); return sum/(antallstasjoner 1); / Utskrifts metode for BillettSalg. (Se eksemplet som er gitt i oppgavebeskrivelsen) Utskriften skal se ut som følger: Billettsalg for strekning <første stasjon> til <siste stasjon>. Antall solgte billetter: <antall solgte billetter>. Samlet omsetning: <omsetning> kroner. Seteutnyttelse: <seteutnyttelse>. / public void skrivbillettsalg() { / Oppgave 4f /

Side 19 av 20 int antallstasjoner = tog.hentantallstasjoner(); String str = "Billettsalg for tog fra " + tog.hentstopp(0).hentnavn(); str += " til " + tog.hentstopp(antallstasjoner 1).hentNavn(); str += " med avgang klokken " + Tid.formater(tog.hentAvgangsTid()) + ".\n"; str += "Antall solgte billetter: " + antallsolgtebilletter + ".\n"; str += "Omsetning: " + samletomsetning() + " kroner.\n"; str += "Seteutnyttelse: " + String.format("%.2f",seteUtnyttelse()) + ".\n"; System.out.println(str); / Klasse for å håndtere setereservasjon på et tog. Inneholder ingen oppgaver. / public class ReiseByraa { public static void main(string[] args) { Stasjon[] BergenVoss = new Stasjon[4]; BergenVoss[0] = new Stasjon("Bergen",10); BergenVoss[1] = new Stasjon("Arna",20); BergenVoss[2] = new Stasjon("Dale",20); BergenVoss[3] = new Stasjon("Voss",0); TogRute BV = new TogRute(Tid.tilMinutter(20,29),3,12,BergenVoss); BillettSalg billetterbv = new BillettSalg(BV); Billett b1 = billetterbv.setereservasjon("bergen","voss"); Billett b2 = billetterbv.setereservasjon("arna","voss"); Billett b3 = billetterbv.setereservasjon("arna","dale"); BV.skrivTogRute(); System.out.println(); billetterbv.skrivbillettsalg();

Side 20 av 20