erstellt 28.01.06; übersetzt 12.04.10, überarbeitet 03.02.20, 21.09.20, 24.10.22; Deutsche Übersetzung Heinrich Gailer


Kapitel 9C Programmieraufgaben

Allgemeine Hinweise: Wir schreiben jedes Programm wie angegeben. Keines dieser Programme erwartet die Eingabe von Daten durch den Anwender. Die Werte, die von den Programmen verwendet werden, sind durch Deklaration und Zuweisungsanweisungen fest kodiert. Das ist normalerweise eine schlechte Form der Programmierung, aber gut genug für jetzt.


Aufgabe 1 — Objekte, erzeugt zur Laufzeit

Wir schreiben ein Programm, dass ein String-Objekt erzeugt, das den String "Hello World" (oder einen anderen String) enthält. Wir weisen die Referenz auf das Objekt der Referenzvariablen str1 zu. Dann geben wir jetzt die Zeichen auf dem Bildschirm aus:

System.out.println( str1 );

Wir führen das Programm aus, um sicher zu gehen, dass es so funktioniert, wie wir es erwarten.

Jetzt fügen wir jetzt eine zweite Referenzvariable str2 hinzu. Aber für diese Variable erzeugen wir kein Objekt, auf das sie verweist. Wir fügen dann eine Anweisung hinzu, die die Variable str2 verwendet, als wenn sie eine gültige Objektreferenz enthalten würde. Wir führen das Programm aus und sehen was passiert:

System.out.println( str2 );

Experimentiert ein bisschen mit dem Programm, um die Vorstellung in Eurem Kopf zu zementieren, dass ein Objekt und dessen Referenzvariable zwei verschiedene Dinge sind und, dass ein Objekt zur Laufzeit erzeugt wird.

Zurück zum Inhaltsverzeichnis.


Aufgabe 2 — Stringlänge

Wir kompilieren und führen das Programm StringDemo2 dieses Kapitels aus.

class StringDemo2
{
  public static void main ( String[] args )
  {
    String str;
    int    len;

    str = new String( "Elementary, my dear Watson!" );

    len = str.length();

    System.out.println("Die Laenge ist: " + len );

  }
}

Wir ändern jetzt den String auf verschiedene Weise und beobachten die Auswirkung auf die berechnete Stringlänge. Fügen dann zusätzliche Leerzeichen auf beiden Seiten des Strings und innerhalb des Strings hinzu; fügen weitere Satzzeichen hinzu; fügen ein Tab-Zeichen ein (ein richtiges Tab-Zeichen, nicht einfach Leerzeichen). Beachtet, dass die Länge des Strings "MMMMMM" die gleiche ist wie von "iiiiii".

Zurück zum Inhaltsverzeichnis.


Aufgabe 3 — Eine String-Methode, die einen neuen String erzeugt

Es ist oft nützlich unnötige Leerzeichen auf beiden Seiten des Strings zu entfernen. Die trim() Methode des String-Objekts tut das.

Sie erzeugt ein neues String-Objekt auf der Basis eines vorhandenen Stringobjekts. Dabei hat das neue String-Objekt alle Zeichen des Originals, bis auf die Leer- und Tab-Zeichen auf beiden Seiten, die entfernt wurden. Der ursprüngliche String wird nicht geändert. Zum Beispiel, nachdem die folgenden Anweisungen ausgeführt wurden

String erster = new String("    In einem Loch    in der Erde, da lebte ein Hobbit.   ");
String zweiter;

zweiter = erster.trim();

gibt es ein zweites Objekt auf das zweiter verweist, das die Zeichen

"In einem Loch    in der Erde, da lebte ein Hobbit."

enthält. Beachtet, dass die inneren zusätzlichen Leerzeichen erhalten bleiben.

Wir schreiben ein Programm (oder modifizieren das vorherige), das ein neues Stringobjekt erzeugt, indem es ein vorhandenes Stringobjekt auffordert seine trim() Methode aufzurufen. Dann geben wir die beiden Strings auf dem Bildschirm aus. Experimentiert mit Leer- und Tab-Zeichen, um festzustellen, was vom Original entfernt wird.

Zurück zum Inhaltsverzeichnis.


Aufgabe 4 — Wir experimentieren mit substring()

Wir kompilieren und führen das unten stehende Programm aus, um zu sehen ob es funktioniert. Nehmen dann anstelle der 8 einen anderen Wert und überprüfen, ob das Ergebnis das ist, was wir erwarten.

class StringDemo3
{
  public static void main ( String[] args )
  {
    String str = new String( "Golf is a good walk spoiled." ); // erzeuge das originale Stringobjekt

    String sub = str.substring(8); // erzeuge ein neues Objekt aus dem Original

    System.out.println( sub );

  }
}

String-Objekte haben noch eine andere Version der substring() Methode, die wie folgt aussieht:

substring( int startIndex, int endIndex )

Diese Methode erzeugt ein neues Stringobjekt (basierend auf dem ursprünglichen Objekt), das aber nur die Zeichen enthalten wird, die mit startIndex beginnen und mit endIndex - 1 enden. Daher ist die Länge eines Substrings endIndex - beginIndex. Die Methode erzeugt ein völlig neues Objekt: die Zeichen, die es enthält, sind eine Kopie der Zeichen des Originalobjekts. Zum Beispiel:

String str = new String( "Golf is a good walk spoiled." ); // erzeuge das Oiginalobjekt
System.out.println(str.length()); // die Anzahl der Zeichen ist 28
String sub = str.substring(8, 19); // erzeuge ein neues Objekt aus dem Original

erzeugt ein neues Objekt (referenziert von sub), das die Zeichen "a good walk" enthält.

Wir modifizieren das Programm, so dass es die substring() Methode mit unterschiedlichen Parameterwerten aufruft. Experimentiert mit den zwei Parametern, um zu sehen, wie sie funktionieren. Wir versuchen das Folgende:

  1. Wir geben beiden Parametern den gleichen Wert.
  2. Wir geben dem ersten Parameter den Wert 0 und dem zweiten Parameter den Index des letzten Zeichens (27 in diesem Beispiel).
  3. Anstatt wie oben das Literal 27 zu verwenden, verwenden wir str.length()-1
  4. Was passiert, wenn wir str.length() als zweiten Parameter verwenden?
  5. Was passiert, wenn wir einen größeren Wert als str.length() z.B. 29 als zweiten Parameter verwenden?
  6. Wir geben dem ersten Parameter einen negativen Wert.
  7. Wir geben dem zweiten Parameter einen Wert der größer ist als 27.
  8. Wir kehren die Reihenfolge der Parameter um.

Gute Programmierer schreiben Methoden, so dass sie vernünftig mit allen möglichen Eingabewerten umgehen können, auch mit denen, die keinen Sinn ergeben. Und aus guten Gründen der Sicherheit müssen Programmierer damit rechnen, dass manche Anwender bösartig versuchen werden Parameter zu finden, die Probleme oder ein merkwürdiges Verhalten verursachen, das dann irgendwie ausgenützt werden kann.

Zurück zum Inhaltsverzeichnis.


Ende der Aufgaben