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.

PARKERINGSHUS

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".


Oppgave 1

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.


Oppgave 2

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.


Oppgave 3

Hver langtidsparkering skal være representert som et objekt av klassen LangtidsParkering. Til forskjell fra KorttidsParkering har LangtidsParkering

Istedenfor metoden antallTimer skal LangtidsParkering ha metoden

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.


Oppgave 4

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

Et kall på denne metoden registrerer en parkering. Parameteren bilnr inneholder registreringsnummeret til en bil, mens parameteren type angir hvilken type parkering som ønskes: 1 for korttidsparkering og 2 for langtidsparkering. 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.

b)
Under denne deloppgaven skal du programmere følgende tre metoder:

som skal returnere nummeret til parkeringsplassen som bil med registreringsnummer lik parameteren bilnr er parkert på. Den skal returne 0 i tilfelle denne ikke finnes. Utfra 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.

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.

c)
Programmer metoden

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.

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

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.

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

Et kall på denne metoden skal frigjøre (stille ledig) alle parkeringsplasser som var opptatt av bilene som her er representert ved parameteren fjernes.

Til slutt i denne oppgaven skal du simulere en tømming av parkeringsautomaten ved å programmere metoden

I tillegg til å nullstille parkeringsautomatens beholdning, skal metoden også returnere det beløpet som nå blir hentet fra automaten.


Oppgave 5

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:

Programmer denne metoden. 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 (1 for korttidsparkering, 2 for langtidsparkering). 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.

b)
Du skal nå programmere metoden som blir kalt opp når bilisten klikker på knappen "Utkjøring":

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.


Oppgave 6

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:

Programmer denne metoden. 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.

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

Denne skal sørge for at parkeringsplassene for bilene i arrayen tilBortTauing nå blir ledige og at tilBortTauing nå settes til null. Passende meldinger skal skrives i displayet.


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