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


PARKERINGSHUS


I denne eksamensoppgaven skal du lage et java-program som simulerer bruken av et parkeringshus. Du kan forestille deg at parkeringshuset ligger i underetasjen i et stort bolighus med mange beboere i sentrum av Oslo. Husets beboere kan parkere der gratis, under forutsetning av at de disponerer en gyldig kode. Andre bilister kan imidlertid også benytte parkeringhuset, men da mot betaling. Gyldig kontonummer skrives inn ved innkjøring og kontoen blir belastet med parkeringsgebyret ved utkjøring.

Programmet består av klassene KodeGenerator, Parkering, BeboerParkering, KundeParkering, ParkeringsHus, InnkjøringsVindu, UtkjøringsVindu og ParkeringsSystem. Ta en titt på vinduene for innkjøring og utkjøring i oppgave 4 og 5 før du går i gang. 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.

I oppgave 1 b) skal du generere tilfeldige tall. Der kan du bruke klassen Random som ligger i pakken java.util. Ved å skrive

  Random generator = new Random();
  int slumpverdi = 1 + generator.nextInt( 100);

vil slumpverdi bli tilordnet en verdi fra intervallet fra og med 1 til og med 100, dvs. fra 1, 2, 3,...,99, 100. ( NB! I oppgaven skal du trekke tall fra et annet intervall! )


OPPGAVE 1

Nedenfor ser du en skisse av klassen KodeGenerator. Gyldige koder, som beboerne kan bruke ved innkjøring i parkeringshuset, vil ligge lagret i arrayen kodeArray.

import java.util.Random;

public class KodeGenerator
{
  private int[] kodeArray;
  private Random r = new Random();

  public KodeGenerator(int antall)
  {
    kodeArray = new int[antall];
    genererKoder();
  }
  //  Klassen KodeGenerator fortsetter på neste side. 

  private boolean finnes(int n, int antall)
  {
    < Hvis parameteren n  finnes i arrayen kodeArray skal metoden returnere true.
      I motsatt fall skal den returnere false. Søkingen skal imidlertid begrenses
      av parameteren antall, dvs det er KUN elementene i arrayen fra om med indeks 0
      opp til indeks antall som skal undersøkes. >
  }

  private void genererKoder()
  {
    < Metoden kan fylle arrayen med tilfeldige tall fra intervallet fra og med 1000
      til og med 9999. Alle tallene skal være forskjellige. >
  }

  public boolean gyldig(int n)
  {
    < Hvis parameteren n finnes i arrayen kodeArray skal metoden
      returnere true. I motsatt fall skal den returnere false.  >
  }

  <  Andre metoder som du IKKE skal programmere.  >

} // end of class KodeGenerator

a) Programmer metoden private boolean finnes(int n, int antall).

b) Programmer metoden private void genererKoder().

c) Programmer metoden public boolean gyldig(int n).



*********************************************************************************************



Nedenfor ser du klassen Parkering. Som du ser er den ferdig programmert. Klassen vil fungere som en direkte superklasse til subklassene BeboerParkering og KundeParkering. Du bør merke deg hva den inneholder da du vil få bruk for den i de senere oppgavene.

import java.util.Date;
import java.text.DateFormat;

public abstract class Parkering
{
  private Date startTid;

  public Parkering()
  {
    startTid = new Date();
  }

  public Date getStartTid()
  {
    return  startTid;
  }

  public String toString()
  {
    DateFormat df = DateFormat.getInstance();
    return "Inn:  " + df.format(startTid);
  }

  public abstract boolean kontroll();
  public abstract String kvittering(Date d);

}  // end of class Parkering



OPPGAVE 2

Den abstrakte klassen Parkering har to subklasser, BeboerParkering og KundeParkering. I denne oppgaven skal du programmere klassen BeboerParkering. Klassen skal være en subklasse til Parkering og skal ha to datafelt, i tillegg til det som er arvet fra Parkering.

a) Her skal du gjøre tre ting:
Definer klassens første linje, dvs frem til første {.
Deklarer klassens datafelt med riktig aksesstype.
Programmer klassens konstruktør med to parametere: En kode som mottas i form av et String-objekt, og et KodeGenerator-objekt.

b) Her skal du gjøre to ting:
Programmer en get-motode for datafeltet kode.
Programmer metoden public boolean kontroll(). Metoden skal returnere true, hvis datafeltet kode representerer en gyldig kode. I motsatt fall skal den returnere false.

c) Programmer metoden public String kvittering(Date sluttTid).
Hvis beboreren kjørte inn 27.11.09 klokken 20:02 og ut 27.11.09 klokken 22:02 (dette tidspunket har vi fra parameteren sluttTid) skal metoden skal returnere følgende tekst:

Beboerparkering:
Inn:  27.11.09 20:02  Ut: 27.11.09 22:02  Avgift: 0,00
*********************************************************************************************

Nedenfor ser du en skisse av klassen KundeParkering. Du skal IKKE programmere denne klassen, men du trenger å kjenne til noen av dens datafelt og metoder.

