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

E-resepter

En ordning med elektroniske resepter innføres nå gradvis i Norge. Helsedirektoratet leder prosessen og har som mål at e-resept skal være i bruk over hele landet innen utgangen av 2013. Tidligere måtte leger skrive ut reseptbelagte medisiner på en papir-resept. Denne inneholdt informasjon om pasienten og legen, medisinen(e) i angitt mengde, samt en liten veiledning med hensyn til dosering og bruk . Deretter måtte resepten tas med til et apotek der medisinen(e) kunne hentes. E-resept er som en vanlig resept, bare at den blir lagret elektronisk istedenfor at du får den med på et papirark. Ritignok må medisinen(e) fremdeles hentes på apoteket, men man trenger ikke lenger ha med seg papir-resepten. Resepten som legen har skrevet ut ligger allerede inne i datasystemet og skal være tilgjengelig på alle landets apoteker.

I denne oppgaven skal du lage en forenklet versjon av dette reseptsystemet. Programmet vil inneholde klassene Person, Lege, Pasient, Resept, Legeregister og Pasientregister, som tilsammen utgjør datastrukturen. Klassene Legekontor og Apotek utgjør brukergrensesnittet på henholdsvis legekontoret og apoteket, mens Reseptsystem setter sammen de forskjellige delene av programmet. (I tillegg er det en driverklasse som inneholder main-metoden. ) Hvordan klassene er relatert til hverandre vil fremgå av teksten i deloppgavene. Det er mange klasser, men du skal ikke programmere alle. Du vil imidlertid få bruk for å kjenne til alle klassene, og nødvendig informasjon vil i denne forbindelse bli oppgitt etterhvert.

Klassen Resept skal du ikke programmere, men du vil trenge å kjenne til den.
Nedenfor ser du en skisse av klassen:

public class Resept
{
  private boolean utlevert = false;
  private String tekst;
  private Calendar dato;
  private Pasient pasient;
  private Lege lege;
  private int nr;
  private static int nesteNr = 0;

  < Konstruktøren mottar reseptens tekst, legen og pasienten som parametre.
    Resepten blir tildelt et unikt nummer, datoen for opprettelsen
    av resepten blir registert, i tillegg til at annen nødvendig initialisering
    blir foretatt. >

  < get-metoder for datafeltene nr og utlevert >

  public void registrerUtlevert()
  {
    < Metoden registrerer at den medisinen resepten foreskriver er utlevert. >
  }

  public String toString()
  {
    < Metoden returnerer en tekst som innholder all informasjon på resepten,
      samt opplysninger om medisinen resepten foreskriver er utlevert eller
      ikke. >
  }

}  // end of class Resept 

*******************************************************************************************

Programmet innholder et lite klassehierarki bestående av superklassen Person og subklassene Lege og Pasient.

Oppgave 1

Nedenfor ser du en skisse av klassen Person.

public class Person
{
  private String navn;
  private String fødselsdato;

  < Konstruktør som mottar navn og fødselsdato som
    parametre og foretar initialisering av datafeltene. >

  < get-metode for navn >

  < get-metode for fødselsdato >

  public String toString()
  {
    < Metoden skal returnere navn og fødselsdato i form av tekst. >
  }
} // end of class Person

a) Programmer ferdig klassen Person ved å erstatte all pseudo-kode med java-kode.

Oppgave 2

I denne oppgaven skal du programmere klassen Lege, som er en direkte subklasse til klassen Person. I tillegg til datafeltene som klassen har arvet fra sin superklasse skal Lege ha datafelt for følgende opplysninger:

a) Her skal du gjøre to ting:

b) Her skal du gjøre to ting:

c) Programmer Lege-metoden

  public String nyResept( Resept r )
  {
    < Metoden mottar en resept som parameter og setter den, om mulig,
      inn i arrayen av resepter. Hvis dette gikk bra, skal metoden returnere
      informasjon om selve resepten, og i motsatt fall skal den returnere
      informasjon om at det ikke var plass i arrayen. >
  }

d) Programmer Lege-metoden

  public String utskrevneResepter()
  {
    < Metoden skal returnere en tekst som inneholder informasjon om
      alle reseptene legen har skrevet ut. Reseptene skal skrives ut i
      omvendt kronologisk rekkefølge slik at de nyeste reseptene kommer
      første og de eldste sist. Hvis legen ikke har skrevet ut noen
      resepter, skal metoden returnere informasjon om det. >
  }

