AVDELING FOR INGENIØRUTDANNING

EKSAMENSOPPGAVE

Emne:
PROGRAMMERING
Emnekode:
LO 125 A
Faglig veileder:
Eva Vihovde
Grupper:
1AA, 1AB, 1AC, 1IA, 1IB, 1IC, A (ØKS)
Dato:
18.02.2004
Eksamenstid:
09.00 - 14.00
Eksamensoppgaven består av:   Antall sider (inkl. forsiden): 7  Antall oppgaver: 5 Antall vedlegg: 0 
Tillatte hjelpemidler:   Alle trykte og håndskrevne
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
Eva Vihovde Kjetil Grønning 
 
   

FILMUTLEIE

I denne oppgaven skal du lage deler av et program som skal administrere utleie av filmer til personlige kunder. (Det kan dreie seg om DVD- eller videofilmer, men programmet gjør ikke noe skille mellom disse.) Programmet skal kunne registrere filmer, med et antall kopier av hver film, registrere kunder, registrere utleie av filmer til kunder, og registrere innlevering. (For at oppgaven ikke skal bli for omfattende eller for komplisert, er programmet gjort en del enklere enn det som normalt ville kreves av et slikt program. Blant annet er det ikke tatt med noe om datoer og leietid. Det blir heller ikke foretatt noe lagring på fil.)

De enkelte deloppgavene nedenfor inneholder nærmere detaljer om hva du skal programmere.

NB! Du skal bare programmere de metoder (og konstruktører) som det konkret spørres om i de enkelte deloppgaver. Foran hver metode står en kommentar om hvilken virkning vedkommende metode skal ha. Merk deg denne nøye.



Oppgave 1

Klassen Film som er skissert nedenfor skal representere en film som kan leies.

public class Film
{
  private String tittel;    // Filmens tittel
  private double leiepris;  // Hva det koster å leie (en kopi av) denne filmen.
  private int antallInne;   // Antall kopier (eksemplarer) av denne filmen som
                                            // er inne (det vil si ikke er utleid) for øyeblikket

  < Konstruktør som initialiserer datafeltene via parametre. >

  < get-metoder for tittel og pris >

  // Registrerer den økning i antall kopier inne som parameteren indikerer.
  public void registrerNyeKopier( int antall ) { ... }

  // Returverdien indikerer om det er noen kopier inne av filmen.
  public boolean ledig() { ... }

  // Registrerer at det nå blir leid ut en kopi av filmen.
  public void leiUt() { ... }

  // Registrer at det nå blir levert inn en kopi av filmen.
  public void leverInn()  { ... }

  // Returnerer filmens tittel, antall kopier inne, og leiepris.
  public String toString()  { ... }
}

a) Programmer klassens konstruktør, de nevnte get-metodene, samt metoden registrerNyeKopier.

b) Programmer de resterende metodene som er nevnt.





Oppgave 2

Klassen Filmarkiv som er skissert nedenfor inneholder en samling av Film-objekter, samt metoder for å administrere disse.

public class Filmarkiv
{
  private Film[] filmregister;
  < eventuelle andre nødvendige datafelter >

  < Konstruktør som foretar nødvendig initialisering.
    Det skal være parameter for arrayens kapasitet. >

  // Registrerer et nytt objekt, i tilfelle det er plass.
   // Returverdien indikerer dette.
  public boolean regNyFilm( Film ny ) { ... }

  // Returnerer arrayindeks for filmen med gitt tittel,
   // -1 i tilfelle den ikke finnes.
  private int finnFilm( String tittel )  { ... }

  // Returverdien indikerer om det er noen kopier inne av filmen
   // med gitt tittel.
  public boolean ledig( String tittel )  { ... }

  // Registrerer økning i antall kopier inne av filmen med gitt tittel.
   // Returverdien indikerer om filmen ble funnet, slik at dette lot seg gjøre.
  public boolean regNyeKopier( String tittel, int antall ) { ... }

  // Registrerer utleie (av en kopi) av filmen med gitt tittel.
  public void leiUt( String tittel )  { ... }

  // Registrerer innlevering (av en kopi) av filmen med gitt tittel.
   // Returverdien indikerer leieprisen som skal betales.
   // Dersom filmen ikke blir funnet, skal metoden returnere 0.0.
  public double leverInn( String tittel ) { ... }

