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 går 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 uklar, kan du gjøre dine egne forutsetninger. Gjør i så fall rede for
disse.
- Ved sensur vil alle delpunktene telle likt.
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