AVDELING FOR INGENIØRUTDANNING

EKSAMENSOPPGAVE

Emne:
PROGRAMMERING
Emnekode:
LO 127 A
Faglig veileder:
Eva H.Vihovde
Kjetil Grønning
Grupper:
1AA, 1AB, 1AC, 1IA
Dato:
16.12.2008
Eksamenstid:
09.00 - 14.00
Eksamensoppgaven består av:   Antall sider (inkl. forsiden): 7   Antall oppgaver: 4 Antall vedlegg: Ingen 
Tillatte hjelpemidler: Ingen   
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.

Utarbeidet av (faglærer): Kontrollert av (en av disse): Studieleders/
Fagkoordinators underskrift:
Annen lærerSensorStudieleder/
Fagkoordinator
  
 
   





MEDIATEK

Du skal lage (deler av) et program som kan brukes av et mediatek. Et mediatek er et bibliotek der man i tillegg til bøker kan låne cd'er og dvd'er. Programmet skal administrere utlån og innlevering av objekter, samt kunne gi oversikt over hvilke bøker, cd'er og dvd'er som mediateket til enhver tid har inne. Det skal også være mulig å hente ut informasjon om den enkelte låner, og ikke minst få en oversikt over alle utlånte objekter, hvor de befinner seg og når de forventes innlevert. Av hensyn til oppgavens størrelse er programmet sterkt forenklet i forhold til det som normalt ville kreves av et slikt program. Vi har blant annet valgt å kun registrere ett eksemplar av hvert låneobjekt, slik at de lar seg identifisere ut fra sin tittel. Programmet lar seg imidlertid lett utvide med ny funksjonalitet.

Det er et felles krav for alle klassene som inngår i oppgaven at alle datafelter skal ha private aksess, med unntak av konstanter som bør være public og static. Der det ikke er spesifikt angitt hva datatypen skal være, må du selv velge en passende datatype.

Tidspunkter kan i oppgaven representeres som objekter av typen Date, som ligger i pakken java.util. Instruksjonen

    Date nå = new Date();

oppretter et Date-objekt som representerer tidspunktet for når instruksjonen blir utført. Dersom vi har to Date-objekter tid1 og tid2, så vil instruksjonen

long varighet = tid2.getTime() - tid1.getTime();

gi tidsavstanden i antall millisekund mellom de to tidspunktene. (Det er 3 600 000 millisekund i en time.)

Klassen SimpleDateFormat, som ligger i pakken java.text, kan brukes til å formatere Date-objekter for utskrift. Dersom for eksempel Date-objektet dato ble opprettet den 16. desember 2008 klokka 09.18, vil instruksjonene

    SimpleDateFormat df = new SimpleDateFormat("dd.MM.yy");
    String utskrift = df.format( dato );

gi tekststrengen "16.12.08".


Programmet skal kunne registrere objekter av tre typer: Bok, Cd og Dvd. Det som er felles for de tre datatypene er representert av den abstrakte super-klassen Utlånsobjekt som er gjengitt nedenfor.



OPPGAVE 1

import java.text.DateFormat;
import java.util.Date;

abstract class Utlånsobjekt
{
  private String tittel;
  private Date utlånsdato = null;
  private int antallUtlånsdager;
  private Låner låner = null;              // Referanse til personen som låner objektet
  public static final double GEBYR = 50.0;

  < Konstruktør som mottar låneobjektets tittel
    og antall utlånsdager via konstruktørens parametre. >

  < get-metoder >


  public boolean utlånt()
  {
     < Metoden skal avgjøre om objektet er utlånt eller ikke. >
  }

  public Date innleveringsdato()
  {
     long innlevering = utlånsdato.getTime() + (long)antallUtlånsdager*3600000*24;
     return new Date(innlevering);
  }

  public String toString()
  {
     < Hvis objektet er utlånt skal metoden returnere informasjon om hvem det er
       utlånt til og dagen det forventes innlevert. I motsatt fall skal metoden
       returnere en tom tekststreng. >
  }


  public boolean lånUt( Låner l )
  {
     < Hvis objektet ikke allerede er utlånt, skal metoden registrere personen, som
       parameteren angir, som låner av objektet, samt registrere utlånsdatoen.
       Returverdien skal angi om utlånet lar seg utføre eller ikke. >
  }

