AVDELING FOR INGENIØRUTDANNING

EKSAMENSOPPGAVE

Emne:
PROGRAMMERING
Emnekode:
LO 127 A
Faglig veileder:
Eva Vihovde
Grupper:
1AA, 1AB, 1AC, 1IA
Dato:
23.02.2006
Eksamenstid:
09.00 - 14.00
Eksamensoppgaven består av:   Antall sider (inkl. forsiden): 6  Antall oppgaver: 3 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
  
 
   

MENGDEOPERASJONER

Oppgaven går ut på å definere en klasse som representerer en mengde av naturlige tall tilhørende et gitt intervall, samt å definere metoder for de vanlige mengdeoperasjonene: sette inn og fjerne elementer, sjekke om et gitt element tilhører mengden, og danne union, snitt og differensmengde med en annen mengde. (Det snakkes her om mengder i matematisk forstand. Alt som brukes av matematiske begreper blir forklart i oppgaveteksten.) Dessuten skal det programmeres deler av et grensesnitt som kan brukes til å teste ut mengdeoperasjonene. Nærmere detaljer er gitt i de enkelte oppgavene i det følgende.

Oppgave 1

Nedenfor er det gitt en skisse av klassen Heltallsmengde som representerer en mengde av ikke-negative hele tall. Arrayen element brukes til å indikere om et helt tall er med i (er element i) mengden eller ikke: Dersom tallet er innenfor arrayens indeksområde og arrayen på denne indeksplass har verdi true, så er tallet med i mengden, ellers ikke. Det kan altså ikke settes inn i mengden elementer som er utenfor arrayens indeksområde.

public class Heltallsmengde
{
  private boolean[] element;  // brukes som forklart ovenfor

  < Konstruktør med parameter som angir størrelse for arrayen element.
    Konstruktøren foretar nødvendig initialisering. >

  public int getKapasitet()
  {
    < Returnerer størrelse for arrayen element. >
  }

  public void settInnElement( int k )
  {
    < Registrerer at k blir satt inn som element i mengden, forutsatt
      at dette er mulig. (Se innledningen ovenfor.) >
  }

  public void fjernElement( int k )
  {
    < Registrerer at k ikke skal være element i mengden, i tilfelle det
      er nødvendig å gjøre det. >
  }

  public boolean inneholder( int k )
  {
    < Returverdien indikerer om k er element i mengden eller ikke. >
  }

  public boolean erDelmengdeAv( Heltallsmengde m )
  {
    < Returverdien indikerer om denne mengden er delmengde av den mengden m
      som er parameter, det vil si om alle elementer i denne mengden også er
      elementer i mengden m. >
  }

  public boolean erLik( Heltallsmengde h )
  {
    < Returverdien indikerer om denne mengden er lik mengden h, det vil si
      om den inneholder nøyaktig de samme elementer som h. >
  }


  public String innhold()
  {
    < Returnerer mengdens elementer med et mellomrom mellom hvert
      element og inntil 20 elementer per linje. Dersom mengden er tom,
      skal metoden returnere Ø, som er symbolet for den tomme mengde. >
  }

  public Heltallsmengde union( Heltallsmengde h )
  {
    < Returnerer en mengde som er unionen av denne mengde og den mengde
      som er parameter, det vil si som inneholder alle elementer som er i
      den ene eller i den andre av disse mengdene. >
  }

  public Heltallsmengde snitt( Heltallsmengde h )
  {
    < Returnerer en mengde som er snittet av denne mengde og den mengde
      som er parameter, det vil si som inneholder alle elementer som er
      felles for de to mengdene. >
  }

  public Heltallsmengde minus( Heltallsmengde m )
  {
    < Returnerer en mengde som er differensmengden av denne mengde og den
      mengde som er parameter, det vil si som inneholder alle elementer som
      er i denne mengde, men som ikke er i den mengde som er parameter. >
  }
}

Vær oppmerksom på at når det i metodene som er beskrevet i skissen inngår to mengder, kan disse være representert av arrayer som har ulik lengde.

Metodene du skriver skal i størst mulig grad anvendes der du har bruk for dem i seinere deloppgaver.

a) Programmer klassens konstruktør, samt metoden getKapasitet.

b) Programmer metodene settInnElement, fjernElement og inneholder.

c) Programmer metodene erDelmengdeAv og erLik.

