2 Felder
Zum vorigen Kapitel Zum Inhaltsverzeichnis Zum nächsten Kapitel


Schon bei den Zeichenketten haben wir eine Aneinanderreihung gleichartiger Datenstrukturen kennengelernt: sieht man einmal von der vorangestellten Längenangabe ab, läßt sich eine Zeichenkette ("String") als eine Reihe von Zeichen ("Char") auffassen, wobei die einzelnen Zeichen in der Kette indiziert sind.

Diese Methode, aus einem Datentyp durch (endliche) Reihung einen neuen Typ zu bauen, stellen viele Programmiersprachen ganz allgemein zur Verfügung, nämlich mit der Datenstruktur ARRAY. Die entsprechende Syntax ist:
In Delphi können Sie eine ARRAY-Variable folgendermaßen deklarieren:
   var ArrayName : ARRAY [Start .. Ende] OF TKompTyp
Zum Beispiel stellt
   var MyIntArray : Array [1..10] of Integer;
ein Feld dar, das 10 Integerzahlen speichern kann. Start und Ende sind Integer-Konstanten, die den zulässigen Index-Bereich für dieses Array bestimmen. In Delphi können die Grenzen dieses Bereiches frei gewählt werden, wenn nur Start < Ende ist.

Nach der obigen Beispiel-Deklaration kann ich in meinem Programm z.B. mit MyIntArray[4] auf die vierte dieser Zahlen zugreifen, und zwar sowohl lesend:
   Edit1.Text := IntToStr(MyIntArray[4]);
als auch schreibend:
   MyIntArray[4] := StrToInt(Edit2.Text);
In Java können Sie von jedem Variablen-Typ einen ARRAY-Typ ableiten, indem Sie hinter den Komponenten-Typ eine leere eckige Klammer schreiben: z.B. ist
   int[] 
der Name eines Array-Typs, der eine lineare Reihe von Integer-Zahlen zur Verfügung stellt. Für den konkreten Umgang mit einem Array deklarieren wir eine Variable von diesem Array-Typ:
      int[] myIntArray = new int[10]
Zunächst wird also der Typ genannt ("int[]", also ein Integer-Array), dann der Variablenname ("myIntArray"). Nach dem Zuweisungszeichen folgt das Schlüsselwort "new", gefolgt von "int[10]", womit das Array nun auf eine Größe von 10 Integer-Zahlen festgelegt wird. Der Indexbereich startet bei Java-Arrays immer bei "0" und geht im vorliegenden Fall bis "9".

Nach der obigen Beispiel-Deklaration kann ich in meinem Programm z.B. mit myIntArray[4] auf die fünfte dieser Zahlen zugreifen, und zwar sowohl lesend:
   Edit1.Text = Integer.toString(myIntArray[4]);
als auch schreibend:
   MyIntArray[4] = Integer.parseInt(Edit2.Text);

Der Komponententyp eines Array-Typs kann irgend ein schon bekannter Typ sein. Zum Beispiel stellt die folgende Deklaration ein Feld zur Verfügung, in dem 8 Farben gespeichert werden können:

in Delphi:
   var palette : ARRAY [0..7] of TColor; 
in Java:
   Color[] palette = new Color[8]; 


Zur Darstellung von des Dateninhaltes von Array-Variablen kann man vorteilhaft Komponenten einsetzen, die auf den ersten Blick wie Excel-Arbeitsblätter ausssehen. Auf einem solchen Rechenblatt kann man dann z.B. in einer Zeile alle Daten der Array-Variablen nebeneinander eintragen.

In Delphi können Sie dazu eine "StringGrid"-Komponente einsetzen. Es handelt sich hier um eine zweidimensionale Anordnung von Zellen, von denen jede eine Zeichenkette enthalten kann. Der Zugriff auf die Inhalte der Zellen geschieht über die Eigenschaft "Cells[x, y]", wobei x die Spaltennummmer und y die Zeilennummer der angesprochenen Zelle ist. Beachten Sie, dass die Nummerierung stets mit 0 beginnt! Wollen Sie z.B. den Wert von MyIntArray[4] in die 3. Spalte und die 2. Zeile des StringGrid "MyStringGrid" eintragen, dann erreichen Sie das durch
   MyStringGrid.Cells[2, 1] := IntToStr(MyIntArray[4]);
Beachten Sie, dass ein StringGrid nur Zeichenketten enthalten kann - wie der Name schon sagt! Sie müssen also beim Bearbeiten von numerischen Werte stets entsprechende Typumwandlungs-Funktionen wie IntToStr(), StrToInt, FloatToStr() und StrToFloat() benutzen.
In Java können Sie dazu eine "jTable"-Komponente einsetzen. Es handelt sich hier um eine zweidimensionale Anordnung von Zellen, von denen jede eine Zeichenkette enthalten kann. Der schreibende Zugriff auf die Zellen geschieht über die Methode "jTable.setValueAt(String s, int row, int col)", wobei row die Zeilennummmer und col (kurz für "column") die Spaltennummer der angesprochenen Zelle ist. Beachten Sie, dass die Nummerierung stets mit 0 beginnt! Wollen Sie z.B. den Wert von myIntArray[4] in die 3. Spalte und die 2. Zeile der jTable-Komponente "myTable" eintragen, dann erreichen Sie das durch
   String s = Integer.toString(myIntArray[4]);
   myTable.setValueAt(s, 1, 2] 
Zum Auslesen dient entsprechend die Lese-Methode "jTable.getValueAt(int row, int col)"; dies ist eine Funktion, die den an der Stelle (row, col) der Tabelle gespeicherten String ausliest und zurückgibt.