  public double innlevering()
  {
     < Metoden skal registrere at objektet ikke lenger er utlånt. Hvis innleveringen
       har funnet sted etter at innleveringsdatoen er passert, skal metoden returnere
       gebyret fastsatt av konstanten GEBYR. I morsatt fall skal metoden returnere 0.0  >
  }

} // end of class Utlånsobjekt

a) Programmer klassens konstruktør, get-metoder for tittel og låner, samt metoden
public boolean utlånt().

b) Programmer metoden public String toString().

c) Programmer metoden public boolean lånUt( Låner l ).

d) Programmer metoden public double innlevering().

 

OPPGAVE 2

Klassen Bok er en direkte subklasse til Utlånsobjekt. Foruten alle datafelt og metoder klassen arver fra Utlånsobjekt skal klassen ha følgende datafelt:

Klassen skal ha en konstruktør for nødvendig initialisering av datafeltene. Videre skal klassen ha en toString()-metode som returnerer all informasjon som er lagret om utlånsobjektet, dvs. bokas tittel, forfatter, sjanger og språk, om den er utlånt og i så fall til hvem, samt når den eventuelt forventes innlevert.

a)Programmer klassen Bok.

 

OPPGAVE 3

En person som ønsker å låne noe i mediateket, må registreres som låner. Klassen Låner skal brukes til å lagre opplysninger om vedkommende. Nedenfor ser du en skisse av klassen:

public class Låner
{
  	private String navn;
  	private String[] låneobjekter; //Arrayen skal inneholde titlene til utlånsobjektene
  	private double skyldigBeløp;  //Summen av eventuelle pålagte gebyrer

  	< Konstruktør som skal motta lånerens navn og lengden på arrayen låneobjekter
  	  som parametre. Nødvendig initialisering skal utføres. >

  	< get-metode for navn >

 	public double betaling(double b)
 	{
 	   < Metoden skal øke beløpet låneren skylder med den verdi parameteren angir,
 	     og deretter returnere skyldig beløp fra metoden. >
 	}

  	public int finnLåneobjekt(String tittel)
  	{
   	   < Metoden skal undersøke om personen (låneren) låner objektet som parameteren
   	     tittel angir. Hvis så er tilfelle skal metoden returnere indeksen
   	     til der dette ligger lagret i arrayen. Hvis ikke skal den returnere -1. >
   	}

  	public String registrerUtlån(String tittel)
  	{
  	    < Metoden skal, om mulig, registrere at låneren nå låner objektet som
  	      parameteren tittel angir.
  	      Returverdien skal gi informasjon om dette lar seg gjøre eller ikke. >
  	}

  	public String innlevering(String tittel, double b )
  	{
  	    < Metoden skal registrere at objektet som parameteren tittel angir
  	      ikke lenger lånes av  personen (låneren) og øke vedkommendes skyldige
  	      beløp med det parameteren b angir. Returverdien skal gi informasjon
  	      om at objektet er innlevert og om hvor mye personen nå skylder. >
  	}

  	 public String toString()
  	 {
  	    <  Metoden skal returnere en tekst som inneholder all informasjon
  	       som er lagret om personen (låneren). >
  	 }
 }// end of class Låner

a) Programmer klassens konstruktør og get-metoden for navn.

b) Programmer metoden public int finnLåneobjekt(String tittel).

c) Programmer metoden public String registrerUtlån(String tittel).

d) Programmer metoden public String innlevering(String tittel, double b ).

e) Programmer metoden public String toString().

