Fag:
Programmering
Fagnr:
LO 125 A
Faglig ansvarlige:
Eva Vihovde og
Kjetil Grønning
Ant. sider:
6
Ant. oppgaver:
4
Ant. vedlegg:
0
Dato:
13.02.2003
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.

Lotteri

Oppgaven går ut på å lage deler av et program for et lite pengelotteri. Programmet skal kunne registrere loddsalg, bestemme gevinstenes størrelse og utføre trekning. Klassen Lodd representerer ett enkelt lodd. Klassen Lotteri inneholder en array av slike. Dessuten inneholder den blant annet en array av Premie-objekter. Disse representerer lotteriets premier. Klassen Lotterivindu definerer et brukervindu som skal brukes blant annet i forbindelse med loddsalg og trekning. Nærmere detaljer for de nevnte klassene er forklart i de enkelte deloppgavene. Metodene som du blir bedt om å programmere, skal i den grad det faller naturlig gjøre bruk av de konstanter som er definert i oppgaveteksten.

Oppgave 1

Klassen Lodd representerer ett enkelt lodd. Den skal ha datafelt (instansvariable) for loddkjøperens navn, adresse og telefonnummer. Dessuten skal hvert Lodd-objekt ha et loddnummer (heltall) og en variabel som indikerer om loddet er et vinnerlodd eller ikke. Dette blir først avgjort ved trekningen. I utgangspunktet er det derfor ikke et vinnerlodd.

a) Programmer klassen Lodd. Klassen skal ha konstruktør som initialiserer alle instansvariable. Konstruktøren må ha de nødvendige parametre for dette. Klassen skal ha følgende metoder:

  public void setVunnet() { ... }

Metoden registrerer at loddet er et vinnerlodd.

  public boolean vunnet() { ... }

Returverdien indikerer om dette er et vinnerlodd eller ikke.

  public String toString() { ... }

Den returnerte teksten skal inneholde opplysninger om loddets nummer, samt loddkjøperens navn, adresse og telefonnummer.

Oppgave 2

Klassen Premie som er skissert i det følgende, representerer én enkelt premie i lotteriet.

public class Premie
{
  private Lodd vinnerlodd;  //loddet som har vunnet premien,
                            //bestemmes når trekning blir foretatt
  private double premiesum;  //hvor mange kroner premien utgjør
  private int plassering;  //nummeret til premien

  <Konstruktør>

  public void setVinner( Lodd vinner ) { ... }

  public Lodd getVinner() { ... }

  public String toString() { ... }
}

a) Programmer konstruktør og metoder for klassen Premie. Konstruktøren skal initialisere premiesum og plassering via parametre.

Metodene setVinner og getVinner er set- og get-metoder (mutator- og aksessor-metoder) for instansvariabelen vinnerlodd. toString-metoden skal returnere en tekst som forteller hvilken premie dette er (nummeret på premien) og hvor mange kroner den er på (fortrinnsvis formattert til to desimaler).

Oppgave 3

I det følgende finner du en skisse av klassen Lotteri.

public class Lotteri
{
  public static final int MAXANTLODD = 100, ANTPREMIER = 6;
  public static final double LODDPRIS = 50.0, RØDEKORSANDEL = 0.1;
  private Lodd[] loddbok = new Lodd[ MAXANTLODD ];
  private Premie[] premieliste = new Premie[ ANTPREMIER ];
  private int antSolgte = 0;  //antall solgte lodd
  private double sumLoddsalg = 0.0;  //summen det er solgt lodd for totalt
  private double rødeKors = 0.0;  //summen som skal gå til Røde Kors
  private boolean trekningForetatt = false; //indikerer om trekning er foretatt

  <Metoder du skal programmere i de følgende deloppgavene.>
}

a) Programmer metodene

  public int getAntSolgte() { ... } //returverdi indikerer antall solgte lodd

  public boolean trukket() { ... } //returverdi indikerer om det er foretatt trekning

b) Programmer metoden

  public double loddsalg( String n, String adr, String tlf, int antLodd ) { ... }

Metoden registrerer salg av et antall nye lodd, forutsatt at det er nok usolgte lodder igjen. Parametrene angir loddkjøperens navn, adresse og telefonnummer, samt antall lodd som ønskes kjøpt. Loddnummeret for hvert lodd skal settes lik array-indeksen for hvor Lodd-objektet blir plassert. Ved loddsalg skal det holdes rede på hvor mange lodd som er solgt hittil og hvor stor sum det er solgt lodd for. Returverdien skal indikere skyldig beløp for loddsalget, eller 0.0 om det var for få usolgte lodder igjen.

