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

 

 

 

Boliglån

Oppgaven går ut på å lage deler av et program til bruk for en tenkt bank som låner ut penger til finansiering av boliger. Banken tilbyr to typer boliglån: serielån og annuitetslån. For serielånene er avdragene like gjennom hele låneperioden, mens rentene man betaler avtar etter hvert som gjelden minsker. Dermed vil terminbeløpene avta etter hvert. For annuitetslånene forholder det seg annerledes, der vil terminbeløpene holdes konstante gjennom hele låneperioden, mens forholdet mellom renter og avdrag vil forandre seg fra termin til termin. Ved begynnelsen av låneperioden betaler man mest renter, mens man betaler mest avdrag mot slutten av perioden. Hva lånet vil koste er i tillegg avhengig av hvilken rente man får. Beregning av renten vil igjen være avhengig av sikkerheten man har. Med sikkerhet menes verdien av det man pantsetter når man tar opp lånet. Som oftest vil dette være verdien av boligen man skal låne penger til. Hvis lånet ligger innenfor 60% av boligens verditakst får man en lavere rente enn om lånet er på mer enn 60% av verditaksten.
Programmet skal kunne registrere lån og gi mulighet for å nedbetale/innfri dem. I tillegg skal programmet ha en lånekalkulator som skriver ut totalkostnadene for de forskjellige typer lån, og oversikter over kostnadene pr. år gjennom hele låneperioden. Ut fra denne informasjonen kan lånekunden vurdere hvilken lånetype som passer best i sitt tilfelle, før lånet registreres.

Ut fra programmets problemstilling kan man få et inntrykk av at det er mange kompliserte beregninger som skal utføres. Disse beregningene trenger du imidlertid ikke bekymre deg for, da du ikke vil bli bedt om å programmere dem. Beregningene blir utført av metoder som er oppgitt i oppgaven. Disse skal du ikke programmere, men du vil få bruk for å kalle dem opp. Merk deg derfor hva de gjør, hva de har som parametre, samt hva de returnerer.

Løsningene som er valgt i denne eksamensoppgaven er ikke nødvendigvis de beste sett fra et programmeringsmessig synspunkt. Du skal likevel gjøre de forutsetninger som er beskrevet, og svare nøyaktig på det det er spørsmål om, fordi hver enkelt oppgave har til hensikt å teste ut forskjellige sider ved kandidatens programmeringskunnskaper.

Programmet består av et klassehierarki med den abstrakte superklassen Boliglån og subklassene Serielån og Annuitetslån. De registrerte lånene skal lagres i et register av typen Låneregister. Programmet har to vinduer som kommuniserer med brukeren, RegistreringsGUI og NedbetalingsGUI. Programmets main-metode ligger i klassen Bank. De forskjellige deloppgavene inneholder mere informasjon.

Oppgave 1

Nedenfor finner du en skisse over den abstrakte klassen Boliglån. Denne klassen inneholder det som er felles for subklassene Annuitetslån og Serielån.


public abstract class Boliglån
{
  private static long nestenr = 11001500000L;
  private static double basisrente = 0.029; // dvs. 2.9 %
  private static double rentetillegg = 0.005; // dvs. 0.5 %
  private static final double SEKSTIPROSENT = 0.6;
  // NB! Datafeltene over skal ikke initialiseres av konstruktøren.

  private long lånenr;
  private String navn;
  private double lånebeløp;
  private double restlån;
  private int verditakst;
  private int nedbetalingstid;  // i antall hele år
  private double rente;  // eks. 0.04 tilsvarer 4%

  < Konstruktør med parametre som gir startverdier for dataene som
    skal registreres for hvert lån, med unntak av lånenummer og rente.
    Lånet skal tildeles et unikt lånenummer som skal genereres automatisk.
    Lånenumrene skal ha verdier fra og med 11001500001 og oppover.
    Lånets rente skal bestemmes på grunnlag av lånebeløp og verditakst,
    se metoden under. >

  public static double bestemRente( double beløp, double takst )
  {
    double sikkerhet;
    if ( takst > 0 )
      sikkerhet = beløp / takst;
    else
      return basisrente + rentetillegg;
    if ( sikkerhet <= SEKSTIPROSENT )
      return basisrente;
    else
      return basisrente + rentetillegg;
  }