Oppgave 3

Klassen Pasient er også en direkte subklasse til klassen Person. Nedenfor ser du en skisse av klassen:

public class Pasient < arver klassen Person >
{
  private Resept[] resepter;
  private int antall = 0;
  < En konstant MAX lik 100 for det maskimale antall
    resepter arrayen kan inneholde >

  < Konstruktør som mottar pasientens navn og fødselsdato
    som parametre og foretar nødvendig initialisering. >

  public boolean nyResept( Resept ny  )
  {
    < Metoden setter en ny resept inn i pasientens resept-array.
      NB! Denne metoden skal du ikke programmere!>
  }

  public Resept finnResept( int n )
  {
    < Metoden returnerer resepten med reseptnummer lik parameteren n.
      Hvis en slik ikke finnes, skal metoden returnere null. >
  }

  public String toString()
  {
    < Metoden skal returnere all informasjon om pasienten og
      vedkommendes resepter. Det skal fremgå av teksten om
      medisinene reseptene foreskriver  er utlevert eller ikke,
      samt hvor mange resepter som ikke er avhentet. >
  }

} // end of class Pasient

a) Programmer metoden public Resept finnResept( int n ).

b) Programmer metoden public String toString().

Oppgave 4

I denne oppgaven skal du programmere deler av klassen Pasientregister. Nedenfor ser du en skisse av klassen:

public class Pasientregister
{
  private Pasient[] pasienter;

  public Pasientregister( Pasient[] p )
  {
    pasienter =  p;
  }

  public boolean nyPasient( Pasient p )
  {
    < Metoden setter, hvis mulig, inn Pasient-objektet p på første ledige
      plass i arrayen. Returverdien indikerer om dette var mulig eller ikke.
      NB! Denne metoden skal du ikke programmere! >
  }

  public Pasient finnPasient( String dato,  String navn )
  {
    < Metoden returnerer, hvis mulig, Pasient-objektet med
      fødselsdato og  navn lik parametrene dato og navn.
      Hvis et slikt objekt ikke finnes returnerer metoden null.
      NB! Denne metoden skal du ikke programmere! >
  }

  public Pasient[] finnPasient( String dato )
  {
    < Metoden skal returnere array som inneholder alle pasientene
      som har fødselsdato lik parameteren dato. Arrayens lengde skal
      være nøyaktig lik det antall Pasient-objekter som har en slik
      fødselsdato. Dvs. I arrayen som returneres skal ingen
      array-elementer være lik null.) Hvis det ikke finnes noen
      pasienter med denne fødselsdatoen, skal metoden returnere null. >
  }
} // end of class Pasientregister

a) Programmer metoden public Pasient[] finnPasient( String dato ).

***********************************************************************************

Nedenfor ser du en skisse av klassen Legeregister. Du skal ikke programmere klassen, men trenger å kjenne til den.

public class Legeregister
{
  private Lege[] leger;

  public Legeregister( Lege[] l ){ ... }

  public Lege[] getLeger(){ ... }

  < Andre metoder du ikke vil får bruk for i denne oppgaven >

}// end of class Legeregister

***********************************************************************************

Oppgave 5

På bildet på neste side ser du programvinduet som legen har på sitt legekontor:

Nedenfor ser du en skisse av vindusklassen Legekontor:

< import-setninger>

public class Legekontor extends JFrame
{
  private Lege legen;
  private Pasientregister pasienter;
  private JTextField pNavnFelt, pFødtFelt;
  private JTextArea utskrift, editor;
  private JButton nyPasient, finnPasient, sendResept, alleResepter;

  public Legekontor( Lege l, Pasientregister p )
  {
    super( "LEGE " + l.toString() );
    legen = l;
    pasienter = p;

    < Oppretter alle skjermkomponentene og setter opp brukergrensesnittet. >

    < Oppretter et lytteobjekt og knytter knappene til lytteobjektet. >
  }


  public void alleResepter()
  {
    < Metoden skal i tekstområdet "utskrift" skrive ut alle reseptene
      legen har forskrevet. >
  }

