Claus Schönleber

Hitchhacker´s Guide To PASCAL  [Vol. 1]

 [ zurück | weiter ]
   [ Start | Beispielprogramme Download | Home ]

Inhalt

Compiler
Programmieren
Datentypen,
Variablen,
Standardfunktionen
Logik
Verzweigung,
Strukturierung
Schleifen
Felder (Arrays)
Verteiler: CASE
Zeichenketten
(Strings)
Textdateien
Module
(Prozeduren,
Funktionen)
Anhang
(Operatoren,
abgeleitete
Funktionen)
 
 

 

 

Arrays (Felder) 

Mit dem Array kommen wir zu einem Datentyp, der schon nicht mehr als "einfacher Datentyp" bezeichnet werden kann. Einfache (Standard-)Datentypen, wie wir sie schon kennengelernt haben, sind zum Beispiel integer, real, boolean oder char. Da ihnen eine Ordnung auferlegt wurde (Natürliche Ordnung der Zahlen, lexikographische Ordnung der Zeichen), werden sie auch skalare Typen genannt. Darüberhinaus bietet PASCAL aber auch Typen, die aus Komponenten zusammengesetzt werden. Solche Typen werden strukturiert genannt. Es gibt natürlich mehrere strukturierte Typen.

Die Komponenten dieses Typs haben alle denselben Grundtyp, dewegen heißt die Struktur des Arrays auch homogen

Wie sieht solch ein Feld nun aus? Bevor wir auf die Definition eingehen, soll erst erklärt werden, wie das Ganze funktioniert. 

Bei einem Array oder Feld handelt es sich ganz einfach um eine Ansammlung von einzelnen Variablen. Die Variablen, die wir bisher kennengelernt haben, lassen zwar eine Speicherung von Daten zu, es ist aber nicht möglich, auf eine Variable zuzugreifen, ohne daß man zur Programmierzeit genau weiß, auf welche man zugreifen will. Mit anderen  Worten: Wenn ich einen Wert aus einer einfachen Variable haben möchte, muß ich den Variablennamen explizit angeben, d.h., ich muß wissen, welche Variable ich meine. 

Bei der Bearbeitung von vielen Daten gleichen Typs kommt es aber vor, daß ich ein Verfahren benutzen muß, daß mir nicht erlaubt, auf eine ganz bestimmte Variable zuzugreifen, sondern nur auf eine berechnete Position innerhalb einer Liste. Die Berechnung erfolgt dann mit einem gewöhnlichen Ausdruck. Dieses Verfahren ist mit einfachen Variablen nicht mehr durchführbar. 

Deswegen werden eine vorher bestimmte Anzahl von Einzelvariablen zu einer Liste zusammengeschlossen und mit einem einzigen Namen versehen. Das ist der Feldname. Um nun aus der Menge von Variablen trotzdem jede einzelne noch eindeutig identifizieren zu können, vergibt man jedem Mitglied des Verbundes "Etiketten", zum Beispiel in Form von Nummern. Allerdings muß solch ein Etikett nicht unbedingt Nummern darstellen. Die Etiketten heißen Index.

Schauen wir uns den Unterschied zwischen einer einfachen Variablen und einem Array in einem Schaubild an: 
 
 



Im Schaubild hat die Variable den Namen "a", das Feld den Namen "f". Da alle Komponenten des Feldes den Namen "f" haben, müssen sie durch einen Index unterschieden werden. Dieser Index ist im Schaubild durch die Ziffern 1 bis 3 symbolisiert. Ansonsten kann eine
Komponente (Feldelement) behandelt werden wie jede normale Variable. Das bedeutet, daß ein Feldelement grundsätzlich, solange es mit seinem Typ vereinbar ist, in jedem beliebigen Ausdruck stehen darf. Ebenfalls erfolgen Zuweisungen in derselben Art wie bei Variablen. 

Ein Feld wird im Deklarationsteil wie jede andere Variable deklariert. Der Typ wird folgendermaßen formuliert: 