c) Programmer metoden

 public void beregnPremier() { ... }

Metoden skal foreta beregning av premier, samt hvor stor pengesum som skal gå til Røde Kors. Beregningene skal gjøres etter følgende regler:
En andel lik RØDEKORSANDEL av summen det er solgt lodd for skal gå til Røde Kors. Av det resterende beløpet skal halvparten gå til førstepremien. De fem neste premiene får like mye hver av den andre halvparten. Metoden skal registrere premiene i arrayen premieliste.

d) Programmer metoden

  public String premieprognoser() { ... }

Den returnerte teksten skal opplyse om summen det er solgt lodd for, hvor mye som har gått til Røde Kors, samt premienummer og pengebeløp for de seks premiene.

e) Programmer metoden

  public void trekning() { ... }

Metoden skal foreta selve trekningen og registrere at trekning er foretatt. Vinnerloddene skal trekkes ved at det trekkes et tilfeldig tall blant de loddnumrene som er solgt. Det registreres at det uttrukne loddet nå er et vinnerlodd. Vinnerne skal registreres i Premie-objektene ved at pekeren vinnerlodd settes til å peke på vinnerloddet. Metoden må passe på at et lodd ikke kan være vinnerlodd mer enn én gang.

f) Programmer metoden

  public String vinnerliste() { ... }

Den returnerte teksten skal for hver av de seks premiene inneholde premienummer og pengebeløp, samt nummeret til vinnerloddet og vinnerens navn, adresse og telefonnummer.

Oppgave 4

I det følgende ser du et bilde av programmets brukergrensesnitt, samt en skisse av klassen Lotterivindu som definerer brukergrensesnittet.

public class Lotterivindu extends JFrame
{
  private Lotteri lotteriet;
  private JTextField navnefelt, adressefelt, telefonfelt, antallfelt, sumfelt;
  private JButton regknapp, prognoseknapp, trekningsknapp, nyknapp;
  private JTextArea utskrift;
  private Lotterilytter lytter;

  public Lotterivindu()
  {
    super( "Pengelotteri" );
    lotteriet = new Lotteri();
    lytter = new Lotterilytter();
    regknapp = new JButton( "Registrer loddsalg" );
    regknapp.addActionListener( lytter );
    prognoseknapp = new JButton( "Vis premieprognose" );
    prognoseknapp.addActionListener( lytter );
    trekningsknapp = new JButton( "Foreta trekning" );
    trekningsknapp.addActionListener( lytter );
    nyknapp = new JButton( "Nytt lotteri" );
    nyknapp.addActionListener( lytter );
    .
    .
  }

  <Metoder du skal programmere i de følgende deloppgavene.>

  private class Lotterilytter ...
  { ... } // som du skal programmere under punkt 4 e)
}

I de følgende deloppgavene skal all kommunikasjon med brukeren foregå via komponentene som er vist i brukergrensesnittet.

a) Programmer metoden

  public void registrerLoddsalg() { ... }

Metoden skal registrere salg av et antall nye lodd, forutsatt at det er nok usolgte lodder igjen. Det skal gis passende tilbakemelding til brukeren. Skyldig beløp for loddsalget skal skrives ut i tekstfeltet beregnet for dette.

b) Programmer metoden

  public void visPremieprognose() { ... }

Metoden skal, forutsatt at det er solgt minst like mange lodd som det er premier i lotteriet, beregne hvor store premiene vil bli. Den andelen av loddsalget som skal gå til Røde Kors skal også beregnes. Resultatene av beregningene skal skrives ut i programvinduet.

c) Programmer metoden

  public void foretaTrekning() { ... }

Metoden skal, forutsatt at det er solgt minst like mange lodd som det er premier i lotteriet, og forutsatt at det ikke allerede er foretatt trekning, foreta trekning og premieberegning. I brukervinduet skal vinnerlista skrives ut med det innhold som er nevnt i oppgave 3 f), eller eventuelt opplysning om hvorfor trekning ikke lot seg utføre.

d) Programmer metoden

  public void nyttLotteri() { ... }

Metoden skal, forutsatt at det er foretatt trekning i nåværende lotteri, klargjøre for et nytt lotteri.

e) Programmer den indre klassen Lotterilytter slik at den fanger opp de hendelsene som finner sted i brukergrensesnittet, og sørger for at de tilhørende oppgavene blir utført.

f) Til slutt skal du programmere applikasjonsklassen Lotteriprogram, 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