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


HiO's INTERNASJONALE STUDENTCAMP

I anledning HiO's Internasjonale Sommerskole, har høgskolen opprettet en campingplass der studenter, fra inn- og utland, kan bo for en rimelig penge mens de deltar på sommerskolen. Studentene kan enten benytte seg av eget telt eller leie en campinghytte.
I denne forbindelse har du fått i oppdrag å lage et dataprogram som skal lette administrasjonen av campingplassen. 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.
I oppgave 5 og 6 er det vist bilder av programmets brukergrensesnitt. De enkelte oppgavene inneholder nærmere informasjon.

Oppgave 1

a)
I denne oppgaven skal du programmere klassen Kunde. Klassen skal samle nødvendig informasjon om kunden, herunder

Klassen skal ha en konstruktør som mottar startverdier for alle datafeltene, samt aksess-metoder (get-metoder) for disse.

Oppgave 2

I denne oppgaven skal du programmere en abstrakt klasse som samler alle dataene som skal registreres for de forskjellige plassene man kan leie, enten det dreier seg om en enkelt teltplass eller en campinghytte. Nedenfor finner du en skisse av klassen:

public abstract class Plass
{
  public static final int ÅRSLENGDE = 365; //ser bort fra skuddår
  protected Kunde[] gjest = new Kunde[ ÅRSLENGDE ];
  protected int nr;                   //skal genereres automatisk
  private static int nestenummer = 1; //for automatisk generering av nr
  protected double døgnpris;

  <konstruktør>
  <metoder>
  abstract public String toString();
} 

Klassen er såpass omfattende at vi har valgt å dele oppgaven inn i flere deloppgaver.

a)
Programmer klassens konstruktør for initialisering av instansvariablene (datafeltene), og aksess-metoder (get-metoder) for henholdsvis nr og pris. nr skal genereres slik at alle plasser får et unikt nr.

b)
For å kunne leie en plass, må programmet først sjekke om plassen er ledig. Indeksene i arrayen Kunde[] gjest tilsvarer dagene i året minus 1 (dvs. indeks 0 tilsvarer 1. januar, indeks 1 tilsvarer 2. januar, indeks 364 tilsvarer 31. desember osv.), og gjest[i] refererer til det kundeobjektet som har bestilt plassen for den tilsvarende dagen. På ledige dager er gjest[i] == null.

Programmer metoden

Metoden skal undersøke om plassen er ledig fra og med startdagen i det antallet dager som parameteren antDager angir. Hvis plassen er ledig, skal metoden returnere true, hvis ikke skal den returnere false. Campingplassen er kun åpen i sommerhalvåret. Du kan derfor forutsette at utleie-tidsrommet ikke passerer et årsskifte.

c)
Programmer metoden

Metoden reserverer plassen for kunden k, under forutsetning av at plassen er ledig i tidsperioden som er registrert for k. Hvis reservasjonen går greit, skal metoden returnere true, i motsatt fall skal den returnere false.

d)
Programmer metoden

Metoden frigjør plassen som var reservert for k og returnerer skyldig beløp.

e)
Programmer metoden

Metoden returnerer en referanse til det Kunde-objektet som inneholder parameteren navn, eventuelt null dersom dette ikke finnes. (Du kan anta at alle kunder har forskjellige navn og at hver kunde har leid/reservert plassen for bare én tidsperiode.)




Oppgave 3

Du skal nå programmere to konkrete subklasser til den abstrakte klassen Plass. Begge klassene skal ha en konstruktør for nødvendig initialisering, samt en toString-metode som returnerer relevante opplysninger om plassen, herunder hva slags plass det dreier seg om.

a)
Programmer subklassen Teltplass til Plass. For teltplasser skal det ikke registreres andre data enn de som skal registreres for alle typer plasser.

b)
Programmer subklassen Campinghytte til Plass. For campinghytter skal det registreres hvor mange sengeplasser den har.

Oppgave 4

Klassen Campingplass representerer campingplassen med alle utleie-enhetene (plassene). Nedenfor finner du en skisse av klassen.

public class Campingplass
{
  public static final int SIZE = 100;
  private static final int UTVIDELSE = 10;
  private Plass[] plasser = new Plass[ SIZE ];
  private int antPlasser = 0;
  public static final int TELTPLASS = 1;
  public static final int CAMPINGHYTTE = 2;

  <konstruktør>

  <metoder>
}

a)
Programmer metoden

Metoden kalles når det skal legges inn en ny plass i programmet. Den mottar en referanse til den nye plassen, og skal sette denne inn i arrayen. Hvis arrayen er full, skal den utvides med så mange elementer som konstanten UTVIDELSE angir.

