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

PARKERINGSHUS

Tenk deg følgende situasjon: Du har fått i oppgave å lage et program som styrer driften av et parkeringshus i tilknytning til en av våre flyplasser. Parkeringshuset skal kunne tilby både korttidsparkering og langtidsparkering. Av sikkerhetsmessige årsaker ønsker oppdragsgiveren å ha oversikt over alle biler som er parkert og hvilken plass hver enkelt står på. Foruten registrering av innkjøring og utkjøring skal systemet beregne hva hver enkelt parkeringen koster, gjenfinne en bil utfra dens registreringsnummer, skrive ut en liste over uavhentede biler som skal taues bort og for så å fjerne disse bilen fra datasystemet, samt beregne anleggets parkeringsinntekter.
Programmet er delt i to en moduler, en som simulerer parkeringsautomaten og som følgelig skal brukes av bilistene, og en modul som er beregnet for parkeringshusets driftspersonale. Begge modulene skal imidlertid bruke samme datastruktur. 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 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".





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 følgende konkrete metoder:

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

b) Programmer metodene

******************************************************************************** Nedefor ser du en skisse av klassen 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 
********************************************************************************

Oppgave 3

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:

c) Programmer metoden 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 ) {...}.

e) Programmer metodene:

Oppgave 4

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) {...}.
Metoden blir kalt når bilisten klikker på KorttidsParkerings- eller LangtidsParkeringsknappen.

b) Programmer metoden public void hentBil() {...}
Metoden blir kalt opp når bilisten klikker på knappen "Utkjøring".


Oppgave 5

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() { ... }.

b) Programmer metoden 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 );
  }
}