AVDELING FOR INGENIØRUTDANNING

EKSAMENSOPPGAVE

Emne:
PROGRAMMERING
Emnekode:
LO 127 A
Faglig veileder:
Eva Vihovde
Grupper:
1AA, 1AB, 1AC, 1IA
Dato:
30.11.2006
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
  
 
   

EKSAMENSREGISTRERING

Du skal lage (deler av) et program som kan brukes til registrering av eksamener til studenter. Av hensyn til oppgavens størrelse er programmet sterkt forenklet i forhold til det som normalt ville kreves av et slikt program. Programmet lar seg imidlertid lett utvide med ny funksjonalitet. (For ordens skyld gjør vi oppmerksom på at de regler som er beskrevet i oppgaven ikke nødvendigvis samsvarer med dem som virkelig brukes på HiO.)

Det er et felles krav for alle klassene som inngår i oppgaven at alle datafelter skal ha privat aksess. Der det ikke er spesifikt angitt hva datatypen skal være, må du selv velge en passende datatype.

Programmet skal kunne registrere to typer eksamener: skriftlig eksamen og prosjekteksamen. Klassene SkriftligEksamen og ProsjektEksamen representerer de to typene, se oppgave 1 og 2 for nærmere beskrivelse. Det som er felles for begge eksamenstyper er representert av den abstrakte klassen Eksamen som er gjengitt nedenfor.

abstract public class Eksamen
{
  private String fag;
  private String fagkode;
  private int studiepoeng;

  public Eksamen(String f, String fk, int stp)
  {
    fag = f;
    fagkode = fk;
    studiepoeng = stp;
  }

  public String getFagkode()
  {
    return fagkode;
  }

  public int getStudiepoeng()
  {
    return studiepoeng;
  }

  public String toString()
  {
    String resultat = "";

    resultat = "\nFag: " + fag +
               "\nKode: " + fagkode +
               "\nStudiepoeng: " + studiepoeng +
               "\nKarakter: " + karakter();
    if (strøket())
      resultat += "\nFaget er ikke bestått";
    return resultat;
  }

  public abstract char karakter();

  public abstract boolean strøket();
}




OPPGAVE 1

Klassen SkriftligEksamen er direkte subklasse til Eksamen og representerer en eksamen av type skriftlig eksamen. I tillegg til det som er felles for alle typer eksamen, skal det for en slik eksamen registreres (i form av datafelter) eksamenstid i antall timer, samt en score i form av et helt tall fra og med 0 til og med 100. For øvrig inneholder klassen følgende:

Programmer fullstendig klasse SkriftligEksamen.

OPPGAVE 2

Klassen ProsjektEksamen er direkte subklasse til Eksamen og representerer en eksamen av type prosjekteksamen. I tillegg til det som er felles for alle typer eksamener, skal det for en slik eksamen registreres (i form av datafelter) følgende:

For øvrig skal klassen ha følgende innhold:

Programmer fullstendig klasse ProsjektEksamen.

OPPGAVE 3

Nedenfor følger en skisse av klasse Student, som representerer én enkelt student.

public class Student
{
  private String navn;
  private String studentNr;
  
  private Eksamen[] eksamener;
  public static final int ANTALL = 10; //maksimalt antall eksamener
  private static int nesteNr = 100000;

  < konstruktør med parameter for navn. studentNr skal
    konstruktøren generere automatisk, ved at første student får
    studentNr s100001, neste student s100002, etc.
    Konstruktøren skal også foreta annen nødvendig initialisering. >

  < get-metode for studentNr >

  private int finnEksamen(Eksamen e)
  {
    < leter i eksamener etter Eksamen med samme fagkode som
      parameterens Eksamen-objekt inneholder. Returnerer
      arrayindeks dersom denne finnes, -1 ellers. >
  }

  public String regEksamen(Eksamen e)
  {
    < Registrerer den eksamen som parameteren angir forutsatt at
      følgende er oppfylt:
      Dersom eksamen med samme fagkode finnes fra før, skal ny
      eksamen registreres bare dersom den eksisterende eksamen
      er strøket. Ellers skal ny eksamen settes inn på første ledige
      plass i arrayen, foutsatt at ledig plass finnes.
      Returnert tekst skal gi passende opplysninger om utfallet av
      registreringen. >
  }