public class KundeParkering < arver Parkering >
{
  public static final int TIMEPRIS = 15;
  private long kontoNr;

  < Konstruktør. >

  < get-metode for kontoNr. >

  public boolean kontroll()
  {
    < Metoden sjekker om kontoNr er et gyldig kontonummer, at kontoen er ikke er sperret,
      og om det er god nok dekning på kontoen. NB! Metoden skal IKKE programmeres! >
  }

  public String kvittering(Date sluttTid)
  {
    < Metoden returnerer en kvittering i form av en tekst. Hvis kunden, med kontoNr
      67401234567, kjørte inn 27.11.09 klokken 20:02 og ut 27.11.09 klokken  22:02
      (dette tidspunket har vi fra parameteren sluttTid) returnerer metoden
      følgende tekst:

      Kundeparkering:
      Inn:  27.11.09 20:02  Ut: 27.11.09 22:02
      kr. 15,00 belastes kontonr. 67401234567

      NB! Metoden skal IKKE programmeres! >
  }

  < Andre metoder du ikke trenger å kjenne til. >

} // end of class Parkering



OPPGAVE 3

Nedenfor ser du en skisse av klassen ParkeringsHus. Denne klassen representerer datastrukturen i programmet. Når en bil står parkert i parkeringshuset vil det være et tilsvarende Parkerings-objekt i arrayen plasser (som er et datafelt i klassen ParkeringsHus nedenfor).

import java.util.Date;

public class ParkeringsHus
{
  private Parkering[] plasser;

  < Konstruktør. Den skal motta arrayens lengde som parameter, og opprette arrayen. >

  public boolean innkjøring(Parkering p)
  {
    < Metoden skal sette Parkeringsobjektet p inn i arrayen, under forutsetning
      av at det er plass. Hvis så er tilfelle skal metoden returnere true.
      I mottsatt fall skal den returnere false. >
  }

  public int antallLedigePlasser()
  {
    < Metoden skal beregne og returnere hvor mange ledige plasser det er i
      parkeringshuset(arrayen).  >
  }


  public boolean fullt()
  {
    < Hvis parkeringshuset er fullt, dvs. arrayen er full, skal metoden returnere true.
      I motsatt fall skal den returnere false. >
  }

  public int arrayIndeks(String nr)
  {
    < Metoden mottar som parameter et nr i form av et String-objekt. Den skal så
      returnere arrayindeksen til det Parkeringsobjektet som har en tilsvarende kode
      ELLER et tilsvarende kontoNr. Hvis det ikke finnes et slikt objekt i arrayen
      skal metoden returnere -1. >
  }

  public String utkjøring(String nr)
  {
    < Metoden skal registrere at en bil forlater parkeringshuset (og derved arrayen).
      Den skal returnere en tekst (kvittering) med informasjon om hva slags type
      parkering som har funnet sted, tidspunktene for inn- og utkjøring, samt avgifts-
      beløpet. >
  }

} // end of class ParkeringsHus

a) Programmer klassens konstruktør og metoden public boolean innkjøring(Parkering p).

b) Programmer metodene public int antallLedigePlasser() og public boolean fullt().

c) Programmer metoden public int arrayIndeks(String nr).

d) Programmer metoden public String utkjøring(String nr).



OPPGAVE 4

På neste side ser du bilder av det vinduet som møter bilisten ved innkjøring i parkeringshuset. Vinduet er vist i to forskjellige tilstander. Det første bilde viser tilstanden FØR bilisten har tastet inn kode eller kontonr, og da står det STOPP på rød bakgrunn. Det andre viser tilstanden ETTER at inntastet kontonummer er kontrollert og godkjent for innkjøring og da står det KJØR INN på grønn bakgrunn. (Tilsvarende situasjon gjelder for innkjøring med kode.) Legg også merke til at antall ledige plasser i parkeringshuset står øverst i vinduet.

Her ser du en skisse av klassen InnkjøringsVindu:

< import-setninger >
public class InnkjøringsVindu extends JFrame
{
  private JTextField nrFelt, ledigePlasser, adgangsFelt;
  private JButton inn;
  private ParkeringsHus pHus;
  private KodeGenerator koder;

  public InnkjøringsVindu(ParkeringsHus hus, KodeGenerator kg )
  {
    super( "HOLBERGS P-HUS  INNKJØRING" );
    pHus = hus;
    koder = kg;

    ledigePlasser = new JTextField(20);
    nrFelt = new JTextField(10);
    inn = new JButton("Innkjøring");
    KnappeLytter knappelytter = new KnappeLytter();
    inn.addActionListener(knappelytter);
    adgangsFelt = new JTextField(25);

    < Nødvendige instruksjoner for å sette opp brukergrensesnittet.  >

    setSize(350, 190);
    setVisible(true);
    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  }

  public void melding(JTextField tf, Color c, int str, String tekst)
  {
    tf.setFont(new Font("Times", Font.BOLD, str));
    tf.setBackground( c );
    tf.setHorizontalAlignment(SwingConstants.CENTER);
    tf.setText(tekst);
  }

