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


FORSIKRING

I denne eksamensoppgaven skal du lage et java-program for forsikringsselskapet TRYGG FORSIKRING. Programmet skal kunne registrere selskapets kunder og opprette forskjellige typer forsikringer. Antall forsikringstyper er i denne oppgaven begrenset til bilforsikring, hus- og innboforsikring, samt reiseforsikring. Programmet skal beregne forsikringspremiene for de forskjellige forsikringstypene og de årlige premiene kundene må betale (Med premie menes her det kunden må betale for forsikringen.) Siden dette er en eksamensoppgave på 5 timer er programmet svært forenklet i forhold til det som normalt ville forventes av et slikt program. Det er imidlertid bygget opp på en måte som gjør at det enkelt kan bygges ut med den funksjonalitet som måtte være ønskelig for et forsikringsselskap.

Programmet består av klassene Forsikring, BilForsikring, HusInnboForsikring, ReiseForsikring, ForsikringsKunde, ForsikringsRegister, ForsikringsVindu og TryggForsikring. De enkelte oppgavene inneholder nærmere informasjon. Det anbefales å ta en titt på bilde av brukergrensesnittet i oppgave 4. Bildet gir en visuell oversikt over programmets funksjonalitet.

I enkelte oppgaver kan du få bruk for å formatere et kronebeløp. Du kan da bruke

      NumberFormat kroneformat = NumberFormat.getCurrencyInstance();

og formatere beløpet på følgende måte:

      double beløp = < tilordnes verdi >;
      String tekst = kroneformat.format(beløp);

OPPGAVE 1

Nedenfor ser du den abstrakte klassen Forsikring:

public abstract class Forsikring
{
  public static final int TOTALKUNDERABATT = 20;  //20% rabatt for totalkunder
  public static final int BIL = 1, HUS_INNBO = 2, REISE = 3;
  public abstract double premie();
  public abstract String toString();
  public abstract int getForsikringstype();
}

Denne klassen skal være superklasse for de konkrete klassene BilForsikring, HusInnboForsikring og ReiseForsikring.
I denne oppgaven skal du imidlertid kun programmere klassen BilForsikring.

a) Hvordan vil klassedefinisjonens første linje se ut når BilForsikring skal være en direkte subklasse til den abstrakte klassen Forsikring?

Anta så at Forsikring IKKE er en abstrakt klasse, men i stedet et interface

public interface Forsikring
{
  public static final int TOTALKUNDERABATT = 20;  //20% rabatt for totalkunder
  public static final int BIL = 1, HUS_INNBO = 2, REISE = 3;
  public abstract double premie();
  public abstract String toString();
  public abstract int getForsikringstype();
}

og at BilForsikring skal implementere dette interfacet.
Hvordan vil nå klassedefinisjonens første linje se ut?
( NB! Resten av programmet vil forbli likt enten vil velger den ene eller den andre måten å definere BilForsikring på.)


