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; Deutsche Übersetzung Heinrich Gailer


Kapitel 33 Programmieraufgaben

Aufgabe 1: Unveränderbare Box

Implementieren Sie 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( )

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

Deklarieren Sie 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. Sie erinnern sich vielleicht, 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).

Geben Sie auf die Methoden von Box öffentlichen (public) Zugriff.

Testen Sie Ihre 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. Überlegen Sie warum es nicht kompiliert und bessern Sie 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 Sie 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. Sie müssen sie Ihrer 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. Testen Sie Ihr 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

Fügen Sie 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.

Fügen Sie 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. Testen Sie Ihr 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. Schreiben Sie 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()
{

  return new Box( 1.25 * this.breite, ...... )
}

Das Schlüsselwort this bezieht sich auf das Objekt, das diese Methode aufruft. Es muss nicht mit angegeben werden und dient nur der besseren Verständlichkeit. Schreiben Sie jetzt eine Methode, die eine Box zurückgibt, die in jeder Dimension 25% kleiner ist als eine gegebene Box. Schreiben Sie wie üblich ein Testprogramm, um Ihre Klasse zu testen.

Zurück zum Inhaltsverzeichnis.


Aufgabe 5: Verschachtelte Boxen

Schreiben Sie 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 Sie 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 Sie aufgefordert werden das folgende abzuliefern:

  1. Eine sauber geschriebene Dokumentation der letzten Version Ihrer 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.