  < get-metoder for datafeltene lånenr, navn, lånebeløp, restlån,
    verditakst, nedbetalingstid og rente. >

  public boolean nedbetal( double beløp )
  {
    < Metoden skal redusere restlånet med  beløpet som parameteren angir,
      under forutsetning av at det er mindre eller lik restlånet.
      Hvis så er tilfelle skal  metoden returnere true, i motsatt fall
      skal den returnere false. >
  }

  abstract public String kontoutskrift();
} // end of class Boliglån

a)

Programmer klassens konstruktør.

b)

Programmer get-metoder for datafeltene navn, lånenr og restlån, samt metoden
public boolean nedbetal( double beløp ).
NB! Du er ikke blitt bedt om å programmere alle get-metodene, kun tre av dem. Videre i oppgaven skal du likevel forutsette at du har tilgang til alle.

Oppgave 2

Nedenfor finner du en skisse over klassen Annuitetslån, som er en subklasse til klassen Boliglån.
NB! Merk deg alle metodene i klassen, også dem du ikke blir bedt om å programmere.

public class Annuitetslån extends Boliglån
{
  private double kostnadPrÅr;

  < Konstruktør med parametre som mottar startverdier for dataene som skal
    registreres for lånet, med unntakt av lånenummer og renter.
    Det må også beregnes hva lånet vil koste pr år. >

  public static double beregnKostnadPrÅr( double lånebeløp, int år, int takst )
  {
    double rentefot = bestemRente( lånebeløp, takst );
    double q = 1 + rentefot;
    double qn = Math.pow( q, år );
    return lånebeløp * qn * ( q - 1 ) / ( qn - 1 );
  }

  public static double totalkostnad( double lånebeløp, int år, int  takst )
  {
    < Metoden skal returnere summen av renter og avdrag som skal betales gjennom
      hele nedbetalingsperioden.(Tips: Bruk metoden over.) >
  }

  public boolean nedbetal( double beløp )
  {
    < Metoden skal redefineres slik at den i tillegg til å nedbetale lånet med
      beløpet som parameteren angir, også tildeler datafeltet kostnadPrÅr ny verdi,
      ved at annuitetslånets kostnad pr år beregnes på nytt. (Se metoden over).
      Den nye beregningen skal baseres på den restlånet som nå gjennstår.
      Returverdien angir om nedbetalingen har funnet sted eller ikke. >
  }

  public String kontoutskrift()
  {
    < Metoden skal returnere en tekst som inneholder låntakerens navn, lånenr,
      type lån, restlån samt utgifter for lånet neste år. >
  }

  public static String[] betalingsplan( double lånebeløp, int år, int takst )
  {
    < Metoden genererer og returnerer en nedbetalingsplan annuitetslån. Hvert
      String-element i arrayen som returneres fra metoden tilsvarer en linje
      i betalingsplanen som er vist på bildet i oppgave 4.
      NB! Skal ikke programmeres! >
  }
} // end of class Annuitetslån

a)

Programmer klassens konstruktør og metoden
public static double totalkostnad( double lånebeløp, int år, int takst ).

b)

Programmer/redefiner metoden public boolean nedbetal( double beløp ).
Programmer også metoden public String kontoutskrift().

Nedenfor ser du klassen Serielån. Klassen skal IKKE programmeres, men du trenger å kjenne til den i senere oppgaver.

public class Serielån extends Boliglån
{
  public Serielån( String n, double beløp, int år, int takst )
  {
    < Initialiserer datafeltene >
  }

  public static double totalkostnad( double lånebeløp, int år, int takst )
  {
    < Metoden beregner og returnerer totalkostadene for et serielån,
      dvs. summen av renter og avdrag som skal betales gjennom hele
      nedbetalingsperioden. Metoden blir brukt av betalingsplan. >
  }

  public double nesteÅrsBeløp()
  {
    < Metoden beregner og returnerer neste års beløp.
      Metoden blir brukt av totalkostnad og betalingsplan. >
  }