  public void visAntallLedige()
  {
    < Metoden skal sørge for at antallet ledige plasser i parkeringshuset
      blir skrevet ut i tekstfeltet ledigePlasser. Hvis det ikke er noen ledige
      plasser skal det i tekstfeltet skrives FULLT. >
  }

  public void innkjøring()
  {
    < Metoden skal lese inn det nummeret bilisten har skrevet inn i tekstfeltet
      nrFelt. Lengden på teksten som er skrevet inn avgjør hva slags type parkering
      det dreier seg om. (En kode har 4 siffer, et kontonummer har 11 siffer.)
      Riktig type Parkeingsobjekt skal opprettes. Etter at koden eller kontonummeret er
      kontrollert og funnet gyldig, skal parkeringen registreres, under forutsetning av
      at det er plass i parkeringshuset. I tekstfeltet adgangsFelt skal det skrives en
      kort melding om utfallet:
      Hvis nummeret har feil antall siffer skal det skrives UGYLDIG NR, på rød bakgrunn.
      Hvis kontrollen ikke passeres skal det skrives INGEN ADGANG, på rød bakgrunn.
      Hvis parkeringshuset er fullt skal det skrives FULLT, på rød bakgrunn.
      Hvis imidlerid alt er i orden skal det skrives KJØR INN, på grønn bakgrunn.
      I tillegg skal tekstfeltet ledigePlasser oppdateres. >
  }

      < Andre metoder og lytteklasser som du IKKE skal programmere. >
}  // end of class InnkjøringsVindu 

a) Programmer metoden public void visAntallLedige().

b) Programmer metoden public void innkjøring().


OPPGAVE 5

Nedenfor ser du bilder av det vinduet som møter bilisten ved utkjøring av parkeringshuset. Vinduet er vist i to forskjellige tilstander. Det første bilde viser tilstanden FØR bilisten har tastet inn kode eller kontonr, og da står det STOPP på rød bakgrunn. Det andre viser tilstanden ETTER at inntastet kontonummer er kontrollert og godkjent for utkjøring og da er det skrevet ut en kvittering (i tekstområdet i midten av vinduet) i tillegg til at det står KJØR UT på grønn bakgrunn nederst. (Tilsvarende situasjon gjelder for utkjøring med kode.)

Her ser du en skisse av klassen UtkjøringsVindu:

< import-setninger >
public class UtkjøringsVindu extends JFrame
{
  private JTextField nrFelt, utgangsFelt;
  private JTextArea display;
  private JButton ut;
  private ParkeringsHus pHus;
  private InnkjøringsVindu innkjøringsVindu;

  public UtkjøringsVindu(ParkeringsHus hus, InnkjøringsVindu v)
  {
    super( "HOLBERGS P-HUS  UTKJØRING" );
    pHus = hus;
    innkjøringsVindu = v;

    nrFelt = new JTextField(10);
    ut = new JButton("Utkjøring");
    KnappeLytter knappelytter = new KnappeLytter();
    ut.addActionListener(knappelytter);
    display = new JTextArea(3,30);
    utgangsFelt = new JTextField(25);

    < Nødvendige instruksjoner for å sette opp brukergrensesnittet.  >

    setSize(350, 200);
    setVisible(true);
    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

  }

  public void melding(JTextField tf, Color c, int str, String tekst)
  {
    tf.setFont(new Font("Times", Font.BOLD, str));
    tf.setBackground( c );
    tf.setHorizontalAlignment(SwingConstants.CENTER);
    tf.setText(tekst);
  }
      //  Klassen UtkjøringsVindu fortsetter på neste side. 

  public void utkjøring()
  {

    < Metoden skal lese inn det nummeret bilisten har skrevet inn i tekstfeltet
      nrFelt. Under forutsetning av at dette er et gyldig nummer, skal det skrives
      ut en kvittering i tekstområdet display, samtidig som det i tekstfeltet utgangsFelt
      skal skrivet KJØR UT, på grønn bakgrunn. Det kan imidlertid hende at det ikke finnes
      noe parkeringsobjekt i systemet med det nummeret bilisten har skrevet inn, og i så
      fall skal det i tekstfeltet utgangsFelt skrives UGYLDIG NR, på rød bakgrunn.
      I tillegg skal metoden sørge for at antall ledige plasser i innkjøringsvinduet
      oppdateres.(Se oppgave 4) >
  }

  private class  KnappeLytter < ... >
  {
    < Klassen må implementere riktig interface og sørge for at metoden utkjøring()
      blir kalt opp når bilisten trykker på knappen i vinduet. >
  }

  < Andre metoder og lytteklasser som du IKKE skal programmere. >

}   // end of class UtkjøringsVindu 

a) Programmer metoden public void utkjøring().

b) Programmer den private lytteklassen KnappeLytter.



OPPGAVE 6

a) Programmer klassen ParkeringsSystem. Denne skal inneholde main-metoden som skal starte applikasjonen på en slik måte at alle modulene i programmet fungerer sammen. Antall parkeringsplasser skal være 100, og antall koder skal være 50.

SLUTT