  // Returnerer for alle registrerte filmer opplysninger om filmens tittel,
   // antall kopier inne, og leiepris.
  public String toString() { ... }
}

a) Programmer klassens konstruktør, samt metodene regNyFilm og finnFilm.

b) Programmer metodene ledig og regNyeKopier.

c) Programmer metodene leiUt, leverInn og toString.


Oppgave 3

Klassen Kunde som er skissert nedenfor representerer en kunde som kan leie filmer.

public class Kunde
{
  public static final int MAKS = 5; // Det maksimale antall filmer kunden kan
                                                         // ha på leie samtidig.
  private static int nestenr = 1;  // For automatisk generering av kundenummer.
  private String navn;             // Kundens navn.
  private int kundenummer;         // Kundens unike kundenummer.
  private String[] filmer; // Inneholder titlene på filmene kunden har på utleie.
  private int antLeid;     // Antall filmer kunden har på utleie.

  < Konstruktør som foretar nødvendig initialisering. Kundens navn mottas
    som parameter. Kundenummer skal genereres automatisk fortløpende. >

  // Returnerer kundenummer. Skal ikke programmeres, men kan brukes.
  public int getKundenummer() { ... }

  // Returnerer kundenavn. Skal ikke programmeres, men kan brukes.
  public String getNavn() { ... }

  // Returverdien indikerer om kunden for øyeblikket har
   // leid filmen med den tittel som parameteren angir.
  public boolean harFilm( String tittel ) { ... }

  // Registrerer at kunden leier filmen med gitt tittel, forutsatt at kunden
   // ikke allerede har leid det maksimalt tillatte antall filmer.
   // Returverdien indikerer om leie av filmen ble godtatt.
  public boolean leiFilm( String tittel ) { ... }

  // Registrerer innlevering av filmen med gitt tittel. Dersom denne finnes,
   // skal tittelen fjernes fra arrayen filmer. Filmtitlene som arrayen
   // inneholder, skal til enhver tid ligge etter hverandre uten "huller"
   // fra starten av arrayen.
   // Returverdien skal indikere om innlevering ble registrert.
  public boolean leverInn( String tittel ) { ... }

  // Returnerer kundens navn, kundenummer og titlene på filmene som kunden
   // har på utleie for øyeblikket.
  public String toString() { ... }
}

a) Programmer klassens konstruktør, samt metodene harFilm og leiFilm.

b) Programmer metodene leverInn og toString.


Oppgave 4

Klassen Kunderegister som er skissert nedenfor inneholder et kundeobjekt for hver kunde som er registrert av programmet, samt metoder for blant annet utleie og innlevering.

public class Kunderegister
{
  public static final int MAXANTKUNDER = 1000; // Maksimalt antall kunder
                                               // som kan registreres.
  private Kunde[] kunder;
  < Eventuelle andre nødvendige datafelter >

  < Konstruktør som foretar nødvendig initialisering. >

  // Registerer en ny kunde, i tilfelle det er plass.
   // Returverdien indikerer om registrering ble foretatt.
   // Metoden skal ikke programmeres, men kan brukes.
  public boolean regNyKunde( Kunde ny ) { ... }

  // Returnerer Kunde-objekt med gitt kundenummer.
   // Returnerer null dersom dette ikke finnes.
   // Metoden skal ikke programmeres, men kan brukes.
  private Kunde finnKunde( int kundenr ) { ... }

  // Returnerer registrerte data for kunden med gitt kundenummer, eller
   // eventuelt melding om at denne ikke finnes.
  public String kundeinfo( int kundenr ) { ... }

  // Registrerer utleie av film med gitt tittel til kunde med gitt
   // kundenummer. Returverdien indikerer om dette gikk i orden.
  public boolean leiUtFilm( String tittel, int kundenr ) { ... }

  // Registrerer innlevering av film med gitt tittel fra kunde med gitt
   // kundenummer. Returverdien indikerer om dette lot seg utføre.
  public boolean leverInnFilm( String tittel, int kundenr ) { ... }