  public static String[] betalingsplan( double lånebeløp, int år, int takst )
  {
    < Metoden genererer og returnerer en nedbetalingsplan for serielån.
      Hvert String-element i arrayen som returneres fra metoden tilsvarer
      en linje i betalingsplanen som er vist på bildet i oppgave 4. >
  }

  public String kontoutskrift()
  {
    < Metoden returnerer en tekststreng som inneholder låntakerens navn,
      lånenr, type lån, restlån samt utgifter for lånet neste år. >
  }
} // end of class Serielån

Oppgave 3

Alle boliglånene skal lagres i bankens låneregister. Nedenfor ser du en skisse av klassen Låneregister:

public class Låneregister
{
  public static final int KAPASITET = 100;
  public static final int SERIE = 1;
  public static final int ANNUITET = 2;

  private Boliglån[] kontoer = new Boliglån[ KAPASITET ];

  public int getIndeks( long lånenr )
  {
    < Metoden skal returnere arrayindeksen til boliglånsobjektet
      med samme lånenummeret som parameteren angir. Hvis et slikt
      ikke finnes i arrayen, skal metoden returnere -1. >
  }

  public Boliglån finnKonto( long nr)
  {
    < Metoden returnerer (en referanse til) boliglånsobjektet med samme
      lånenummeret som parameteren angir. Hvis et slikt ikke finnes, returnerer
      metoden null. NB! Skal IKKE programmeres, men du får bruk for den senere. >
  }
  


  public double getRestlån( long lånenr )
  {
    < Metoden returnerer restlånet til boliglånet med samme lånenummeret
      som parameteren angir. Hvis et slikt ikke finnes i registeret, skal
      metoden returnere 0.0 >
  }

  public Boliglån nyttLån( String navn, double beløp, int år, int takst, int type )
  {
    < Metoden tar imot låntakerens navn, lånebeløpet, antall år, verditakst
      og lånetype som parameter. Hvis lånetypen er lik SERIE skal et objekt
      av typen Serielån opprettes, og hvis lånetypen er ANNUITET skal et objekt
      av  typen Annuitetslån opprettes. Det  nye låneobjektet skal så settes
      inn i arrayen på første ledige plass. Metoden skal til slutt returnere
      (en referanse til) det nye objektet. Hvis arrayen er full, eller parameteren
      type er forskjellig fra både SERIE og ANNUITET, skal metoden returnere null. >
  }

  public String[] oversiktAlleLån()
  {
    < Metoden skal returnere en array av tekststrenger med opplysninger
      om alle boliglån i registeret. Hvert element i arrayen skal inneholde
      informasjon om hvert enkelt boliglån (dvs. låntakerens navn, lånenr,
      type lån, restlån samt utgifter for lånet neste år.). >
  }

  public boolean nedbetal( long lånenr, double beløp )
  {
    < Metoden skal nedbetale boliglånet, med samme lånenummer som parameteren
      lånenr, med det beløp som parameteren beløp angir, under forutsetning av
      at dette lånet finnes i registeret. Returverdien skal angi om dette lot
      seg gjøre  eller ikke. Hvis hele lånet er innfridd, skal boliglåneobjektet
      i tillegg slettes. >
  }
} // end of class Låneregister

a)

Programmer metodene public int getIndeks( long lånenr )
og public double getRestlån( long lånenr ).

b)

Programmer metoden
public Boliglån nyttLån( String navn, double beløp, int år, int takst, int type ).

c)

Programmer metoden public String[] oversiktAlleLån().

d)

Programmer metoden public boolean nedbetal( long lånenr, double beløp ).

Oppgave 4

Nedenfor ser du to bilder av ulike tilstander av vinduet RegistreringsGUI. I det venstre er det trykket på lånekalkulator-knappen og i det høyre er det trykket på knappen for å registrere et nytt lån.

Som du ser skal det være mulig å få skrevet ut en betalingsplan for et potensielt lån, slik at lånetakeren kan sammenligne hva de forskjellige lånene vil koste totalt sett, og ikke minst hva lånet koster pr år, FØR vedkommende bestemmer seg.

 

Under finner du skissen av den tilhørende klassen.