  public void nyPasient()
  {
    < Metoden skal registrere en ny pasient i Pasientregisteret. >
  }

  public void finnPasient()
  {
    < Metoden skal i tekstområdet "utskrift" skrive ut informasjon
      om en ønsket pasient, forutsatt at både pasientens navn og
      fødselsdato er skrevet inn. Hvis imidlertid det kun er
      fødselsdatoen som er skrevet inn, skal metoden skrive ut
      opplysninger om alle pasienter som er født på denne datoen.
      Hvis det ikke finnes noen slik(e) pasient(er), skal metoden gi
      beskjed om det.  >
  }

  public void sendResept()
  {
    < Ut fra informasjonen som legen har skrevet inn i vinduets
      tekstfelt og tekstområdet "editor", skal metoden lage
      en resept. Hvis pasienten som resepten skal skrives ut til
      ikke finnes i pasientregisteret, må pasienten først registeres.
      Resepten skal inneholde informasjon om pasienten og legen, samt
      den teksten  som legen har skrevet inn i tekstområdet "editor".
      (Her vil det stå  opplysninger om medisin, mengde og dosering m.m )
      Den nye resepten skal så lagres i både legens  og pasientens
      Resept-array. >
  }

   < private lytteklasse som skal fange opp hedelsene i vinduet. >

}// end of class Legekontor

a) Programmer metoden public void alleResepter().

b) Programmer metoden public void nyPasient().

c) Programmer metoden public void finnPasient().

d) Programmer metoden public void sendResept().

e) Programmer den private lytteklassen slik at den fanger opp klikkene på knappene og sørger for at de tilhørende oppgavene blir utført.

Oppgave 6

På bildet ser du programvinduet som skal brukes av farmasøyten/ekspeditøren på apoteket:

Nedenfor ser du en skisse av klassen Apotek:

< import-setninger >
public class Apotek extends JFrame
{
  private Pasientregister pasienter;
  private JTextField pNavnFelt, pFødtFelt, reseptNrFelt;
  private JTextArea reseptOmråde;
  private JButton finnResepter, registrerUtlevert;

  public Apotek( String apotek, Pasientregister p )
  {
    super( apotek + " apotek " );

    < Oppretter alle komponentene og setter opp brukergrensesnittet. >

    < Oppretter et lytteobjekt og knytter knappene til lytteobjektet. >
  }

  public void finnResepter()
  {
    < NB! Denne metoden skal du ikke programmere! >
  }

  public void registrertUtlevert()
  {
    < Ut fra pasientens navn, fødselsdato og reseptens nummer skal
      metoden registerere at medisinen som resepten foreskriver er
      utlevert. >
  }

  < private lytteklasse som fanger opp hedelsene i vinduet. >

}// end of class Apotek

a) Programmer metoden public void registrertUtlevert().

Oppgave 7

public class Reseptsystem
{
  private Pasientregister pasienter;
  private Legeregister legene;

  public Reseptsystem( int antPasienter, int antLeger )  // Kan oppgis
  {
    legene = new  Legeregister( opprettLegeArray( antLeger ) );
    pasienter = new Pasientregister( opprettPasientArray(antPasienter) );        // kan droppes
    opprettLegekontor();
    opprettApotek();
  }

  public  Lege[] opprettLegeArray( int antLeger )
  {
    < Metoden returnerer er array med Lege-objekter.  Antallet objekter
      er lik arrayens lengde. NB! Denne metoden skal du ikke programmere! >
  }

  public  Pasient[]  opprettPasientArray(int antPasienter)
  {
    < Metoden returnerer er array med Pasient-objekter. Antallet objekter
      er lik arrayens lengde. NB! Denne metoden skal du ikke programmere! >
  }

  public void opprettLegekontor()
  {
    < Metoden skal opprette like mange legekontor (Legekontor-objekter)
      som leger i Legeregisteret. >
  }

  public void opprettApotek()
  {
    < Metoden skal opprette 4 apotek (Apotek-objekter) med følgende
      navn:  "Svanen", "Sfinksen", "Vitus" og "Løven". >
  }

}// end of class Reseptsystem

a) Programmer metoden public void opprettLegekontor().

b) Programmer metoden public void opprettApotek().