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, stellt Pascal ganz allgemein zur Verfügung, nämlich mit der Datenstruktur ARRAY. Die entsprechende Syntax ist:
      TNeuerTyp = ARRAY [StartIndex .. EndeIndex] OF TKomponentenTyp
Zum Beispiel stellt
      TIntArray = Array [1..10] of Integer
ein Feld dar, das 10 Integerzahlen speichern kann. Die vorstehende Zeile ist eine Typ-Deklaration, was etwas ganz anderes ist als eine Variablendeklaration! Die Typdeklaration erweitert sozusagen die Kenntnis des Compilers über die in meinem Programm verfügbaren Typen um eben diesen von mir hier definierten Typ "TIntArray". Von einem mathematischen Standpunkt aus ist das Gleichheitszeichen in dieser Typdeklaration durchaus ernst gemeint: "TIntArray" soll dasselbe sein wie ein "Array [1..10] of Integer". Üblicherweise werden die in einer Unit verwendeten Typen im Deklarationsteil der Unit vor allen Variablendeklarationen in einem eigenen Abschnitt aufgeführt, der mit dem Schlüsselwort "type" beginnt. Wenn Sie den von Delphi erzeugten Standard-Rumpf einer Unit einmal aufmerksam anschauen, sehen Sie, dass für jedes Programmfenster ein zugehöriger Typ in der entsprechenden Unit deklariert wird. Die Deklaration eines Fenstertyps ist allerdings so komplex, dass wir uns damit vorerst noch nicht weiter beschäftigen wollen.

Wenn ich nun eine Variable von diesem neuen Typ "TIntArray" deklarieren will, dann muss eine gewöhnliche Variablendeklaration folgen, die diesen Typbezeichner benutzt. So wird also mit
      MyIntArray : TIntArray
eine entsprechende Variable vereinbart. Nun kann ich in meinem Programm z.B. mit MyIntArray[4] auf die vierte dieser Zahlen zugreifen, und zwar sowohl lesend:
      IntEdit1.Value := MyIntArray[4];
als auch schreibend:
      MyIntArray[4] := IntEdit2.Value;

Der Komponententyp eines Array-Typs kann irgend ein schon bekannter Typ sein. Zum Beispiel stellt
      TPalette = ARRAY [0..7] of TColor
ein Feld dar, in dem 8 Farben gespeichert werden können.

Zur Darstellung von Feldern kann man in Delphi vorteilhaft die Komponente "StringGrid" 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.

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
          RANDOM (m: Integer) : Integer
    Sie liefert Ihnen eine Integer-Zufallszahl zwischen 0 und (m-1) {einschließlich!} liefert. Beachten Sie aber, dass die kleinste mögliche Augenzahl 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]



  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