Emne: PROGRAMMERING Ol Emnekode: Faglig veileder: I L~~25 A - E!8 Viho~d~.1 Grupper: I Dato: laa, lab, lac, lia, ~IB, l~c, A_~~~) _~~~~12.~!3 -. Antall sider (inkl, Eksamensoppgaven best~r av: forsiden): 8 5 Tillatte hjelpemidler: -ra";~kte F ntall oppga~ -;;;handskr~vn-; l I ~~;~n~?~, :'!I Antall,..n~11 vedlegg: YeQlegg; O u,; Kandidaten må selv kontrollere at oppgavesettet er fullstendig. Ved eventuelle uklarheter i oppgaveteksten skal du redegjøre for de forutsetninger du legger til grunn for løsningen. - - - Les gjennom hele oppgavesettet før du begynner å besvare deloppgavene.. Hold deg til de Identifikator-navnene som er brukt i oppgaveteksten, dog med unntak av metodenes parameternavn som kan velges fritt.. Dersom det er en deloppgave du ikke f~r til, bør du g~ videre til den neste. F~r du bruk for en metode fra en deloppgave du ikke har gjort, kan du gjøre kall p~ metoden selv om du Ikke har programmert den. Du forutsetter da at den utfører det den er tiltenkt ~ gjøre. Det er viktig at du svarer (i alle fall litt) p~ alle deloppgavene.. Merk deg at svært mye av programmeringen gar ut p~ ~ gjøre kall p~ passende metoder av dem som er omtalt i oppgaven. Merk deg derfor hva de omtalte metodene utfører. Pass p~ ved metodekall at argumenter er av riktig type og sørg for ~ gjøre bruk av dataene som metodene returnerer.. Svar nøyaktig p~ det du blir spurt om. Dersom du mener at oppgaveteksten Ikke gir deg tilstrekkelig informasjon eller er oklar, kan du gjøre dine egne forutsetninger. Gjør I sa fall rede for disse.. Ved sensur vil alle bokstaverte deloppgaver (a, b, c,...) telle Ilke mye. I 09.12.03 10:'1
I denne oppgaven skal du lage deler av et program som simulerer billettsystemet til skiheisene pa et skisenter. Med enkle modifikasjoner kan systemet anvendes p~ mange tilsvarende problemstillinger der man enten betaler pr. gang, pr. dag, pr. m~ned eller pr. ~r, som f.eks ved bomstasjoner, p~ et treningstudio eller liknende. Programmet skal ha en modul som simulerer billettkontrollen, og en annen for blant annet salg av forskjellige typer heiskort. De enkelte deloppgavene inneholder nærmere informasjon. Oppgave 1 For hver tur i skiheisen m~ skiløperen/alpinisten passere billettkontrollen med gy1dig heiskort. Kortet er enten et klippekort, et dagskort eller et ~rskort. (Vi har av hensyn til oppgavens kompleksitet valgt ~rskort istedenfor sesong kort som ville vært mer realistisk.) Du skal i denne deloppgaven lage en abstrakt superklasse Kort. Klassen skal innholde de data og metoder som er felles for alle typer heiskort, blant annet: kortnr pris I I et unikt nummer som identifiserer hvert enkelt kort II hva kortet koster i hele kroner. Klassen skal ha en konstruktør for nødvendig initialisering av instansvariablene/datafeltene. HINT: For ~ generere unike nummer til hvert kort kan det være lurt ~ bruke en static variabel som økes med en for hvert kort som blir generert. Videre skal klassen ha aksess-metoder (get-metoder) som returnerer verdiene til henholdsvis kortnr og pris. Resten av metodene skal være abstrakte: public abstract boolean passering(}; public abstract boolean gyldig(}; og skal følgelig implementeres senere. a) Programmer klassen Kort ** De neste to deloppgavene g~r ut p~ ~ programmere metoder i klassen Klippekort. Nedenfor finner du en skisse av denne klassen: public class Klippekort extends Kort. public static final int PRIS PER KLIPP = 20i private int anta.l1klippi /7 antall klipp som til enhver tid er igjen på kort private static int antallsolgte. O; II Det totale antall solgte klippekort private static int sum = o; II Den totale summen det er solgt klipp for /1 på alle klippekortene til sammen. < konstruktør < metoder> b) Programmer klassens konstruktør. Som parameter skal kontruktøren ta imot informasjon om hvor mange klipp kortet inneholder som nytt. Foruten ~ sørge for ~ initialisere klassens instansvariable/datafelt, skal konstruktøren ogs~ sørge for a oppdatere antall solgte klippekort og ikke minst summen det er solgt klippekort for s~ langt. 09.12.0310:51
Videre skal du I denne deloppgaven programmere aksess-metoder (get-metoder) for static-varlablene antallsolgte og sum. c) Du skal i denne deloppgaven programmere tre metoder: public void ladopp int n ).) Metoden over skal øke antall klipp p~ kortet med det antallet som parameteren n angir og oppdatere sur'!1men det er solgt klipp for. p1l1blic boolean gyldig () Metoden over skal returnere true hvis kortet er gyldig og p~lic boolean passering() {. motsatt fall false. Metoden over skal registrere en tur i skiheisen, under forutsetning av at kortet er gyldig. Returverdien skal fortelle om passeringen av billettkontrollen var vellykket.... To av korttypene, dagskort og ~rskort, er avhengig av ~ lagre henholdsvis dagen og ~ret kortene blir solgt. I pakken java.util finner vi klassen Calendar, og i den de metodene vi trenger for ~ f~ tak i dagen og året vi st~r i ved hjelp av følgende setninger: int dag = Calendar.getlnstance().get in~ Ar - Calendar.getlnstance().get( Calendar. DAY OF YEAR Calendar.YEAR-);- d) Nedenfor ser du en skisse av klassen Årskort public class Årskort extends Kort { public final static int ARSPRIS - 3000; private int år; II Året kortet gjelder for pr,ivate String navn; II Eierens navn private static int antallsolgte - O; II Det totale antall solgte årskort private static int sum - o; II Den totale summen det er solgt årskort for < konstruktør> < aksess-metoder / get-metoder < metoder du skal programmere Programmer klassens konstruktør. Konstruktøren mottar navnet på eieren av kortet som parameter og skal sørge for å initialisere og oppdatere klassens instansvariable/datafelt. public boolean gyldig () Metoden over skal kun undersøke om vi "befinner oss i riktig år ut fra det 3ret kortet gjelder for. Returverdien skal samsvare med resultatet. Kortet er personlig, og enkelte ganger vil det ved billettkontrollen bli sjekket om brukeren av kortet er eieren av kortet. I denne forbindelse skal du programmere metoden public boolean passering(string navn) Metoden over registrerer en passering av billettkontrollen under forutsetning av at kortet er gyldig og at navnet som parameteren angir også er navnet på eieren av kortet. Returverdien skal fortelle om personen passerte billettkontrollen eller ikke. Eierens identitet blir imidlertid ikke sjekket ved hver passering, s du skal ogs programmere metoden 09.12.03 10:51
public boolean passering () som kun registrerer en passering under forutsetning av at kortet er gyldig. Returverdien skal fortelle om personen passerte billettkontrollen eller ikke. Du skal Ikke programmere aksess-metodene/ get-metodene da disse stort sett blir like dem du programmerte under punkt b. Men det er viktig at du bruker dem der du finner det hensiktsmessig. Til slutt I oppgave 1 ser du en skisse over klassen Dagskort. Du skal Ikke programmere noe I denne klassen, men vite at du har den og merke deg hvilke metoder den har slik at du kan bruke den der du finner det nødvendig: ~ublic claes Dagskort extends Kort public final static int DAGSPRIS - 2 private int dag; private static int sum - o; private static int antallsolgte. O; < konstruktør> < aksess-metoder / get-metoder > public boolean gyldig ( ) { public boolean passering () }... Oppgave 2 Klassen Kortsystem, som er skissert nedenfor, skal lagre heiskortene. I utgangspunktet er det plass til 100 heiskort. Arrayens størrelse skal imidlertid kunne økes etter behov slik at salg av heiskort ikke begrenses til 100. ~ublic class Kortsystem public static final int MAX - 100; public static final int UTVIDELSE - 10; public static final int KLIPPEKORT - O, private Kort[] kortarray; DAGSKORT = l, SESONGKORT = 2 ~ublic Kortsystem() 'f. kortarraya new Kort [MAX) < metoder du skal programmere> a) public void utvidarray ( ) Metoden skal utvide arrayen med ~ mange elementer som konstanten UTVIDELSE angir. Metoden vil bli kalt n~r det er behov for ~ utvide arrayen I forbindelse med Innsetting av et nytt helskort. b) public void sett InnKort (Kort k) Metoden mottar et nytt helskort som parameter og skal sette dette Inn p~ første ledige plass i arrayen. Hvis arrayen er full, m& du først utvide den med si mange elementer som 09.12.03 10:51
konstanten UTVIDELSE angir, og deretter sette inn kortet. c) Under denne deloppgaven skal du programmere følgende to metoder public Kort finnkort(int nr) 1 som returnerer en referanse til heiskortet med kortnr lik den innkomne parameteren nr. Hvis kortet Ikke finnes i arrayen, skal metoden returnere null. public void fjernugyldigekort() Metoden over skal fjerne alle ugyldige kort fra arrayen, det vil si kort som er g~tt ut p~ dato, eller klippekort der alle klippene er brukt opp. d) Eieren av et klippekort skal ha mulighet til ~ "lade opp" kortet med et visst antall klipp. public boolean ladoppkort {int nr, antall l Metoden skal øke antall klipp på kortet med kortnr lik den innkomne parameteren nr, med det antall klipp som den innkomne parameteren antall angir. Hvis dette lar seg gjøre, skal metoden returnere true, og i motsatt fall skal den returnere false. e) Kortsystemet skal ha mulighet for å skrive ut informasjon om hvor mange kort det er solgt av de forskjellige typene, hvor mye som er tjent inn på hver type, og hvor mye som er tjent inn totalt. p~lic String inntjeningsinfo().) Oppgave 3 Bi I lettsystemets display for billettkontroll er vist på bildet under. P8rsonk~oii:. ;:':"i""c;"i; BlIett,-kM'OR ~I I,'" I.. Vinduet er definert klassen BillettXontroll som du.finner en skisse av nedenfor: import-setninger public claes BillettKontroll extends JFrame { private JTextField kortnrfeit, navnefelt, display private JButton kontroll; private Kortsystem kortsystem; public BillettKontroll(Kortsystem k) { super ("BILLETT-KONTROLL") ; kortsystem - k; ~ontroll = new JB u t t on ("Sillett-kon troll") i ~ontroll.addactionlistener(new ActionListener() of8 09.12.0310:51
< oppretter resten av brukergrensesnittet public void kontrollerkort() t a) Metoden du skal programmere public vold kontrollerkort 1,. i denne oppgaven skal kalles ved billett-kontroll Metoden m~ lese Inn kortets nummer og sjekke at kortet er gyldig, under forutsetning av at det finnes, og eventuelt registrere en passering (ved klippekort). Hvis kortet er gyldig, skrives "OK" i diplay-vinduet, i motsatt fall "STOPP". Hvis kortet er et ~rskort, skal metoden sjekke om brukeren av programmet har skrevet inn et navn i navnefeltet, og i s~ fall foreta en billettkontroll som ogs~ sjekker navnet. Metoden skal sørge for ~ blanke ut navnet i navnefeltet etter at kontrollen er foretatt. Hvis det ikke st~r noe i navnefeltet, skal det bare sjekkes om kortet er gyldig. TIL ORIENTERING: For ~ f~ skrevet ut "OK" og "STOPP" med fontene som vist p~ bildet med sentrering av teksten midt p~ displayet og med bakgrunnsfargene rød eller grønn, er det brukt følgende programsetninger: display.setfont(new Font ("Times", Font.BOLD, 60»; display.setbackground( Color.RED); II ev. Color.GREEN display.sethorizontalalignment(display.center); Oppgave 4 Vinduet under brukes ved salg av heiskort, opplading av klippekort og til hente informasjon om salg av kort med mer. J<lippekort kr. 20.- pr. klipp Dagskort: kr. 200.- Sesongkort kr. 3000.-.." a~.;;",~ ~-.~., ~, :~ Antæl~.I K-l",": I - """-"-1: ~"C"c): Opplading av klippekort I Bøtal kr:.., r-~.~~iue kort "'U' ~ r~n ~1g6 ~ I s~w~~ Vinduet er definert klassen Kortsalg som du finner en skisse av nedenfor: < import-setninger> public claes Kortsalg extends JFrame { private static final int KLIPP - l, DAG - 2, ÅR - 3i private JTextField kortnrfelt, navnefelt, betalingsfelt, antallklippfelti private JButton klipp, dag, år, infoknapp, fjern, ladeknappi private JTextArea info, displayi of8 09.12.0310:51
private Lytter lytter; private Kortsystem kortsystem; public KOrtsalg(KOrtsystem k} super ("KORTSALG") i kortsystem. ki lytter 8 new Lytter() i < oppretter resten av brukergrensesnittet klipp.addactionlistener(lytter) i d~g.addactionlistener(lytter)i år. addactionlistener (lytter) i ladeknapp. addactionlistener ( lytter metoder du skal programmere> p~ivate claes Lytter a) Ptfblic: vold selgkort(int type) Metoden skal foreta et salg av et helskort av typen parameteren type angir. (Se konstantene skissen av klassen over.) NSr kortet er opprettet og satt inn I datasystemet, skal metoden skrive ut kortets nummer i tekstfeltet kortnrfel t og prisen som skal betales I tekstfeltet betalingsfelt. b) p+lic void ladoppkort Metoden skal lade opp klippekortet med det antall klipp som brukeren skriver inn, under forutsetning av at nummeret brukeren skriver inn tilhører et klippekort i datasystemet. Hvis dette g&r bra, skal det skrives en melding om det i displayet og prisen som skal betales skrives i betalingsfeltet. I motsatt fall skal det gis melding om at klippekort med dette nummer ikke finnes. c) I denne deloppgaven skal du programmere to metoder: P~lic void salgsinformasjon f l som skriver ut ps displayet hvor mange kort det er solgt av de forskjellige typene, hvor mye som er tjent inn ps hver type, og hvor mye som er tjent inn totalt. ~lic voicl fjernugyldigekort ( som sørger for at alle ugvldige'kort"bttr fjernet fra datasystemet, det vil si kort som er g~tt ut p~ dato når metoden blir kalt, eller klippekort der alle klippene er brukt opp. d) Programmer den private lytteklassen private class Lytter. slik at den fanger opp hendelsene som brukeren av programmet genererer og utfører de tilhørende operasjonene. 09.12.0310:51
Oppgave 5 Lag klassen KortApplikasjon som inneholder hovedprogrammet. Dette skal opprette et synlig vindu av hver av typene du har programmert og starte hele applikasjonen. Programmer lukkeknappene på vinduene slik at applikasjonen avsluttes n~r vinduene lukker seg. SLUTT! af8 09.12.0310:51