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

Kriminalomsorg i frihet

Norske fengsler er i dag fulle av innsatte som har det til felles at de en dag skal tilbake til samfunnet. For innsatte som har mindre enn et år igjen av soningstiden, er det av denne grunn opprettet såkalte "åpne soningsanstalter". Her kan de innsatte bo og forberede seg på livet utenfor murene. De kan komme og gå som de vil, ta imot besøk og i det hele tatt få større frihet, med det ansvaret dette medfører. Helt fritt er det imidlertid ikke; de innsattes bevegelser skal loggføres, slik at kriminalomsorgen til enhver tid vet hvor de innsatte befinner seg, og hvem de omgås. For å lette dette arbeidet, skal du lage (deler av) programmet "Soningsanstalten", som skal brukes av vaktene på institusjonen. Det kan være nyttig å ta en titt på programmets brukergrensesnitt på side 8, før du begynner å besvare oppgaven. De enkelte deloppgavene beskriver i detalj hva du skal gjøre. NB! Det er ikke alle metodene som skal programmeres, kun de som blir nevnt i deloppgavene.

Programmet består av de seks klassene Logg, Boboer, Rom, Romregister, Vaktvindu og Soningsanstalten som tilsammen utgjør et fullstendig program. I resten av oppgaven blir de innsatte omtalt som beboere.

I første oppgave vil du få bruk for å kunne lagre et tidspunkt. Til dette kan du bruke et Calendar-objekt som du oppretter ved å skrive:

	Calendar dato = Calendar.getInstance(); 

Hvis du ønsker å skrive ut dato, skriver du:

	DateFormat df = DateFormat.getDateInstance();
        String rapport = "\nDato: " + df.format(dato.getTime());

Oppgave 1

Alle bevegelser til beboerne skal loggføres og i den forbindelse skal du lage klassen Logg.
Nedenfor ser du en skisse av klassen:

< import-setninger >
public class Logg
{
  private String[] rapporter;
  private int antall;   // antall rapporter som til enhver tid er lagret i arrayen
  public static final int ARRAYLENGDE = 100;
  public static final int UTVIDELSE = 10;

  < Parameterløs konstruktør som utfører nødvendige oppgaver. >

public String toString() { < Metoden skal returnere en tekst som inneholder alle rapportene i arrayen, slik at den nyeste rapporten står først og den eldste sist, dvs i omvendt kronologisk rekkefølge. Det skal være et linjeskift mellom hver rapport. > } public void utvidArray() { < Metoden skal utvide arrayen "rapporter" med så mange elementer som konstanten UTVIDELSE angir. > } public void nyRapport( String melding ) { < Metoden skal opprette en rapport, med teksten som den innkomne parameteren "melding" inneholder. Rapporten skal starte med dagens dato, og lagres i arrayen "rapporter". Hvis arrayen er full, skal den utvides med så mange elementer som konstanten UTVIDELSE angir, før rapporten den nye settes inn. > } } // end of class Logg

a) Programmer klassens konstruktør og metoden public String toString().

b) Programmer metoden public void utvidArray().

c) Programmer metoden public void nyRapport( String melding ).

Oppgave 2

Nedenfor ser du en skisse av klassen Beboer:

public class Beboer
{
  private String navn;
  private long pNr;  // personnummer
  private Rom rom;  // Klassen Rom  er beskrevet i oppgave 3
  private Logg loggbok;
  private String gjest;

  public Beboer(String n, long nr, Rom r )
  {
    < Konstruktøren oppretter loggboken og initialiserer datafeltene.
      Konstruktøren skal IKKE programmeres. >
  }

  < get-metoder for navn, pNr og rom >

  < set-metode for gjest >

  public void slettGjest()
  {
    < Metoden skal slette gjesten fra objektet. >
  }

  public void nyRapport( String rapport )
  {
    < Metoden skal sette rapporten, som den mottar som parameter,
      inn i loggboken. Hvis beboeren har en gjest på besøk, skal
      gjestens navn også tas med i rapporten. >
  }

public String toString() { < Metoden skal returnere beboerens navn og personnummer i form av en tekst. > } public String loggbok() { < Metoden skal returnere en tekst som starter med beboerens navn, personnummer og romnummer, etterfulgt av alle rapportene i loggboken. > } } // end of class Beboer