Klassen BilForsikring skal ha følgende datafelt:

  • En konstant PRIS_PR_KM lik 1.50
  • som angir at forsikringen koster kr.1,50 pr. kjørte km
  • Biltype
    for eksempel Toyota Yaris
  • Registreringsår
  • årstall for første gangs registrering
  • Registreringsnummer
  • dvs bilnummeret, for eksempel DL12345
  • Kjørelengde
  • dvs forventet årlig kjørelengde i hele antall km
  • Bonus
  • Bonus er en rabatt som kundene opparbeider seg
    Hvis bonusen er 10 tilsvarer det at kunden får 10% rabatt på bilforsikringen
  • b) Deklarer klassens datafelt og programmer en konstruktør som utfører nødvendig initialisering av datafeltene.
    Programmer så en get-metode for forsikringstypen. Hint: se Forsikring

    c) Du skal nå programmere resten av metodene i klassen BilForsikring:

    public double premie()
    {
      < Beregner og returnerer årlig bilforsikringspremie:
        Kunden skal betale PRIS_PR_KM for hver km av forventet kjørelengde.
        Hvis kunden har opparbeidet seg bonus, skal denne prosentandelen trekkes
        fra. >
    }
    
    public String toString()
    {
      < Metoden skal returnere en tekst som forteller hva slags forsikringtype
        det dreier seg om, verdiene til datafeltene, samt den årlige
        bilforsikringspremien.
        Hint! Ta gjerne en titt på utskriften i tekstområdet på bilde i oppgave 4. >
    }
    

    OPPGAVE 2

    Et objekt av typen ForsikringsKunde skal lagre all nødvendig informasjon om en enkelt forsikringskunde og vedkommendes forsikringer. Nedenfor ser du en skisse av klassen:

    import java.text.NumberFormat;
    
    public class ForsikringsKunde
    {
      private String navn;
      private String fakturaAdresse;
      private int forsikringsNr;
      private static int nesteNr = 1;
      public static final int MAX = 3; //Maks antall forsikringer kunden kan ha.
      private Forsikring[] forsikringer;
    
      < Konstruktøren skal utføre nødvendig initialisering av datafeltene,
        og opprette arrayen. ForsikringsKunden skal tildeles et unikt forsikringsNr
        som blir generert automatisk. Kontruktøren skal ta i mot kundens navn og
        fakturaAdresse som parametere. >
    
      < get-metoder for navn og forsikringsNr. >
    
      public boolean erForsikret(Forsikring f)
      {
        < Metoden skal undersøke om kunden allerede har opprettet den type
          forsikring som parameteren f angir. I så fall skal metoden returnere
          true, i motsatt fall skal den returnere false. >
      }
    
      public String tegnForsikring(Forsikring f)
      {
        < Metoden skal opprette en ny forsikring på kunden, under forutsetning
          av at kunden ikke allerede har denne typen forsikring fra før.
          Returverdien skal inneholde en tekst med informasjon om utfallet av
          opprettelsen. >
      }
    
      public boolean totalkunde()
      {
        < Hvis en kunde har opprettet alle tre forsikringstyper, er kunden
          "totalkunde", og metoden skal returnere true. I motsatt fall skal
          metoden returnere false. >
      }
    
      public double premie()
      {
        < Metoden skal beregne, og returnere, det kunden skal betale for alle
          forsikringene til sammen. Hvis kunden er "totalkunde", dvs har både
          hus/innbo- , bil- og reiseforsikring, skal vedkommende få
          TOTALKUNDERABATT (Hint: Se klassen Forsikring). >
      }
    
      public String toString()
      {
        < Metoden skal returnere en tekst som inneholder alle data som er lagret
          om kunden og vedkommendes forsikringer. Det skal skrives ut hva hver
          enkelt forsikring koster, og det årlige betløpet kunden må betale.
          Hvis kunden er "totalkunde", skal det gis informasjon om det og om
          hvor mye det er gitt i rabatt. >
      }
    
    } //end of class ForsikringsKunde
    

    a) Programmer klassens konstruktør og get-metoder.

    b) Programmer metoden erForsikret(Forsikring f).

    c) Programmer metoden tegnForsikring(Forsikring f).

    d) Programmer metoden totalkunde().

    e) Programmer metoden premie().

    f) Programmer metoden toString().

    OPPGAVE 3

    Alle forsikringskundene er samlet i et kunderegister. Klassen ForsikringsRegister representerer dette registeret. Nedenfor ser du en skisse av klassen:

    import javax.swing.JTextArea;
    
    public class ForsikringsRegister
    {
      public static final int SIZE = 1000;
      public static final int UTVIDELSE = 10;
      private ForsikringsKunde[] kunderegister = new ForsikringsKunde[SIZE ];
    
      private int indeks(int nr)
      {
        < Metoden skal returnere indeksen til det ForsikringsKunde-objektet
          som har samme forsikringsNr som parameteren nr angir. Hvis et slikt
          objekt ikke finnes i kunderegisteret, skal metoden returnere -1. >
      }
    
      public ForsikringsKunde finnKunde(int nr)
      {
        < Metoden skal returnere det ForsikringsKunde-objektet som har samme
          forsikringsNr som parameteren nr angir. Hvis et slikt objekt ikke
          finnes i kunderegisteret, skal metoden returnere null.
          Krav: Du SKAL bruke indeks-metoden når du programmerer denne. >
      }
    
      public void utvidRegister()
      {
        < Metoden skal utvide arrayen kunderegister med så mange elementer som
          UTVIDELSE angir. >
      }
    
      public boolean nyKunde(ForsikringsKunde k)
      {
        < Metoden skal sette parameteren k inn i kunderegisteret, under forutsetning
          av at denne kunden ikke er registrert der fra før. Hvis kunderegisteret er
          fullt, skal det utvides med det antall elementer som UTVIDELSE angir, og
          deretter skal k settes inn. Returverdien skal angi om innsettingen var
          vellykket eller ikke. >
      }
    
      public ForsikringsKunde fjernKunde(int nr)
      {
        < Hvis det i kunderegisteret finnes et ForsikringsKunde-objekt med samme
          forsikringsNr som parameteren nr angir, skal dette fjernes fra
          kunderegisteret. Det fjernede objektet skal deretter returneres fra
          metoden. Hvis det ikke finnes et slikt objekt, skal metoden returnere
          null. >
      }
    
      public void visRegister(JTextArea a)
      {
        < Metoden skal i tekstområdet som parameteren a angir plassere all
          informasjon som er lagret i kunderegisteret om forsikringskundene
          og deres forsikringer >
      }
    
    } //end of class ForsikringsRegister
    
    

    a) Programmer metodenene indeks(int nr) og finnKunde(int nr).

    b) Programmer metoden utvidRegister().

    c) Programmer metoden nyKunde(ForsikringsKunde k).

    d) Programmer metoden fjernKunde(int nr).

    e) Programmer metoden visRegister(JTextArea a).

    OPPGAVE 4

    Nedenfor ser du et bilde av programmets brukergrensesnitt, etterfulgt av en skisse av klassen ForsikringsVindu.

    < import-setninger >
    
    public class ForsikringsVindu extends JFrame
    {
      private JTextField kundefelt, fakturafelt, nrfelt;
      private JTextField adressefelt, boligtypefelt, arealfelt, verdifelt, sumfelt;
      private JTextField biltypefelt,regårfelt, regnrfelt, lengdefelt, bonusfelt;
      private JTextField reisesumfelt;
      private JTextArea utskrift;
      private JButton regKunde, visKunde, slettKunde, regBil, regHusInnbo, regReise,
                      visAlle;
    
      ForsikringsRegister kunderegisteret = new ForsikringsRegister();
    
      public ForsikringsVindu()
      {
        super("TRYGG FORSIKRING");
        Lytter lytter = new Lytter();
        < Oppretter brukergrensesnittet og knytter knappene til lytteobjektet. >
        setSize(900, 630);
        setVisible(true);
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      }
    
      public void registrerNyKunde()
      {
        < Metoden registrerer en ny kunde, under forutsetning av at kunden
          ikke allerede er registrert i selskapet. I tekstområdet utskrift
          gis det beskjed om utfallet av registreringen.
          Merk! Denne metoden skal du IKKE programmere! >
      }
    
      public void visKunde()
      {
        < Metoden skriver i tekstområdet utskrift all informasjon som er
          lagret om en kunde ut fra vedkommendes kundenummer. Hvis kunden med
          et slikt kundenummer ikke er registrert, gis det i tekstområdet
          utskrift beskjed  om det.
          Merk! Denne metoden skal du IKKE programmere! >
      }
    
      public void slettKunde()
      {
        < Metoden sletter en kunde utfra vedkommendes kundenummer, under
          forutsetning av at det finnes en kunde med et slikt kundenummer.
          I tekstområdet utskrift gis det beskjed om utfallet av slettingen.
          Merk! Denne metoden skal du IKKE programmere!>
      }
    
      public void visKunderegister()
      {
        < Metoden  viser i tekstområdet utskrift all informasjon som er lagret
          i kunderegisteret om forsikringskundene og deres forsikringer.
          Merk! Denne metoden skal du IKKE programmere! >
      }
    
      public void tegnBilForsikring( ForsikringsKunde k )
      {
        < Metoden skal lese inn nødvendig informasjon for å opprette
          bilforsikring for den kunden som parameteren k angir, under
          forutsetning av at vedkommende ikke har bilforsikring i selskapet
          fra før. I tekstområdet utskrift skal det gis melding om utfallet
          av opprettelsen. >
      }
    
      public void tegnHusInnboForsikring( ForsikringsKunde k )
      {
        < Metoden leser inn nødvendig informasjon for og oppretter
          hus- og innboforsikring for den kunden som parameteren k angir,
          under forutsetning av at vedkommende ikke har hus- og innboforsikring
          fra før. I tekstområdet utskrift gis det melding om utfallet
          av opprettelsen.
          Merk! Denne metoden skal du IKKE programmere! >
      }
    
      public void tegnReiseForsikring( ForsikringsKunde k )
      {
        < Metoden leser inn nødvendig informasjon for å opprette
          reiseforsikring for den kunden som parameteren k angir, under
          forutsetning av at vedkommende ikke har reiseforsikring fra
          før. I tekstområdet utskrift gis det melding om utfallet
          av opprettelsen.
          Merk! Denne metoden skal du IKKE programmere! >
      }
    
      public void tegnForsikrning( int type )
      {
        < Metoden skal opprette forsikring av den typen som parameteren
          type angir, (Hint: Se klassen Forsikring), for kunden med det
          kundenummer som brukeren av programmet har skrevet inn, under
          forutsetning av at det finnes en slik kunde i kunderegisteret.
          Hvis det ikke finnes en slik kunde, skal det i tekstområdet
          utskrift gis medling om det. >
      }
    
      < private lytte-klasse Lytter >
    
    } //end of class ForsikringsVindu
    

    a) Programmer metoden tegnBilForsikring( ForsikringsKunde k ).

    b) Programmer metoden tegnForsikrning( int type ).

    c) Programmer den indre private lytteklassen Lytter slik at den fanger klikkene på knappene i vinduet og sørger for at de riktige metodene blir utført.

    Til orientering: Klassen TryggForsikring innholder main-metoden og starter applikasjonen:

    public class TryggForsikring
    {
      public static void main(String[] args)
      {
        ForsikringsVindu vindu = new ForsikringsVindu();
    
      }
    }
    

    SLUTT