d) Programmer metoden innhold.

e) Programmer metodene union og snitt.

f) Programmer metoden minus.

Oppgave 2

Klassen Mengdeoperasjoner som er skissert etter bildet lenger nede, definerer et vindu som kan brukes til å teste ut metoder definert i klassen Heltallsmengde. Det blir opprettet to mengder av den typen klassen definerer, den ene kan inneholde elementer i intervallet 0 til 60, mens den andre kan inneholde elementer i intervallet 0 til 40. Følgende bilde viser vinduet etter at det er satt inn noen elementer i hver av de to mengdene.

public class Mengdeoperasjoner extends JFrame implements ActionListener
{
  private Heltallsmengde a, b;
  private JTextField afelt; // for tall som skal inn i eller ut av mengde a
  private JTextField bfelt; // for tall som skal inn i eller ut av mengde b
  private JButton aInn, aFjern, bInn, bFjern;
  private JTextArea mengdeA, mengdeB, union, snitt, aMinusB, relasjoner;

  public Mengdeoperasjoner()
  {
    super( "Mengdeoperasjoner" );
    int aKap = 61, bKap = 41;
    a = new Heltallsmengde( aKap );
    b = new Heltallsmengde( bKap );
    < oppretter grafiske skjermkomponenter >
    aInn.addActionListener( this );
    aFjern.addActionListener( this );
    bInn.addActionListener( this );
    bFjern.addActionListener( this );
    Container c = getContentPane();
    c.setLayout( new FlowLayout() );
    c.add( new JLabel( "Element for mengde A (0.." + (aKap-1) + ")" ) );
    c.add( afelt );
    c.add( aInn );
    c.add( aFjern );
    c.add( new JLabel( "Element for mengde B (0.." + (bKap-1) + ")" ) );
    c.add( bfelt );
    c.add( bInn );
    c.add( bFjern );
    c.add( new JLabel( "Innhold i A" ) );
    c.add( new JScrollPane( mengdeA ) );
    c.add( new JLabel( "Innhold i B" ) );
    c.add( new JScrollPane( mengdeB ) );
    c.add( new JLabel( "A union B" ) );
    c.add( new JScrollPane( union ) );
    c.add( new JLabel( "A snitt B" ) );
    c.add( new JScrollPane( snitt ) );
    c.add( new JLabel( "A minus B" ) );
    c.add( new JScrollPane( aMinusB ) );
    c.add( new JLabel( "Relasjoner" ) );
    c.add( new JScrollPane( relasjoner ) );
  }

  public void settInn( Heltallsmengde m, int verdi )
  {
    < Registrerer at parameteren verdi blir satt inn i mengden m. >
  }

  public void fjern( Heltallsmengde m, int verdi )
  {
    < Registrerer at parameteren verdi blir fjernet fra mengden m. >
  }

  public void skrivMengdeinnhold( Heltallsmengde m, JTextArea t )
  {
    < Skriver ut innholdet av mengden m i tekstområdet t. >
  }

  public void skrivMengder()
  {
    < Skriver ut innhold av mengder, tilsvarende som vist på vindusbildet
     ovenfor. >
  }

  public void skrivMengderelasjoner()
  {
    < Skriver ut relasjoner mellom mengder, tilsvarende som det er vist
      på det nederste tekstområdet på vindusbildet ovenfor. >
  }

  < En metode som foretar riktige metodekall, avhengig av hvilken knapp det
      blir klikket på. >
}

a) Programmer metodene settInn og fjern.

b) Programmer metodene skrivMengdeinnhold og skrivMengder.

c) Programmer metoden skrivMengderelasjoner.

d) Programmer den metode som er beskrevet nederst i skissen ovenfor, den som skal foreta riktige metodekall.

e) Programmer følgende metode, som kan være en utvidelse av applikasjonen:

  public String snittinnhold( Heltallsmengde a, Heltallsmengde b,
                              Heltallsmengde c )
  {
    < Returnerer innholdet i snittet mellom de tre mengdene a, b og c
      (det vil si de elementer som er felles for alle tre). Den returnerte
      teksten skal utformes på tilsvarende måte som beskrevet i metoden
      innhold() i klassen Heltallsmengde. >
  }

Oppgave 3

a) Programmer en klasse som sammen med de to klassene Heltallsmengde og Mengdeoperasjoner kan brukes til å få til et kjørbart program.