a) Programmer følgende metoder:

b) Programmer metodene:

Oppgave 3

Nedenfor ser du en skisse av klassen Rom:

< import-setninger >

public class Rom
{
  private int romNr;
  private int status;
  private Beboer beboer; // hvis beboer == null er rommet ledig
  private JTextArea display;
  private String arkiv = "";
  public static final int LEDIG = 0, INNE = 1, UTE = 2, BESØK = 3;

  public Rom(int nr, JTextArea d)
  {
    < initialisering - skal IKKE programmeres. >
    oppdaterRomStatus("", LEDIG);
  }

  < get-metoder for romNr, arkiv og beboer - skal IKKE programmeres. >

  public String status()
  {
    < Metoden skal returnere er tekst som tilsvarer rommets status,
      dvs. "LEDIG", "INNE", "UTE" eller "BESØK". >
  }

  public boolean ledig()
  {
    < Hvis rommet er ledig skal metoden returnere true,
      og i motsatt fall skal den returnere false. >
  }

public void oppdaterRomStatus(String melding, int st) { < Metoden skal oppdatere rommets status med den nye verdien som parameteren "st" angir. Hvis rommet er bebodd, skal det i beboerens loggbok opprettes en rapport som inneholder informasjon om den nye statusen etterfulgt av meldingen som parameteren "melding" inneholder. På displayet skal beboerens navn og personnummer, samt rommets nye status, skrives. Hvis rommet er ledig skal det kun stå teksten "LEDIG" på displayet. (Se bilde av brukergrensesnittet på side 8.) > } public boolean flyttInn( Beboer ny) { < Hvis rommet er ledig skal det registreres at en ny beboer flytter inn, og romstatusen skal så oppdateres.(Se metoden over.) Hvis innflyttingen lot seg gjøre, skal metoden returnere true. I motsatt fall skal den returnere false. Du kan anta ny != null. > } public void flyttUt() { < Metoden skal lagre beboerens logg i arkivet, deretter ledigstille rommet og endre dets status til LEDIG. Den nye statusen skal skrives på displayet. > } public String gårUt(String s) { < Metoden skal IKKE programmeres. > } public String gårInn( String s) { < Metoden skal IKKE programmeres. > } public String fårBesøk( String melding, String g ) { < Hvis beboeren er inne, skal metoden registrere at vedkommende har besøk og hvem vedkommende har besøk av. Parameteren "g" angir gjestens navn. Besøket skal loggføres med meldingen som parameteren "melding" inneholder og rommets status og display skal oppdateres. Beboeren kan imidlertid ikke ta imot besøk hvis vedkommende er ute eller allerede har besøk. Metoden skal enten returnere en tekst med informasjon om at besøket er registrert, eller en tekst som forklarer hvorfor besøket ikke lar seg gjennomføre. > } public String besøkSlutt( String melding ) { < Metoden skal registrere at besøket er avsluttet, og rommets status og display skal oppdateres. Forutsetningen er imidlertid at vedkommende virkelig har besøk. Metoden skal enten returnere en tekst med informasjon om at besøket er avsluttet, eller en tekst som forklarer at beboeren ikke har hatt besøk. > } } // end of class Rom

a) Programmer metodene:

b) Programmer metoden public void oppdaterRomStatus(String melding, int st).

c) Programmer metodene:

d)

Oppgave 4

Rommene på institusjonen er lagret i et register, representert ved klassen Romregister.
Nedenfor ser du en skisse av klassen:

< import-setninger >

public class Romregister
{
  private Rom[] rommene;

  public Romregister( Rom[] r )
  {
    rommene = r;
  }

  public String beboerLogg( long pnr )
  {
    < Metoden skal returnere loggboken til beboeren med personnummer
      lik den innkomne parameteren "pnr", under forutsetning av
      at vedkommende bor på institusjonen. Hvis det ikke er tilfelle
      skal metoden returnere teksten "Ukjent personnummer". >
  }

  public Rom finnRom( long pnr )
  {
    < Metoden skal returnere en referanse til rommet som beboeren med
      personnummer lik den innkomne parameteren "pnr" bor på.
      Hvis et slikt rom ikke finnes skal metoden returnere null. >
  }

