Fag: Programmering |
Fagnr: LO 125 A |
Faglig ansvarlige: Eva Vihovde og Kjetil Grønning | ||
Ant. sider: 9 | Ant. oppgaver: 6 |
Ant. vedlegg: 0 | Dato: 13.12.2001 |
Eksamenstid: 09.00 - 14.00 |
Tillatte hjelpemiddel: Alle trykte og håndskrevne |
Kandidaten må selv kontrollere at oppgavesettet er fullstendig. Innføring skal være med blå eller svart penn. |
Les gjennom hele oppgavesettet før du begynner å besvare deloppgavene.
I denne eksamensoppgaven skal du lage deler av et java-program som simulerer
bruk og drift av et parkeringshus. Programmet skal inneholde en modul som simulerer
parkeringsautomaten og som følgelig skal brukes av bilistene, og en modul som er
beregnet for parkeringshusets driftspersonale.
Av hensyn til oppgavens størrelse har vi utelatt en del funksjonalitet som det
ellers ville vært ønskelig å hatt med i et slikt program.
De enkelte oppgavene inneholder nærmere informasjon.
Tidspunkter kan i oppgaven representeres som objekter av typen Date, som ligger i pakken java.util. Instruksjonen
Date nå = new Date();oppretter et Date-objekt som representerer tidspunktet for når instruksjonen blir utført. Dersom vi har to Date-objekter tid1 og tid2, så vil instruksjonen
long varighet = tid2.getTime() - tid1.getTime();gi tidsavstanden i antall millisekund mellom de to tidspunktene. (Det er 3 600 000 millisekund i en time.)
Klassen DateFormat, som ligger i pakken java.text, kan brukes til å formatere Date-objekter for utskrift. Dersom for eksempel Date-objektet tidspunkt ble opprettet den 13. desember 2001 klokka 09.07, vil instruksjonene
DateFormat df = DateFormat.getInstance(); String utskrift = df.format( tidspunkt );gi tekststrengen "13.12.01 09:07".
Hver parkering skal registreres som et objekt av en av klassene
KorttidsParkering eller
LangtidsParkering, avhengig av hvilken type
parkering det gjelder. Siden det er en del ting som er felles ved begge
parkeringstyper, skal du i denne oppgaven lage en abstrakt klasse
Parkering som
samler de data og metoder som er felles for de to parkeringstypene.
Klassen skal ha følgende instansvariable (data-felter):
Klassen skal ha en konstruktør med parametre inneholdende den informasjon som er nødvendig for å initialisere instansvariablene (datafeltene).
Dessuten skal klassen ha to aksess-metoder (get-metoder) som returnerer
verdiene til henholdsvis bilnr og
plass.
I tillegg skal klassen ha en toString-metode:
som returnerer en tekst inneholdende bilens
nummer, hvilken plass den står
parkert på og tidspunktet for når den ble parkert der. (Formater tidspunktet
som beskrevet i eksamensoppgavens innledning.)
Resten av klassens metoder skal være abstrakte, og skal følgelig implementeres
senere:
a) Programmer klassen
Parkering.
Som tidligere nevnt, kan det velges mellom korttidsparkering, som har timepris, og langtidsparkering, som har døgnpris. Hver korttidsparkering skal registreres som et objekt av klassen KorttidsParkering. Her er en skisse for denne klassen:
public class KorttidsParkering extends Parkering { private static double timepris = 10; //Pris pr. påbegynt time. private static double parkeringsbot = 500; //Skal betales dersom maksimal //parkeringstid overskrides. private static final int MAXTID = 24; //Maksimal parkeringstid før det //blir parkeringsbot og eventuelt //borttauing. <konstruktør> <metoder> }
Konstruktør og metoder nevnt i følgende delspørsmål gjelder for klassen KorttidsParkering.
a)
Programmer en konstruktør med parametre for nødvendig initialisering av instansvariablene
(datafeltene).
Du skal også programmere aksess-metoder (get-metoder) for henholdsvis
MAXTID og timepris.
b)
Programmer metoden
Metoden skal returnere antall påbegynte timer fra det tidspunktet bilen ble parkert til utkjøringstidspunktet angitt av parameteren sluttTid. (Se eksamensoppgavens innledning angående Date-klassen.)
Videre skal du programmere metoden
Metoden sjekker om parkering fram til det tidspunktet parameteren
d angir
overskrider maksimal parkeringstid. Den returnerer i så fall den
parkeringsboten som dette
medfører. I motsatt fall skal metoden returnere 0.0.
c)
Programmer metoden
Metoden skal returnerne den parkeringsavgift som skal betales fra parkeringen begynte til tidspunktet som parameteren d angir, inklusiv eventuell parkeringsbot.
Programmer også metoden
Metoden skal returnere en tekst som inneholder
opplysninger om hvilken type parkering dette gjelder, bilens nummer,
hvilken plass den står på,
når den ble parkert, når bilen ble hentet (gitt ved
parameteren sluttTid) og
parkeringsavgiften som skal betales.
Hver langtidsparkering skal være representert som et objekt av klassen LangtidsParkering. Til forskjell fra KorttidsParkering har LangtidsParkering
som returner antall påbegynte døgn fra parkeringen begynte til tidspunktet gitt ved parameteren sluttTid.
For øvrig skal denne klassen ha de samme metoder som KorttidsParkering
a)
Skriv klassen LangtidsParkering.
Klassen skal inneholde variable (datafelter), konstruktør og metoder.
Det er imidlertid kun
metoden antallDager du skal
programmere. Konstruktøren og de andre metodene blir temmelig like de du allerede har programmert
i klassen KorttidsParkering. Derfor
holder det at du skriver disse
på tilsvarende måte som
antallDager i teksten over.
Du kan imidlertid
fritt gjøre kall på disse metodene og anta at de
virker slik de er tiltenkt.
Klassen ParkeringsHus som er skissert på neste side representerer et parkeringshus med et gitt antall parkeringsplasser. Arrayen plasser representerer disse. Hvis plasser[i] == null betyr det at plassen er ledig. I motsatt fall står det en bil på plassen, dvs. plasser[i] refererer da enten til et objekt av klassen KorttidsParkering eller til et objekt av klassen LangtidsParkering. NB! Parkeringsplassene er nummerert fra 1 og oppover (til forskjell fra arrayen).
public class ParkeringsHus { private static final int MAX = 200; //Antall parkeringsplasser. private Parkering[] plasser = new Parkering[ MAX ]; //Inneholder data om de parkerte bilene. private double beholdning = 0; //Simulerer beløpet i parkeringsautomaten. <metoder> }
Metodene i de følgende delspørsmål skal tilhøre klassen ParkeringsHus.
a)
Programmer metoden
b)
Under denne deloppgaven skal du programmere følgende tre metoder:
c)
Programmer metoden
d)
Biler som ikke hentes i tide vil med jevne mellomrom bli tauet bort.
Driftspersonalet trenger i denne forbindelse en oversikt over hvilke biler
dette gjelder. Til dette formål skal du programmere metoden
e)
Når bilene rent fysisk er tauet bort, må driftspersonalet også fjerne de tilsvarende
Parkerings-objektene fra datasystemet. For å muliggjøre dette skal du programmere metoden
Til slutt i denne oppgaven skal du simulere en tømming av parkeringsautomaten ved å programmere metoden
Parkeringsautomatens brukerdisplay er vist på bildet til høyre.
På bildet ser vi displayet etter at en korttidsparkering er registrert.
Det viste vinduet er
definert av klassen ParkeringsAutomat som
er skissert nedenfor og videre på neste side.
public class ParkeringsAutomat extends JFrame { private JTextField bil, betaling; private JButton lParkering,kParkering, utkjøring; private JTextArea display; private ParkeringsHus pHus; public ParkeringsAutomat(ParkeringsHus hus) { super("PARKERINGSAUTOMAT"); pHus = hus; kParkering = new JButton("Korttids Parkering"); kParkering.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { parkerBil(1); } }); lParkering = new JButton("Langtids Parkering"); lParkering.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { parkerBil(2); } }); utkjøring = new JButton("Utkjøring"); utkjøring.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { hentBil(); } }); <Oppretter øvrige komponenter og legger ut skjermbilde.> show(); } <metoder> }
Metodene i de følgende delspørsmål skal tilhøre klassen ParkeringsAutomat.
a)
Når bilisten klikker på KorttidsParkerings- eller LangtidsParkeringsknappen blir
følgende metode kalt:
b)
Du skal nå programmere metoden som blir kalt opp når bilisten klikker på knappen
"Utkjøring":
På neste side kan du se bilde av et vindu som er beregnet for parkeringshusets driftspersonale.
Vinduet er definert av klassen ParkeringsDrift som er skissert nedenfor. Legg merke til at konstruktøren mottar et objekt av typen ParkeringsHus. Dette vil være det samme objektet som konstruktøren i klassen ParkeringsAutomat mottar i oppgave 5. Merk deg også arrayen tilBortTauing som skal holde rede på hvilke biler som skal taues bort.
public class ParkeringsDrift extends JFrame { private JTextField bil, saldo; private JButton tøm, slett, finn, bort; private JTextArea display; private ParkeringsHus pHus; private Parkering[] tilBortTauing = null; //liste over biler som //skal taues bort pga. //overskredet parkeringstid. public ParkeringsDrift(ParkeringsHus hus) { super( "DRIFT AV P-HUS"); pHus = hus; bort = new JButton("Til Borttauing"); bort.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { bortTauingsListe(); } }); slett = new JButton("Fjern biler fra data-registeret"); slett.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { slettBiler(); } }); <Oppretter øvrige komponenter, legger ut skjermbilde og foretar annen nødvendig initialisering> show(); } <metoder, se neste side> }
Av hensyn til oppgavens størrelse har vi her plukket ut kun to av metodene som blir kalt opp når det klikkes på knappene i vinduet.
a)
For å kunne taue bort biler som har stått for lenge, ønsker driftspersonalet
å få skrevet ut en liste over hvilke biler dette gjelder.
Når det klikkes på knappen "Til Borttauing" skal følgende metode kalles opp:
b)
Når bilene rent fysisk er tauet bort, skal et klikk på knappen "Fjern biler fra data-registeret" sørge for at nettopp dette skjer. Programmer derfor metoden
Følgende klasse er bare tatt med i eksamensoppgaven som en orientering om hva som brukes i tillegg for å få et kjørbart program. Du skal ikke svare på noen spørsmål i tilknytning til denne. (Nødvendige import-instruksjoner er ikke tatt med.)
public class ParkeringsSystem { public static void main(String args[]) { ParkeringsHus hus = new ParkeringsHus(); ParkeringsAutomat pAutomat = new ParkeringsAutomat(hus); pAutomat.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent c) { System.exit(0); } }); ParkeringsDrift pDrift = new ParkeringsDrift(hus); pDrift.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent c) { System.exit(0); } }); } }