erstellt 24.09.99; kleinere Änderung 04.05.00; übersetzt 21.05.03; überarbeitet 15.12.03, 19.07.04, 19.10.06, 10.01.11, 05.12.17, 19.06.18, 06.05.2019, 29.11.21, 16.06.22; Deutsche Übersetzung Heinrich Gailer


Kapitel 33 Programmieraufgaben

Aufgabe 1: Unveränderbare Box

Wir implementieren eine Klasse Box, ähnlich wie in der vorherigen Testaufgabe. Aber die neue Implementierung von Box wird eine bessere Kapselung haben. Hier ist die Dokumentation für Box:

class Box

Eine Klasse, die eine Box implementiert.

Konstruktoren

Box ( double breite, double hoehe, double laenge )

Box ( double seite )

Methoden

double berechneVolumen( )

double berechneOberflaeche( )

Wir verwenden als Ausgangsbasis das Beispiel des vorherigen Tests, das für diese und die nächsten Übungen leicht modifiziert werden kann.

Wir deklarieren in der jetzigen Implementierung von Box alle Instanzvariablen als private. Das bedeutet, dass nur die Methoden eines Box-Objekts dessen Objektdaten sehen können. Das Objekt wird unveränderbar sein, wenn es keine Zugriffsmethoden gibt, die die Daten ändern. Ein unveränderbares Objekt ist ein Objekt, dessen Daten sich nicht ändern.

Ihr erinnert Euch vielleicht daran, dass Stringobjekte unveränderbar sind — sobald die Zeichen des Strings mit dem Konstruktor gesetzt worden sind, werden sie sich niemals ändern (obwohl sie für die Erzeugung anderer Stringobjekte verwendet werden können.) Es gibt viele Vorteile in der Verwendung unveränderbarer Objekte, besonders in der Programmierung mit Threads (mit Threads werden fast alle umfangreichen Programme geschrieben).

Wir geben auf die Methoden von Box öffentlichen (public) Zugriff.

Dann testen wir die Box-Klasse mit verschiedenen Versionen dieses Programms:

class BoxTester
{

  public static void main ( String[] args )
  {
     Box box = new  Box( 2.5, 5.0, 6.0 ) ;

     System.out.println( "Flaeche: "  + box.berechneOberflaeche( ) +
                         " Volumen: " + box. berechneVolumen( ) );

     System.out.println( "Laenge: " + box.laenge +
                         " Hoehe: " + box. hoehe +
                         "Breite: " + box.breite )  ;
  }
}

(Das obenstehende Programm wird, so wie wir es wollten, nicht kompilieren. Wir überlegen warum es nicht kompiliert werden kann und bessern es aus, so dass es sich kompilieren lässt.)

Zurück zum Inhaltsverzeichnis.


Aufgabe 2: Private Methoden für Box

Die Implementierung von berechneOberflaeche( ) , wie sie in der vorherigen Testaufgabe gegeben wurde, ist wahrscheinlich vernünftig für die Box-Klasse. Aber, um private Methoden zu üben schreiben wir wie folgt:

  double berechneOberflaeche( )
  {
    return 2 * berechneOberflaecheVorn() +
           2 * berechneOberflaecheOben() +
           2 * berechneOberflaecheSeitlich() ;
  }

Dabei sind berechneOberflaecheVorn(), berechneOberflaecheOben() und berechneOberflaecheSeitlich() private Methoden, um die Fläche der vorderen, der oberen und der seitlichen Seite der Box zu berechnen. Wir müssen sie unserer Klasse hinzufügen. Private Methoden sind oft "Hilfsmethoden", die von den öffentlichen Methoden verwendet werden, aber nicht von außerhalb der Klasse verwendet werden können. Wir testen das Programm mit verschiedenen Versionen des folgenden:

class BoxTester
{

  public static void main ( String[] args )
  {
     Box box = new  Box( 2.5, 5.0, 6.0 ) ;

     System.out.println(
       "Flaeche: "  + box.berechneOberflaeche( ) + " volumen: " + box. berechneVolumen( ) );
     System.out.println( "Flaeche oben: "  + box.berechneOberflaecheOben() );

  }
}

(Das obenstehende Programm wird, wie erwartet, nicht kompilieren.)

Zurück zum Inhaltsverzeichnis.


Aufgabe 3: Box-Konstruktor und -Zugriffsmethoden

Wir fügen der Box-Klasse einen neuen Konstruktor hinzu:

Box( Box alteBox )

Der Konstruktor erzeugt ein neues Box-Objekt mit genau den gleichen Dimensionen des übergebenen Box-Objekts alteBox. Natürlich wird das alte Objekt nicht verändert.

Wir fügen jetzt einige Zugriffsmethoden hinzu. Eine Zugriffsmethode ist eine Methode, die verwendet werden kann, um auf private Variablen (und andere Variablen) eines Objekts zuzugreifen:

public double getLaenge()
public double getHoehe()
public double getBreite()

Jede dieser Methoden gibt bloß den Wert einer Instanzvariablen zurück. Da das Objekt unveränderbar ist, gibt es keine Zugriffsmethode, um die Instanzvariablen zu ändern. Wir testen das Programm mit der geänderten Testklasse der vorherigen Aufgabe.

Zurück zum Inhaltsverzeichnis.


Aufgabe 4: Größere Boxen

Es wäre schön eine Box zu erzeugen, die größer ist als eine gegebene Box. Wir schreiben diese Methode:

public Box groessereBox()

Das ist eine öffentliche Methode, die eine Referenz auf ein neues Box-Objekt zurückgibt. Die neue Box wird in jeder Dimension 25% größer sein als die alte Box.

Die Methode wird einen Konstruktor verwenden müssen, um die neue Box zu erzeugen:

public Box groessereBox()
{
  // do stuff
}

Wir schreiben jetzt eine Methode, die eine Box zurückgibt, die in jeder Dimension 25% kleiner ist als eine gegebene Box.

Wir schreiben wie üblich ein Testprogramm, um die Klasse zu testen.

Zurück zum Inhaltsverzeichnis.


Aufgabe 5: Verschachtelte Boxen

Wir schreiben eine Methode, die true oder false ergibt, je nach dem ob eine Box vollständig in eine andere Box passt:

public boolean passtIn( Box aeussereBox )

Dies ist möglicherweise eine schwierige Methode, da die innere Box hineinpassen oder nicht hineinpassen kann, je nach dem wie sie gedreht wird. Um die Methode zu vereinfachen, schreiben wir sie so, dass sie true zurückgibt, wenn zwei Boxen ohne Rotation ineinander geschachtelt werden können (Höhe wird mit Höhe verglichen, Länge mit Länge usw.).

Zurück zum Inhaltsverzeichnis.


Was abzuliefern ist:

Wenn das ein Auftrag für eine regelgerechte Klasse wäre, würden wir aufgefordert werden das Folgende abzuliefern:

  1. Eine sauber geschriebene Dokumentation der letzten Version der Klasse.
  2. Den Quellcode der endgültigen Implementierung der Klasse.
  3. Quellcode und Output für mehrere kleine Programme, die die verschiedenen Eigenschaften der Klasse testen.

Die Zusammenstellung des abzuliefernden Materials ist häufig ein substantieller Teil der Arbeit. Das ist gute Praxis für die realen Aufgaben.

Zurück zum Inhaltsverzeichnis.


Ende der Aufgaben.