Fag: Programmering |
Fagnr: LO 125 A |
Faglig ansvarlige: Eva Vihovde og Kjetil Grønning | ||
Ant. sider: 7 | Ant. oppgaver: 4 |
Ant. vedlegg: 0 | Dato: 11.12.2002 |
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.
Eksamensoppgaven går ut på å lage et program til bruk i resepsjonen på et hotell. For at oppgaven ikke skal bli for stor, har vi begrenset programmet til å vise ledige rom, reservere rom, vise hvilke gjester som til enhver tid bor på hotellet, samt sjekke ut gjester ved avreise. Programmet inneholder et klassehierarki, bestående av den abstrakte superklassen Rom og de konkrete subklassene Enkeltrom og Dobbeltrom. Programmets datastruktur finner vi i klassen Hotell, mens programmets brukergrensesnitt er lagt til klassen Hotelldrift. Hotellet holder stengt i jule- og nyttårs-helgen slik at dere kan se bort fra problematikken knyttet til passeringen av et årsskifte.
Nedenfor finner du en skisse av klassen Rom. Noen av metodene er oppgitt, og disse kan du fritt gjøre kall på der du finner det fornuftig. Dagene i året er nummerert fra 1 og oppover. I arrayen gjest vil gjest[i] referere til navnet på gjesten som bor på eller har reservert rommet for dag nummer i. For enkelhets skyld skal vi i denne oppgaven gå ut fra at alle gjester har forskjellige navn og at hver gjest bare har reservert et rom for én enkelt, sammenhengende periode.
public abstract class Rom { public static final int ANTDAGER = 358; //fra nyttår og til og med julaften protected int nr; // romnummeret protected String[] gjest; public Rom( int n ) { nr = n; gjest = new String[ ANTDAGER + 1 ]; } public abstract double sjekkUt( int dag, int måned, int år ); //Hjelpemetode som returnerer datoens dagnummer //innenfor året (fra 1 til 366). public static int årsdag( int dag, int måned, int år ) { Calendar start = new GregorianCalendar( år, måned - 1, dag, 12, 0 ); return start.get( Calendar.DAY_OF_YEAR ); } //Hjelpemetode som returnerer datoens dagnummer //innenfor vedkommende uke (fra 1 til 7, 1 for mandag, 7 for søndag ). public static int ukedag( int dag, int måned, int år ) { Calendar start = new GregorianCalendar( år, måned - 1, dag, 12, 0 ); return (start.get( Calendar.DAY_OF_WEEK ) + 5) % 7 +1; } public int getNr() { return nr; } < metoder du skal programmere i de følgende deloppgavene > }
a) Programmer metoden
public boolean erLedig( int dag, int måned, int år, int antDager ) {...}
Metoden skal sjekke om rommet er ledig i det antall dager som parameteren antDager angir, fra og med den datoen parametrene dag, måned og år angir, samt sjekke at denne perioden er innenfor hotellets åpningstid (se innledningen). Hvis så er tilfelle, skal metoden returnere true, i motsatt fall skal den returnere false.
b) Programmer metoden
public boolean reserver( int dag, int måned, int år, int antDager, String navn ) {...}
Metoden skal reservere rommet i det antall dager som parameteren antDager angir, fra og med den datoen parametrene dag, måned og år representerer, for personen som parameteren navn angir, under forutsetning av at rommet er ledig i den ønskede periode. Hvis dette lar seg gjøre, skal metoden returnere true, ellers skal den returnere false.
c) Programmer metoden
public boolean weekend( int dag ) {...}
Den innkomne parameteren dag vil representere en av ukens syv dager. Metoden skal avgjøre om dag er en ukedag eller om dag tilhører helgen (det vil si lørdag eller søndag). Hvis det siste er tilfelle, skal metoden returnere true, i motsatt fall skal den returnere false. Mandag regnes som ukens første dag.
d) Programmer metoden
public String getGjest( int dag, int måned, int år ) {...}
Hvis datoen som parametrene angir er innenfor hotellets åpningstid og rommet er utleid på denne dagen, skal metoden returnere navnet på gjesten. Hvis rommet er ledig på den aktuelle dagen, skal metoden returnere null.
Hotellet har to typer rom, Dobbeltrom og Enkeltrom. Disse klassene er begge subklasser til den abstrakte klassen Rom, og er nesten helt like. Det som skiller dem er leieprisene, det vil si verdiene til konstantene UKE og WEEKEND. Dere skal derfor kun programmere den ene av dem.
a) Programmer klassen Dobbeltrom. Klassen skal være en konkret subklasse til klassen Rom. Den skal inneholde to konstanter UKE = 1420.0 og WEEKEND = 850.0 som representerer leieprisene per dag for henholdsvis ukedager og weekend (se spørsmål c i oppgave 1). Klassen skal ha en konstruktør som foretar nødvendig initialisering. I tillegg må den implementere den abtrakte metode sjekkUt som den har arvet fra superklassen Rom (se Oppgave 1). Metodens parametre angir datoen for utsjekkingsdagen. Vær oppmerksom på at denne kan være tidligere enn siste dagen gjesten har reservert rommet for. Metoden skal returnere skyldig beløp for leien av rommet. (Det skal bare betales for de dager gjesten har vært der.) Metoden skal dessuten ledigstille rommet i den perioden gjesten hadde reservert det for.
Nedenfor finner du en skisse over klassen Hotell. Rommene er plassert i arrayen rom, der hver referanse i arrayen enten refererer til et objekt av typen Dobbeltrom, eller refererer til et objekt av typen Enkeltrom. Hotellet har i alt 50 rom, der romnumrene går fra 1 og oppover. Enkeltrommene har romnummer som er oddetall, mens alle dobbeltrommene har romnummer som er partall.
public class Hotell { public static final int ANTROM = 50; public static final int ENKELTROM = 1, DOBBELTROM = 2; private Rom[] rom = new Rom[ ANTROM + 1 ]; < konstruktør > < metoder som du skal programmere i de følgende deloppgavene > }
a) Programmer klassens kontruktør, slik at den genererer romobjektene med romnumre som beskrevet ovenfor.
b) Programmer metoden
public String gjesteliste( int dag, int måned, int år ) {...}
Metoden skal returnere en tekst som inneholder navnene og de tilhørende romnumrene på alle gjestene som bor på hotellet på den datoen som parametrene angir, en linje pr. gjest. Hvis hotellet ikke har noen gjester denne dagen, skal metoden returnere informasjon om det.
c) Programmer metoden
public String ledigeRom( int dag, int mnd, int år, int antDager, int type ) {...}
Metoden skal returnere en oversikt, i form av en tekst, som viser hvilke rom som er ledige av den typen som parameteren type angir, i det tidsrommet de andre parametrene angir. (Dvs. fra og med dag:mnd:år i antDager dager). Metoden skal bare gi informasjon om romnumrene. Hvis ingen rom av riktig type er ledig i den angitte perioden, skal metoden returnere informasjon om det.
d) Programmer metoden
public boolean reserver( int romnr, String navn, int dag, int mnd, int år, int antDager ) {...}
Metoden skal ut fra parametrene reservere det angitte rommet for personen med gitt navn i den angitte tidsperioden, der datoen gir startdagen. Du kan forutsette at dato har gyldige verdier, men må sjekke at rommet eksisterer.
e) Programmer metoden
public double sjekkUt( int romnr, int dag, int mnd, int år ) {...}
Metodens parametre angir hvilket rom det skal sjekkes ut fra, samt
datoen for utsjekkingsdagen. Metoden skal returnere skyldig beløp for leien
av rommet, og dessuten sørge for at rommet ledigstilles i den perioden gjesten
hadde reservert det for.
Du kan forutsette at dato har gyldige verdier, men må sjekke at rommet eksisterer.
Nedenfor ser du et bilde av programmets brukergrensesnitt, samt en
skisse av klassen Hotelldrift.
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Hotelldrift extends JFrame { private JTextField dagfelt, månedfelt, årfelt, antallfelt, navnfelt, nrfelt, typefelt; private JTextArea utskriftsområde; private JButton visLedige, reserver, sjekkUt, visListe; private Knappelytter lytter = new Knappelytter(); private Hotell hotellet = new Hotell(); private int dag, måned, år; public Hotelldrift() { super( "Hotell Java" ); : visLedige.addActionListener( lytter ); reserver.addActionListener( lytter ); sjekkUt.addActionListener( lytter ); visListe.addActionListener( lytter ); : } < metoder du skal programmere i de følgende deloppgavene > private class Knappelytter ... {...} //som du skal programmere under punkt 4 d) }
I de følgende metodene skal all informasjon til brukeren skrives inn i JTextArea-objektet utskriftsområde.
a) Programmer følgende metoder:
private void lesDato() {...}
Metoden leser inn dag, måned og år for en dato og lagrer den i de tilhørende instansvariablene.
public void visGjesteliste() {...}
Metoden skal skrive ut en oversikt over alle gjester med tilhørende rom som bor på hotellet på en bestemt dato skrevet inn av brukeren.
public void visLedigeRom() {...}
Metoden skriver ut en oversikt over hvilke rom som er ledige av den typen og i det tidsrommet brukeren har valgt. Hvis ingen rom av riktig type er ledig i denne perioden, skal metoden gi informasjon om det.
b) Programmer metoden
public void reserverRom() {...}
Metoden skal ut fra dataene brukeren skriver inn, reservere for gjesten det valgte rommet i den valgte tidsperioden. Metoden skal gi passende tilbakemelding til bruker.
c) Programmer metoden
public void sjekkUt() {...}
Metoden skal utfra de dataene brukeren skriver inn sørge for at utsjekking fra angitt rom på angitt dato finner sted. Metoden skal skrive ut skyldig beløp, og dessuten sørge for at rommet ledigstilles i den perioden gjesten hadde reservert det for.
d) Programmer den indre klassen Knappelytter slik at den fanger opp de hendelsene som finner sted i brukergrensesnittet, og sørger for at de tilhørende oppgavene blir utført.
e) Til slutt skal du programmere applikasjonsklassen Driver, inneholdende en main-metode som starter hele programmet. Klassen skal programmeres slik at applikasjonen avsluttes når man klikker på lukkeknappen i vinduets øvre høyre hjørne.
SLUTT