b)
Programmer metoden

Metoden skal avgjøre om den innkomne parameteren objekt refererer til en Teltplass eller en Campinghytte, og skal returnere den tilhørende int-konstanten.

c)
Programmer metoden

Metoden skal returnere en tekst som inneholder informasjon om alle plasser av angitt type som er ledig i den tidsperioden som parametrene angir. Hvis ingen slike plasser er ledige, skal metoden returnere informasjon om dette.

d)
Programmer metoden

Metoden skal undersøke om det finnes en plass med det plassnr som parameteren angir, og i så fall returnere arrayindeksen til plassen. I motsatt fall skal metoden returnere -1.

e)
Programmer metoden

Metoden skal reservere plass for kunden som parameteren k angir. Hvis plassen finnes og er ledig i den aktuelle tidsperioden, skal den reserveres for kunden, og metoden skal returnere true. Hvis ikke, skal metoden returnere false.

f)
Programmer metoden

Metoden kalles når personen med navnet som parameteren angir forlater campingplassen. Den skal returnere det beløp som personen skal betale, og sørge at plassen blir ledig igjen. Hvis derimot den navngitte personen ikke er registrert, skal metoden returnere 0.




Oppgave 5

Nedenfor kan du se et bilde av brukergrensesnittet for registrering av campingplassens plasser og hytter.

Klassen som definerer dette er skissert nedenfor.

 public class Plassregistrering extends JFrame
 {
   private JTextField typefelt, sengefelt, prisfelt;
   private JButton regknapp;
   private Campingplass plassen;
   private Knappelytter lytter;

   public Plassregistrering( Campingplass p )
   {
     super( "Oppdatering av plassregister" );
     plassen = p;
     <Oppretter komponenter, lager layout og foretar nødvendig initialisering.>
   }

   public void registrerNyPlass() { ... }

   private class Knappelytter implements ActionListener
   {
     public void actionPerformed( ActionEvent e )
     {
       registrerNyPlass();
     }
   }
 }
 

a)
Programmer metoden

Metoden skal lese inn fra vinduet relevante data for en ny plass/hytte av den angitte type og legge disse inn i programmets register over plasser/hytter.



Oppgaven fortsetter på neste

Oppgave 6

Nedenfor ser du et bilde av brukergrensesnittet for reservasjon av de forskjellige plassene og hyttene.

Brukergrensesnittet er definert av klassen Reservasjon. Følgende skisse gjengir en del av denne klassen. Legg spesielt merke til hjelpemetoden finnDagnr() som du vil få bruk for i andre metoder i klassen.

public class Reservasjon extends JFrame
{
  private JTextField typefelt, navnefelt, dagfelt, mndfelt, årsfelt, antdgfelt, nrfelt;
  private JButton ledigknapp, resknapp, utknapp;
  private JTextArea ledigliste;
  private Campingplass plassen;
  private Knappelytter lytter;

  public Reservasjon( Campingplass p )
  {
    super( "Reservasjon av plasser og hytter" );
    plassen = p;
    <Oppretter komponenter, lager layout og foretar nødvendig initialisering.>
  }

  //Hjelpemetode som leser inn dato og
  //returnerer datoens dagnummer innenfor året (fra 0 til 364).
  private int finnDagnr()
  {
    int dag = Integer.parseInt( dagfelt.getText() );
    int mnd = Integer.parseInt( mndfelt.getText() );
    int år = Integer.parseInt( årsfelt.getText() );
    Calendar start = new GregorianCalendar( år, mnd - 1, dag );
    return start.get( Calendar.DAY_OF_YEAR ) - 1;
  }

  <metoder>    // Klassen fortsetter neste side
  
  private class Knappelytter implements ActionListener
  {
    public void actionPerformed( ActionEvent e )
    {
      if ( e.getSource() == ledigknapp )
        visLedige();
      else if ( e.getSource() == resknapp )
        reserver();
      else if ( e.getSource() == utknapp )
        sjekkUt();
    }
  }
}

a)
Programmer metoden

Metoden skal skrive ut i tekstområdet ledigliste en oversikt over plasser/hytter av valgt type som er ledig i det tidsrom som er angitt.

b)
Programmer metoden

Metoden skal foreta reservasjon av plass/hytte av valgt type i det angitte tidsrom for kunden det er angitt navn for. Den skal skrive ut melding om utfallet av reservasjonen.

OBS!
Klassene som er beskrevet i eksamensoppgaven vil til sammen ikke utgjøre et fullstendig program, da det bl.a. mangler en main-metode. Du skal imidlertid ikke programmere annet enn det som det er spørsmål om i oppgavene.