  // Returnerer en array som inneholder Kunde-objektene
   // for alle kunder som for øyeblikket har leid filmen med den tittel
   // som parameteren angir.
  public Kunde[] leietakere( String tittel )
}

a) Programmer klassens konstruktør, samt metodene kundeinfo og leiUtFilm.

b) Programmer metodene leverInnFilm og leietakere.



Oppgave 5

Nedenfor kan du se et bilde av programmets brukergrensesnitt.

Vinduet er definert av klassen Filmvindu som er skissert nedenfor.

public class Filmvindu extends JFrame
{
  private Filmarkiv filmer;
  public static final int MAXFILMTITLER = 100;
  private Kunderegister kunder;
  private JTextField knavn, knr, ftittel, prisfelt, kopifelt;
  private JButton regkunde, kInfo, leiUt, levInn, regfilm, regkopier, leietakere;
  private JTextArea utskrift;

  public Filmvindu()
  {
    < oppretter objekter for skjermkomponentene >

    Container c = getContentPane();
    c.setLayout( new FlowLayout() );
    c.add( new JLabel( "Kundenavn" ) );
    c.add( knavn );
    c.add( regkunde );
    c.add( new JLabel( "Kundenummer" ) );
    c.add( knr );
    c.add( kInfo );
    c.add( new JLabel( "Filmtittel" ) );
    c.add( ftittel );
    c.add( new JLabel( "Leiepris" ) );
    c.add( prisfelt );
    c.add( new JLabel( "Antall kopier" ) );
    c.add( kopifelt );
    c.add( leiUt );
    c.add( levInn );
    c.add( regfilm );
    c.add( regkopier );
    c.add( leietakere );
    c.add( new JScrollPane( utskrift ) );

    < oppretter lytteobjekt og registrerer dette for knappene >

    filmer = new Filmarkiv( MAXFILMTITLER );
    kunder = new Kunderegister();
  }

  // Metodene som er listet opp nedenfor blir aktivert når brukeren klikker
   // på de forskjellige knappene som er vist i programvinduet ovenfor.

   // Registrerer en ny kunde i datasystemet. Kundens navn leses inn.
   // Kundens tildelte kundenummer skal skrives ut i tekstfeltet for dette.
  public void registrerKunde() { ... }

  // Skriver ut i tekstområdet all registrert informasjon for kunden med det
   // kundenummer som leses inn.
  public void visKundeinfo() { ... }

  // Registrerer utleie av en film (forutsatt at den er ledig). Kundenummer
   // og filmtittel leses inn. I tekstområdet skal det skrives ut relevant
   // tilbakemelding til brukeren.
  public void leiUtFilm() { ... }

  // Registrerer innlevering av en film. Kundenummer og filmtittel leses inn.
   // I tekstområdet skal det skrives ut leieprisen som kunden må betale,
   // eller eventuelt annen relevant tilbakemelding i tilfelle innleveringen
   // ikke lot seg registrere.
  public void leverInnFilm() { ... }

  // Registrerer en ny film for utleie. Filmtittel, leiepris og antall kopier
   // leses inn. I tekstområdet skrives det ut relevant tilbakemelding
   // til brukeren.
  public void registrerNyFilm() { ... }

  // Registrerer nye kopier av en film som allerede er registrert.
   // Filmtittel og antall kopier leses inn.
   // I tekstområdet skrives det ut relevant tilbakemelding til brukeren.
  public void registrerNyeKopier() { ... }

  // I tekstområdet skrives det ut kundenumrene og navn for alle
   // kundene som har leid filmen som det leses inn tittel for.
  public void visLeietakere() { ... }

  private class Knappelytter implements ActionListener
  {
    < Definerer lytteobjekt for vinduets knapper.
       Skal ikke programmeres. >
  }
}

a) Programmer metodene registrerKunde og visKundeinfo.

b) Programmer metodene leiUtFilm og leverInnFilm.

c) Programmer metodene registrerNyeKopier og visLeietakere.

SLUTT PÅ OPPGAVEN!

For ordens skyld nevner vi at det som er beskrevet ovenfor ikke representerer noe fullstendig program. Det mangler en main-metode som inneholder nødvendig kode for å få kjørt programmet. Denne skal du imidlertid ikke programmere.