  public String toString()
  {
    < Returnerer opplysninger om navn, studentnummer og
      opplysninger om de eksamener studenten har tatt. >
  }
}

Programmer konstruktør og de metoder som er skissert for klassen Student.

OPPGAVE 4

I det følgende finnes en skisse av klasse Studium.

public class Studium
{
  private final int MAX = 100;
  private Student[] studentene = new Student[ MAX];
  private int antall = 0;  // antall registrerte studenter

  public boolean nyStudent( Student s )
  {
    < Registrerer ny student på første ledige plass i arrayen,
      forutsatt at det er plass. Studentobjektene skal ligge
      kontinuerlig etter hverandre. Returverdien indikerer om
      registrering lot seg utføre. >
  }

  public Student finnStudent( String studnr )
  {
    < leter etter og returnerer student med det studentNr
      som parameteren angir. Ved manglende funn returneres null. >
  }

  public String registrer( String studentnr, Eksamen e )
  {
    < Foretar registrering av eksamen på student det er gitt
      studentnr for, forutsatt at denne finnes. Returnert tekst
      skal gi passende opplysninger om utfallet av registreringen. >
  }

  public String  statusListe()
  {
    < Returner for alle studentene de opplysninger som
      objektenes toString-metode gir. >
  }
}

Programmer de metoder som er skissert i klassen Studium.

OPPGAVE 5

Bildet viser programmets brukergrensesnitt.

Vinduet er definert av klassen Vindu som er skissert på følgende sider. Komponentenes navn indikerer hvilken rolle de har i vinduet.

public class Vindu extends JFrame
{
  private JTextField tittel, fagnavn, fagkode, poeng, timer,
                                                score, pkarakter;
  private JTextField[] navn;
  private JTextField[] nr;
  private JButton skriftelig, prosjekt, status;
  private JTextArea utskrift;
  private Studium studium = new Studium();

  public Vindu()
  {
    super("Eksamensregistrering");
    Lytter lytter = new Lytter();
    skriftelig = new JButton("Registrer skriftlig eksamen");
    skriftelig.addActionListener(lytter);
    prosjekt = new JButton("Registrer prosjekteksamen");
    prosjekt.addActionListener(lytter);
    status = new JButton( "Eksamensregisteret" );
    status.addActionListener( lytter );
    < Oppretter alle andre vinduskomponenter. Legger komponentene
      ut i vinduet, setter størrelse på det og gjør det synlig. >
  }


  public void klasseStatus()
  {
    < skriver ut i tekstområdet statusliste for studium >
  }

  public Student finnStudent( String navn, String studentnr )
  {
    < Metoden skal returnere student med navn og studentnr
      som parametrene angir, i tilfelle denne finnes. Hvis ikke,
      skal ny student registreres og deretter returneres.
      Hvis registrering ikke lar seg gjøre, skal metoden
      returnere null. >
  }

  public void registrerSkriftlig()
  {
    < Registerer en skriftlig eksamen ved å lese inn nødvendige
      data fra vinduets tekstfelter. Hvis studentnr ikke finnes,
      skal ny student registreres først.
      Passende opplysninger om utfallet av registreringen skrives
      ut i tekstområdet.  >
  }

  public void registrerProsjekt()
  {
    < Registrerer en prosjekteksamen. Det leses inn nødvendige
      data fra vinduets tekstfelter. Hvis studentnr for noen av de
      tre studentene ikke finnes, skal nødvendig registrering
      foretas først. Eksamen skal registrereres på alle studentene
      i prosjektgruppen.
      Utfall av registreringen skal skrives i tekstområdet. >
  }

  private class Lytter implements ActionListener
  {
    public void actionPerformed( ActionEvent e )
    {
      if (e.getSource() == skriftelig)
        registrerSkriftlig();
      else if (e.getSource() == prosjekt)
        registrerProsjekt();
      else
        klasseStatus();
    }
  }
}

a) Programmer metodene klasseStatus og finnStudent.

b) Programmer metoden registrerSkriftlig.

c) Programmer metoden registrerProsjekt.

-----------

Merknad De klasser som er skissert ovenfor gir til sammen ikke et fullstendig program. Men du skal ikke programmere det som mangler.