Les gjennom hele oppgavesettet før du begynner å besvare deloppgavene.
Calendar, som ligger i pakken
java.util. Instruksjonen
Calendar nå = Calendar.getInstance();
oppretter et Calendar-objekt som representerer
tidspunktet for når instruksjonen blir utført. Dersom vi har to
Calendar-objekter
tid1 og
tid2, så vil instruksjonen
long avstand = Math.abs( tid1.getTime().getTime() - tid2.getTime().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 Calendar-objekter for utskrift.
Dersom for eksempel Calendar-objektet
tidspunkt ble opprettet den 4. februar 2014
klokka 09.07, vil instruksjonene
DateFormat df = DateFormat.getInstance();
String utskrift = df.format( tidspunkt.getTime() );
gi tekststrengen "04.02.14 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):
bilnr //bilens registreringsnummer starttid //starttidspunkt for parkeringen
(Hint: Bruk Calendar-klassen)plass //nummeret for parkeringsplassen til bilen KORTTID og LANGTID som skal tildeles heltallsverdiene 1 og 2.bilnr, starttid og plass
toString()-metode om returnerer en tekst som inneholder 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.)public abstract String kvittering( Calendar d );public abstract double getPris();public abstract double avgift( Calendar d );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
public static final int MAXTID = 24; //Maksimal tillatte parkeringstid
< Konstruktør med parametere som foretar nødvendig initialisering av datafeltene. >
< get-metode for timepris >
public int antallTimer(Calendar sluttTid)
{
< Metoden skal returnere antall påbegynte timer fra det tidspunktet
bilen ble parkert til utkjøringstidspunktet angitt av parameteren
sluttTid. (Hint! Se eksamensoppgavens innledning.) >
}
public double parkeringsBot(Calendar d)
{
< 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. >
}
public double avgift(Calendar d) {...}
{
< Metoden skal returnere den parkeringsavgift som skal betales
fra parkeringen begynte til tidspunktet som parameteren
d angir, inklusiv eventuell parkeringsbot. >
}
public String kvittering(Calendar sluttTid) {...}
{
< 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. >
}
} // end of class KorttidsParkering
a) Programmer klassens konstruktør og metodene
public int antallTimer(Calendar sluttTid) {...} public double parkeringsBot(Calendar d) {...}public double avgift(Calendar d) {...}public String kvittering(Calendar sluttTid) {...}LangtidsParkering. Du skal IKKE
programmere denne klassen, men trenger å kjenne til den. Klassens metodene har samme
virkning som de tilsvarende metodene i oppgave 2.
public class LangtidsParkering extends Parkering
{
private static double døgnpris = 100;
private static double parkerinsBot = 1000;
private static final int MAXTID = -1;
< konstruktør >
< get-metoder >
public int antallDager(Calendar sluttTid) { ... }
public double parkeringsBot( Calendar d) { ... }
public String kvittering(Calendar sluttTid) {...}
} // end of class LangtidsParkering
********************************************************************************
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 indeksene i arrayen).
public class ParkeringsHus
{
private Parkering [] plasser = new Parkering[MAX];
public static final int MAX = 200;
private double inntjening;
public Parkering parker(String bilnr, int type)
{
< Et kall på denne metoden registrerer en parkering. Parameteren
bilnr inneholder registreringsnummeret til en bil, mens
parameteren type angir hvilken type parkering det gjelder.
(Hint! Se konstantene i klassen Parkering.) Hvis det er ledig
plass skal metoden foreta parkering av den type som ønskes og
returnere en referanse (peker) til objektet som inneholder data
om parkeringen. Hvis ikke det er ledig plass skal metoden
returnere null. >
}
public int plassnr( String bilnr )
{
< Metoden skal returnere nummeret til parkeringsplassen som bil med
registreringsnummer lik parameteren bilnr er parkert på. Metoden
skal returnere 0 i tilfelle bilen ikke finnes i parkeringshuset. >
}
public String bilInfo( String bilnr )
{
< Ut fra bilens bilnr, som parameteren angir, skal metoden returnere
info om bilens nummer, hvilken plass den står på og når den ble
parkert, under forutsetning av at den finnes i parkeringshuset.
I motsatt fall skal metoden returnere null. >
}
public double avgift(String bilnr, Calendar d)
{
< Returverdien til metoden over skal fortelle hvor mye bilen med
gitt registreringsnummer må betale i avgift fram til tidspunktet
gitt ved parameteren d. Returverdi 0.0 skal indikere at bilen
ikke finnes i parkeringshuset. >
}
public String hentBil(String bilnr, Calendar d )
{
< Parameteren bilnr inneholder registreringsnummeret til en bil
og parameteren d er tidspunktet for når denne blir hentet fra
parkeringshuset. Metoden skal sørge for at plassen som bilen
stod på nå blir ledig. Den skal også registrere at beløpet i
parkeringsautomaten blir økt med den avgiften som blir betalt
for denne parkeringen. Den returnerte teksten skal inneholde
kvittering for parkeringen, dvs. type parkering, bilens nummer,
plass, tidspunkter for inn- og utkjøring, samt parkeringsavgift.
Dersom bilen ikke finnes i parkeringshuset, skal metoden isteden
returnere melding om dette. >
}
public Parkering[] bortTauing( Calendar d )
{
< Metoden skal returnere en array av Parkering-objekter
tilsvarende de bilene som har overskredet maksimal
parkeringstid på det tidspunkt parameteren d angir.
NB! Denne metoden skal ikke slette objektene fra systemet. >
}
public void fjernBilene(Parkering[] fjernes)
{
< Metoden skal sørge for at bilene som rent fysisk er tauet bort også
blir fjernet fra datasystemet. Arrayen som metoden mottar som parameter
inneholder informasjon om disse og metoden skal frigjøre (stille ledig)
de tilhørende parkeringsplassene. >
}
public double inntjeningsInfo()
{
< Metoden skal returnere inntjeningen, dvs. parkeringsinntektene. >
}
} // end of class ParkeringsHus
a) Programmer metoden public Parkering parker(String bilnr, int type) {...}
b) Programmere følgende tre metoder:
public int plassnr(String bilnr) {...}
public String bilInfo(String bilnr) {...}
public double avgift(String bilnr, Calendar d) {...}
public String hentBil(String bilnr, Calendar 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:
d) Programmer metoden public Parkering[] bortTauing( Calendar d ) {...}.public void fjernBilene(Parkering[] fjernes) {...}public double inntjeningsInfo() {...}
Parkeringsautomatens display 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;
< Oppretter lytteobjektet. >
< Knytter knappene til lytteobjektet. >
< Setter opp brukergrensesnittet. >
}
public void parkerBil(int type)
{
< Metoden skal lese inn den informasjon som er nødvendig
for å registrere en parkering i parkeringshuset. Parameteren
type angir hva slags parkering det dreier seg om (Hint! Se
konstantene i klassen Parkering.) Dersom det er en ledig plass,
skal det i displayet skrives ut opplysninger om hvilken plass
det skal parkeres på (plassnummeret), hvor lenge bilen maksimalt
kan stå der, samt pris pr. time eller døgn. I tilfelle parkeringshuset
er fullt, skal det i displayet skrives ut melding om dette. >
}
public void hentBil()
{
< Metoden må registrere tidspunktet for når bilen blir hentet,
samt lese inn annen nødvendig informasjon for å kunne registrere
at bilen nå forlater parkeringshuset. I tekstfeltet for avgift skal
det skrives ut hvor mye som skal betales i parkeringsavgift.
I displayet skal det skrives ut en kvittering, dvs. opplysninger
om type parkering, bilens nummer, plass, tidspunkter for inn- og
utkjøring, samt parkeringsavgift. Dersom bilen mot formodning
ikke finnes i parkeringshuset, skal det skrives en melding i displayet
om dette. >
}
} // end of class ParkeringsAutomat
a) Programmer metoden public void parkerBil(int type) {...}.public void hentBil() {...}Nedenfor ser du bilde av et vindu som er beregnet for parkeringshusets driftspersonale.
Vinduet er definert av klassen
ParkeringsDrift.
NB! 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 inntjening, 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;
< Oppretter lytteobjektet. >
< Knytter knappene til lytteobjektet. >
< Setter opp brukergrensesnittet. >
}
public void bortTauingsListe()
{
< Metoden skal skrive ut en liste i tekstområdet display
over bilene som har stått for lenge på det tidspunktet
denne metoden blir kalt. For hver bil skal det skrives ut
bilnummer, plassen den står på og når den ble parkert der.
Dersom ingen biler har stått for lenge, skrives melding om
dette isteden. >
}
public void slettBiler()
{
< Metoden skal sørge for at parkeringsplassene for bilene i arrayen
tilBortTauing nå blir ledige. Arrayen skal så settes til null.
En passende melding skal skrives i displayet. >
}
< Metoder du IKKE skal programmere. >
} // end of class ParkeringsDrift
a) Programmer metoden public void bortTauingsListe() { ... }.public void slettBiler() {...}.
***************************************************************************
Til orientering ser du klassen som inneholder main-metoden. (import-setningene er ikke tatt med.)
Du skal ikke svare på noen spørsmål i tilknytning til denne.
public class ParkeringsSystem
{
public static void main(String args[])
{
ParkeringsHus hus = new ParkeringsHus();
ParkeringsAutomat pAutomat = new ParkeringsAutomat(hus);
ParkeringsDrift pDrift = new ParkeringsDrift(hus);
pDrift.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
pAutomat.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}