Utlånsobjektene og lånerne skal lagres i to registere. På neste side ser du skisser av de to klassene som implementerer Utlånsregister og Personregister. Du skal IKKE programmere noen av dem, men du vil i oppgave 4 få bruk for å kalle opp metodene som de inneholder. Merk deg derfor hva de omtalte metodene utfører, hvilke parametere de har og hva de returnerer. (Du trenger ikke kjenne til hvordan de er implementert for å bruke dem.)

 public class Utlånsregister
 {
    public final static int MAX = 100;
    public final static int UTLÅNSTID = 30;
    private Utlånsobjekt[] låneobjekter;
    private int antall;

    public Utlånsregister()
    {
       < Oppretter et register med Utlånsobjekt-objekter. >
    }

    public Utlånsobjekt finnLåneobjekt(String tittel)
    {
       < Metoden returnerer, om mulig, det objektet som har samme tittel som parameteren
         tittel angir. Hvis et slikt objekt ikke finnes i registeret
         returnerer metoden null. >
    }

    public String cdListe()
    {
       < Metoden returnerer en liste over alle cd'er som ikke er utlånt. >
    }

    public String dvdListe()
    {
       < Metoden returnerer en liste over alle dvd'er som ikke er utlånt. >
    }

    public String bokListe()
    {
       < Metoden returnerer en liste over alle bøker som ikke er utlånt.  >
    }

    public String utlånteObjekter()
    {
       < Metoden returnerer en liste over alle utlånte objekter. >
    }

} // end of class Utlånsregister


public class Personregister
{
   private Låner[] lånere;
   private int antall;
   public final static int MAX_UTLÅN = 5;

   public Personregister()
   {
      < Oppretter et register med Låner-objekter. >

   }

   public Låner finnLåner(String navn)
   {
      < Metoden returnerer, om mulig,  det objektet som har samme navn som parameteren
        navn angir. Hvis et slikt objekt ikke finnes i registeret
        returnerer metoden null. >
   }

   public String lånerInformasjon(String navn)
   {
      < Metoden returnerer, om mulig,  all informasjon som er lagret om personen som
        parameteren navn angir. Hvis personen ikke finnes i registeret
        skal metoden returnere "\nIngen informasjon om " + navn; >
   }

 }// end of class Personregister

 

OPPGAVE 4

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

< import-setninger >

public class MediatekVindu extends JFrame
{
  private Personregister pReg;
  private Utlånsregister uReg;
  private JTextField navnefelt, tittelfelt;
  private JButton utlån, innlevering, dvdListe, cdListe,
                  bokListe, utlånsliste,lånerInfo;
  private JTextArea display;

  public MediatekVindu()
  {
     super("MEDIATEK");
     pReg = new Personregister();
     uReg = new Utlånsregister();
     Lytter lytter = new Lytter();

     < Oppretter brukergrensesnittet og knytter knappene til lytteklassen. >

  }

  public void lånUt()
  {
     < Metoden skal registrere et utlån av et objekt under forutsetning av at både
       låneren og objektet finnes i mediatekets registere, at objektet ikke er utlånt
       fra før, og at låneren ikke allerede har lånt det maksimale antallet objekter.
       Utfallet av låneforsøket skal skrives i tekstområdet display.  >
  }

  public void leverInn()
  {
     < Metoden skal registrere at et utlånsobjekt blir innlevert under forutsetning
       av at både låneren og objektet finnes i mediateket.Hvis innleveringen gikk bra
       skal det i tekstområdet display skrives informasjon om det og hva
       låneren eventuelt skylder. I motsatt fall skal det skrives informasjon om hvorfor
       innleveringen ikke lot seg utføre. >
   }

   public void cdListe()
   {
      < Metoden skal i  tekstområdet display skrive en liste over alle cd'er
        som ikke er utlånt. >
   }

   public void dvdListe()
   {
      < Metoden skal i  tekstområdet display skrive en liste over alle dvd'er
        som ikke er utlånt. >
   }

   public void bokListe()
   {
      < Metoden skal i  tekstområdet display skrive en liste over alle bøker
        som ikke er utlånt.  >
   }

   public void lånerInfo()
   {
      < Metoden skal i tekstområdet display skrive informasjon om ønsket låner. >
   }

   public void utlånsliste()
   {
      < Metoden skal i  tekstområdet display skrive en liste over alle låneobjekter
        som er utlånt. >
   }

   private class Lytter ....
   {
      < Implementasjon av lytteklassen.  >

   } // end of class Lytter


}// end of class MediatekVindu

a) Programmer metoden public void lånUt().

b) Programmer metoden public void leverInn().

c) Programmer metodene public void cdListe(), public void lånerInfo() og public void utlånsliste().

d) Programmer den private indre lytteklassen Lytter.

SLUTT