ARRAY [<indextyp>{,<indextyp>}] OF <komponententyp>; 
Der Zugriff auf ein Feldelement geschieht durch den sogenannten Selektor. Er besteht aus dem Namen des Feldes mit dem in eckigen
Klammern dahinterstehenden Index: 
<name> [<index>] 
Array
Ein Array oder Feld ist ein aus beliebig vielen Variablen desselben Typs zusammengesetzter Verbund. Er ist durch einen Namen eindeutig definiert. Die einzelnen Komponenten eines Arrays heißen Feldelemente. Der Typ der einzelnen Komponenten sowie der Typ des Index legen fest, welche Werte die Komponenten bzw. die Indices annehmen dürfen. 
Beispiele
Deklaration: 
  • schachbrett:ARRAY ['A'..'F',1..8] of char; 
  • liste:ARRAY [1..maxint] OF integer; 
  • statistik:ARRAY ['A'..'Z'] OF integer; 
Selektion und Zuweisung: 
  • schachbrett ['E',5] := 'B'; 
  • writeln (liste [23]); 
  • statistik ['W'] := 17; 
  • writeln (statistik ['W']);
Wie man den Beispielen entnehmen kann, muß die Liste der Feldelemente nicht nur eine Richtung ausfüllen. Sie kann, wie beim Beispiel des Schachbretts, sich beispielsweise in zwei Richtungen ausbreiten. Man nennt das die Dimension des Feldes. So haben die Felder "liste" und "statistik" des Beispiels die Dimension 1, das Feld "schachbrett" die Dimension 2. Es sind in PASCAL beliebig viele Dimensionen erlaubt. Sie werden nur durch die Speicherkapazität und das Vorstellungsvermögen des Benutzers begrenzt. 

Auch hier soll ein einfaches Programm erläutern, wie Felder formal eingesetzt werden können: 

PROGRAM feld_beispiel; 
  VAR index : integer; 
      feld  : ARRAY [1..10] OF integer; 
BEGIN 
  (*** Eingabe ***) 
    FOR index := 1 TO 10 DO 
      feld [index] := index * index; 
  (*** Ausgabe ***) 
    FOR index := 1 TO 10 DO 
      writeln ('feld [',index:2,'] = ',feld [index]:3); 
END. 
Das Programm tut nicht viel. Es weist nacheinander allen 10 Feldelementen das Quadrat des Index zu und gibt am Ende den Inhalt aller Feldelemente auf dem Bildschirm wieder aus. Übrigens sieht man hier sehr schön, wie eine FOR- oder andere Schleife mit einer Laufvariablen als Index gewinnbringend eingesetzt werden kann. Die Bildschirmausgabe sieht so aus: 
 
feld [ 1] = 1 
feld [ 2] = 4 
feld [ 3] = 9 
feld [ 4] = 16
feld [ 5] = 25 
feld [ 6] = 36 
feld [ 7] = 49 
feld [ 8] = 64 
feld [ 9] = 81 
feld [10] = 100 
[Ausgabe Beispielprogramm Feld]

Daß bei diesem Beispiel der Komponententyp und der Indextyp identisch sind, ist nicht repräsentativ. Wie es anders geht, zeigt das nächste Beispiel: 

PROGRAM feld_beispiel2; 
  VAR index,eingabe : char; 
      feld          : ARRAY ['A'..'Z'] OF boolean; 
BEGIN 
  (*** Initialisierung ***) 
    FOR index := 'A' TO 'Z' DO 
      feld [index] := false; 
  (*** Eingabe ***) 
    write ('Geben Sie einen Buchstabe ein: '); 
    readln (eingabe); 
  (*** Berechnung ***) 
    FOR index := 'A' TO 'Z' DO 
      feld [index] := (eingabe = index); 
  (*** Ausgabe ***) 
    FOR index := 'A' TO 'Z' DO 
      IF feld [index] THEN 
        writeln ('Der Buchstabe war ',index); 
END. 
Auch diese Programm arbeitet seine Aufgabe in sehr merkwürdiger Form ab, aber es übt. Jedoch sieht man deutlich, daß der Indextyp nichts mit Zahlen zu tun hat. Auch in der Schleife kann man also ohne Zahlen rechnen. Der Komponententyp boolean wird hier als Flag benutzt. Wir werden noch eine ähnliche, effektivere Anwendung kennenlernen. 

 

 [ zurück | weiter ]
   (c) 2001 Schoenleber.com