< import-setninger >

public class RegistreringsGUI extends JFrame
{
  private JTextField typefelt, beløpsfelt, tidsFelt, takstfelt, navnefelt, lånenrFelt;
  private JButton visPlan, nyttLån, oversikt;
  private JTextArea utskrift;
  private Låneregister register;

  public RegistreringsGUI(Låneregister b)
  {
    register = b;

    < Setter opp brukergrensesnittet >

    < Oppretter et lytteobjekt >

    < Knytter knappene til lytteobjektet >
  }

  private void skrivPlan(String [] plan)
  {
    < Metoden skal skrive innholdet i arrayen den mottar som paramterer ut
      i tekstområdet utskrift, slik at hvert arrayelement kommer på en egen linje. >
  }

  public void visBetalingsplan()
  {
    < Metoden skal hente nødvendig informasjon fra vinduets tekstfelter,
      og sørge for at en betalingsplan, av den type lån brukeren har valgt,
      blir vist i tekstområdet utskrift, slik det er vist på bilde over.
      Tips: Bruk metoden skrivPlan! >
  }

  public void registrerNyttLån()
  {
    < Metoden skal registrere et nytt lån ut fra de data som finnes i de
      aktuelle tekstfeltene vinduet. Hvis registreringen lar seg utføre,
      skal det nye lånets lånenummer skrives ut til tekstfeltet lånenrFelt,
      og betalingsplanen for det nye lånet skal skrives ut i tekstområdet.
      I tillegg skal i et dialogvindu gis melding om registreringen lot
      seg utføre eller ikke. >
  }

  public void oversiktAlleLån()
  {
    < Metoden skal skrive ut informasjon om alle lånekontoene i registeret
      utskriftsområdet. NB! Skal ikke programmeres! >
  }

  < Private indre lytteklasse >

} // end of class RegistreringsGUI

a)

Programmer hjelpemetoden private void skrivPlan(String [] plan).
Programmer så metoden public void visBetalingsplan(). Her skal du gjøre bruk av hjelpemetoden du programmerte først.

b)

Programmer metoden public void registrerNyttLån().

c)

Programmer den private indre lytteklassen slik at den fanger opp hendelsene i vinduet og utfører de oppgavene som tilsvarer teksten på knappene.

Oppgave 5

Nedenfor ser du to bilder ulike tilstander av vinduet NedbetalingsGUI. I det venstre er det trykket på kontoutskrift-knappen og i det høyre er det trykket på knappen for å nedbetale et eksisterende lån.

 

Under finner du skissen av den tilhørende klassen.


< import-setnnger >

public class NedbetalingsGUI extends JFrame
{
  private JTextField lånenrFelt,beløpsfelt;
  private JButton nedbetal, visKontoutskrift;
  private JTextArea utskrift;
  private Låneregister register;

  public NedbetalingsGUI(Låneregister b)
  {
    register = b;

    < Setter opp brukergrensesnittet >

    < Oppretter lytteobjekt >

    < Knytter knappene til lytteobjektet >
  }

  public void kontoutskrift()
  {
    < Metoden skal skrive ut lånekonto-informasjon om lånet med  lånenummeret
      lik det som er skrevet i inn i lånenrFelt. >
  }

  public void nedbetalLån()
  {
    < Metoden skal lese lånenummer og beløp fra vinduets tekstfelter
      og nedbetale lånet. Hvis dette lar seg gjøre skal det i tekstområdet
      skrives hva restlånet er etter nedbetalingen. Hvis lånet ble slettet, som
      følge av at det ble innfridd, skal det gis melding om dette.
      Hvis nedbetalingen ikke lar seg utføre, skal det gis en feilmelding. >
  }

 < Privat indre lytteklasse >
}// end of class NedbetalingsGUI

a)

Programmer metoden public void kontoutskrift().

b)

Programmer metoden public void nedbetalLån().

Oppgave 6

a)

Programmet klassen Bank som inneholder main-metoden. Her skal du opprette et låneregister og de to vinduene, som er beskrevet i oppgave 4 og 5, slik at begge vinduene kommuniserer med samme låneregister.

 

SLUTT