  public Beboer finnBeboer( long pnr )
  {
    < Metoden returnerer en referanse til beboeren med  personnummer
      lik den innkomne parameteren "pnr". Hvis en slik beboer ikke
      finnes returnerer metoden null.
      NB! Denne metoden skal IKKE programmeres. >
  }

public String nyBeboer( String navn, long pnr ) { < Metoden skal innlosjere en ny beboer, med navn og personnr som parametrene "navn" og "pnr", angir. Forutsetningen er imidlertid at det finnes et ledig rom og at vedkommende ikke allerede bor på institusjonen. Hvis innflyttingen gikk bra, skal metoden returnere en tekst med beboerens navn og opplysninger om hvilket rom vedkommende har flyttet inn på. Hvis vedkommende allerede bor på institusjonen skal teksten som returneres fortelle hvilket rom vedkommende allerede bor på. Hvis ingen rom er ledige skal det returneres informasjon om det. > } public String utflytting( long nr ) { < Metoden skal IKKE programmeres. > } public String ut( long pnr, String s) { < Metoden skal IKKE programmeres. > } public String inn( long pnr, String s ) { < Metoden skal IKKE programmeres. > } public String besøkInn( long pnr, String melding, String gjest ) { < Metoden skal IKKE programmeres. > } public String besøkAvsluttet( long pnr, String melding ) { < Metoden skal IKKE programmeres. > } public String visArkiv() { < Metoden skal IKKE programmeres. > } } // end of class Romregister

a) Programmer metodene:

b) Programmer metoden public String nyBeboer( String navn, long pnr )

Oppgave 5

På neste side ser du et bilde av programmets brukergrensesnitt. Dette skal brukes av vaktene på institusjonen. Knappene viser hvilke hendelser som skal registreres. I øverste del av bilde ser du en oversikt over alle rom, representert ved sine displayer. I vinduets nedre del ser du to tekstområder. Det venstre inneholder utskrift fra programmet, mens vaktene kan skrive sine rapporter inn i det høyre.

Nedenfor ser du en skisse av klassen VaktVindu.

< import-setninger >

public class VaktVindu extends JFrame
{
  private JTextField navneFelt, nrFelt, besøksFelt;
  private JTextArea[] display;
  private JTextArea utskrift, rapport;
  private JButton flyttInn, flyttUt, inn, ut,besøkInn, besøkUt, logg, arkiv;
  private Romregister institusjonen;

  public VaktVindu()
  {
    super( "VaktVindu");
    display = new JTextArea[20];
    Rom[] rommene = new Rom[display.length];
    for( int i = 0; i < display.length; i++ )
    { ...
      display[i] = new JTextArea(3,10);
      rommene[i] = new Rom(i+1, display[i]);
    }
    institusjonen = new Romregister( rommene );
    Lytter lytter = new Lytter();

    < Setter opp brukergrensesnittet og knytter knappene til lytteobjektet. >
  }

public void innskriving() { < Metoden skal lese inn navn og personnummer og, om mulig innlosjere den nye beboeren på institusjonen. Utfallet av oppgaven skal skrives til tekstområdet "utskrift". > } public void visArkiv() { < Metoden skal IKKE programmeres. > } public void beboerLogg() { < Metoden skal IKKE programmeres. > } public void utskriving() { < Metoden skal IKKE programmeres. > } public void ut() { < Metoden skal IKKE programmeres. > } public void inn() { < Metoden skal IKKE programmeres. > } public void besøk() { < Metoden skal IKKE programmeres. > } public void besøkAvsluttet() { < Metoden skal IKKE programmeres. > } < privat lytteklasse > } // end of class Vaktvindu

a) Programmer metoden public void innskriving().

b) Programmer den private lytteklassen Lytter.

c) Du skal nå programmere en public lytteklasse som skal kunne brukes av klassen VaktVindu, i stedet for den private du har laget under punkt b). Hvilke forandringer må du gjøre i klassen VaktVindu for at dette skal fungere?

Til orientering: Klassen Soningsanstalten innholder main-metoden og starter programmet:

public class Soningsanstalten{
{ public static void main( String[] args )
  {
    new VaktVindu();
  }
}
SLUTT