Beachten Sie, dass eine jTable-Komponente nur Zeichenketten enthalten kann. Sie müssen also beim Bearbeiten von numerischen Werten stets entsprechende Typumwandlungs-Funktionen wie Integer.toString(), Integer.parseInt(), Double.toString(), Double.parseDouble() usw. benutzen!

Bearbeiten Sie mit Hilfe dieser Informationen die folgenden Aufgaben:



  1. Das Würfel-Problem, elementar:

    Schreiben Sie ein Programm, das die Eingabe einer Anzahl n gestattet und dann auf Knopfdruck n Mal würfelt. Verwenden Sie dazu die Funktion
    In Delphi verwenden Sie dazu die Funktion
       RANDOM (m: Integer) : Integer
    Sie liefert Ihnen eine Integer-Zufallszahl zwischen 0 und (m-1) {einschließlich!}. Beachten Sie aber, dass die kleinste mögliche Augenzahl beim Würfeln nicht "0", sondern "1" ist!

    In Java verwenden Sie dazu die Funktion
       Math.random() 
    die Ihnen eine Float-Zufallszahl aus dem Intervall [0..1) liefert, wobei die 0 eingeschlossen ist, die 1 jedoch nicht. Mit
       int nzz = (int) (Math.random() * 6)
    können Sie daraus eine natürliche Zufallszahl (kurz: "nzz"!) aus dem Bereich [0, 1, 2, 3, 4, 5] basteln. Beachten Sie aber, dass die kleinste mögliche Augenzahl beim Würfeln nicht "0", sondern "1" ist!
    Deklarieren Sie ein passendes "Häufigkeits-Array" und protokollieren Sie darin während des Würfelns, wie oft jede der möglichen Augenzahlen gefallen ist. Geben Sie die Häufigkeitsverteilung schließlich in einer passenden StringGrid-Komponente auf dem Bildschirm aus!
    Lösungsvorschlag [Delphi] [Java]



  2. Das Würfel-Problem, luxuriös:

    Noch schöner wäre natürlich eine grafische Darstellung der Häufigkeitsverteilung, z.B. mit einem Säulendiagramm, das in einer passenden PaintBox-Komponente gezeichnet wird. Das Canvas-Objekt der PaintBox enthält alle dafür benötigten Werkzeuge wie z.B. die "rectangle"-Prozedur sowie "pen" und "brush". Die Details entnehmen Sie bitte wieder der Online-Hilfe!

    Bei dieser Aufgabe können Sie all das nutzbringend anwenden, was Sie im Funktionenplotter-Projekt über Grafik und Koordinatensysteme gelernt haben! Importieren Sie aus diesem Projekt die Koordinaten-Transformationsfunktionen (über die Zwischenablage!). Wählen Sie dann ein passendes User-Koordiantensystem und benutzen Sie bei der Ausgabe stets die entsprechenden Transformationsfunktionen! Berücksichtigen Sie beim Design des Formulars auch gleich, dass das Programmfenster in der Endversion skalierbar sein soll! Auch hier können Ihnen Ihre Erfahrungen aus dem Funktionenplotter-Projekt zugute kommen.

    Damit das Programm übersichtlich und wartbar bleibt, sollten Sie eigene private Prozeduren und Funktionen benutzen, z.B. eine Prozedur "ArrayFuellen", die n-mal würfelt und die Ergebnisse ins Häufigkeitsarray einträgt und eine Prozedur "GrafikDarstellen", die den Inhalt des Häufigkeitsarrays grafisch darstellt. Speziell die letztere Prozedur könnte für Teilaufgaben ihrerseits durchaus noch weitere Prozeduren aufrufen, z.B. eine Prozedur "Saeule", die in passenden Parametern den Ort, die Breite und die Höhe der jeweils darzustellenden Säule übergeben bekommt.
    [Lösungsvorschlag]



  3. Das Augensummen-Problem:

    Kopieren Sie das vorherige Projekt in ein neues Verzeichnis, um es weiterbearbeiten zu können, ohne dass Sie das alte Programm zerstören. Dann sollen Sie die folgenden Erweiterungen angehen:

    Jemand behauptet, dass beim Würfeln immer alle Wahrscheinlichkeiten gleich groß sind. Immer? Alle? Zur Untersuchung dieser Frage soll nun mit 2 Würfeln gewürfelt und die Augensumme ermittelt werden. Schreiben Sie ein Simulationsprogramm, dass eine vorzugebende Anzahl n von Doppelwürfen ausführt, über die gefallenen Augensummen Buch führt und das Ergebnis wieder grafisch darstellt.

    Ein solches Programm läßt sich mit erstaunlich wenig Änderungen bzw. Ergänzungen aus dem Ergebnis der vorigen Aufgabe entwickeln! Voraussetzung dafür ist aber, dass Sie sich an die oben vorgeschriebenen "design rules" gehalten haben...
    [Lösungsvorschlag]


    Erweiterung für Profis:

    Mathematisch anspruchsvoller ist die Frage, welche Verteilung der Augensummen sich bei 3, 4, 5 oder noch mehr Würfeln ergibt. Können Sie ein Programm schreiben, dass mit einer frei definierbaren Anzahl k von Würfeln eine frei definierbare Anzahl n von k-Würfen macht und die entsprechende Augensummenstatistik grafisch darstellt?
    [Lösungsvorschlag]




Zum vorigen Kapitel Zum Inhaltsverzeichnis Zum nächsten Kapitel