Programmierkurs: Delphi: Pascal: Arrays

Aus Wikibooks

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

[Bearbeiten] Arrays

[Bearbeiten] Was sind Arrays?

Ein Array ist vereinfacht gesagt, eine Liste von Variablen.

[Bearbeiten] Arrays anlegen

Wir wollen eine Gästeliste mit 10 Gästen anfertigen. Bisher hätten wir in etwa folgendes gemacht:

var
  gast1, gast2, gast3, gast4, gast5, gast6, gast7, gast8, gast9, gast10: string;

Der Nachteil dieses Verfahrens liegt auf der Hand - spätestens wenn zwanzig Gäste kommen.

Nun erzeugen wir einfach ein Array vom Datentyp String mit 10 Elementen:

var
  gast: array[1..10] of string;

Die genaue Struktur der Array Deklaration ist:

array [startindex .. endindex] of Datentyp;

startindex..endindex ist dabei eine so genannte Bereichsstruktur mit dem wir den Bereich zwischen Startwert und Endwert angeben (Randwerte werden mit eingeschlossen). Näheres siehe Typdefinition. Es ist auch möglich, einen Bereich wie -3..5 anzugeben.

[Bearbeiten] Auf Arrays zugreifen

Um nun auf die einzelnen Elemente zuzugreifen, verwenden wir folgende Syntax:

gast[1] := 'Axel Schweiß';
gast[2] := 'Peter Silie';
gast[3] := 'Jack Pot';
...

Die Zahl in den eckigen Klammern ist der so genannte Index. Er gibt an, auf welche Variable des Arrays wir zugreifen wollen. Gültige Werte sind hier die Zahlen 1 bis 10. Ein weiterer Vorteil von Arrays ist, dass wir anstatt eines fixen Indexes auch einen ordinalen Datentyp angeben können. Das heißt z.B. eine Integer-Variable. Die Abfrage der Namen von 10 Gästen ließe sich also so sehr einfach implementieren:

var
  index: Integer;
  gast: array[1..10] of string;
begin
  for index := 1 to 10 do
  begin
    Writeln('Bitte geben Sie den Namen des ', index, '. Gastes ein:');
    Readln(gast[index]);
  end;
end.
[Bearbeiten] Dynamische Arrays

Ändern wir unser Szenario so ab, dass wir eine Gästeliste erstellen wollen, aber nicht wissen, wieviele Gäste diese beinhalten soll. Nun könnten wir zwar ein Array erzeugen, das auf jedenfall groß genug ist um alle Gäste aufzunehmen. Allerdings wäre dies eine Verschwendung von Speicher und nicht gerade effektiv. Hier kommen uns die dynamischen Arrays zu Hilfe. Dabei handelt es sich, wie man vielleicht vermuten kann, um Arrays, deren Länge man zur Laufzeit verändern kann. Erstellt werden sie praktisch genauso wie normale Arrays, nur geben wir diesmal keinen Wertebereich an:

var
  gast: array of string;

Der Wertebereich eines dynamischen Arrays ist zwar dynamisch, aber er beginnt zwingend immer mit 0. Zu Beginn hat dieser Array die Länge 0, d.h. er beinhaltet momentan keine Variablen.

[Bearbeiten] Länge des Arrays verändern

Nun verändern wir die Länge des Arrays auf 10:

SetLength(gast, 10);

Unser Array hat nun eine Länge von 10. Das bedeutet, wir können 10 Strings in ihm verstauen. Allerdings hat das höchste Element im Array den Index 9. Das liegt daran, dass das erste Element den Index 0 hat und wir daher mit dem Index 9 schon 10 Elemente zusammen haben.

Nun könnten wir zum Einlesen unserer Gästeliste so vorgehen:

var
  index, anzahlgaeste: Integer;
  gast: array of string;
begin
  Writeln('Bitte geben Sie die Anzahl der Gäste ein:');
  Readln(anzahlgaeste);
  SetLength(gast, anzahlgaeste);
  for index := 0 to anzahlgaeste-1 do
  begin
    Writeln('Bitte geben Sie den Namen des ', index + 1, '. Gastes ein:');
    Readln(gast[index]);
  end;
end.

Dies würde zwar zum gewünschten Erfolg führen, allerdings benötigen wir so ständig eine weitere Variable, die die Länge unseres Arrays angibt. Um dies zu umgehen, bedienen wir uns der Routinen High() und Low().

[Bearbeiten] Erster und letzter Index

Die Routine High() liefert den höchsten Index des übergeben Arrays zurück:

SetLength(gast, 10);
Writeln(High(gast));  // Ausgabe: 9
 
SetLength(gast, 120);
Writeln(High(gast));  // Ausgabe: 119

Die Methode Length() gibt, wie sich vermuten lässt, die Länge des Arrays zurück:

SetLength(gast, 10);
Writeln(Length(gast));  // Ausgabe: 10

Die Methode Low() liefert den ersten Index des übergebenen Arrays zurück. Bei einem dynamischen Array wäre dies immer 0. Daher benötigt man diese Methode in einem realen Programm eigentlich nicht. Lediglich bei Arrays mit festen Wertebereichen erhält diese Funktion einen tieferen Sinn.

Nun können wir unser Programm ein weiteres bisschen vereinfachen:

var
  index, anzahlgaeste: Integer;
  gast: array of string;
begin
  Writeln('Bitte geben Sie die Anzahl der Gäste ein:');
  Readln(anzahlgaeste);
  SetLength(gast, anzahlgaeste);
  for index := 0 to High(gast) do
  begin
    Writeln('Bitte geben Sie den Namen des ', index + 1, '. Gastes ein:');
    Readln(gast[index]);
  end;
end.

Der entstehende Vorteil ist hier zugegebener Maßen eher gering, aber in der Praxis erspart man sich so leidige Tipparbeit.

[Bearbeiten] Array freigeben

Da wir beim Erstellen des Arrays Speicher belegt haben, müssen wir diesen noch freigeben. Das geschieht ganz einfach mittels:

SetLength(gast, 0);

Dabei wird die Länge des Arrays wieder auf 0 gesetzt und er beansprucht so keinen weiteren Platz im Speicher mehr. Dies sollte man allerdings immer dann ausführen, wenn der verwendete Array nicht mehr benötigt wird. Unser finales Programm sieht also so aus:

var
  index, anzahlgaeste: Integer;
  gast: array of string;
begin
  Writeln('Bitte geben Sie die Anzahl der Gäste ein:');
  Readln(anzahlgaeste);
  SetLength(gast, anzahlgaeste);
  for index := 0 to High(gast) do
  begin
    Writeln('Bitte geben Sie den Namen des ', index + 1, '. Gastes ein:');
    Readln(gast[index]);
  end;
  SetLength(gast, 0);
end.
[Bearbeiten] Mehrdimensionale Arrays

Bis jetzt haben wir uns nur mit eindimensionalen Arrays beschäftigt. Wir haben in Pascal aber auch die Möglichkeit, mehrdimensionale Arrays anzulegen. Z.B. wollen wir nun den Vornamen und den Nachnamen auf unserer Gästeliste getrennt voneinander abspeichern. Dazu erzeugen wir zuerst ein Array mit zwei Elementen, eins für den Vornamen eins für den Nachnamen:

type
  TName = array[0..1] of string; // Index 0 = Vorname; 1 = Nachname

var
  gast: array of TName;

Und so einfach haben wir einen mehrdimensionalen Array erzeugt. Man kann sich diesen Array nun auch als Tabelle vorstellen. Es gibt eine Spalte für den Vornamen und eine weitere für den Nachnamen. Die Anzahl der Einträge (Zeilen) in dieser Tabelle ist dabei beliebig, da der zweite Array dynamisch ist.

Natürlich können wir das Ganze auch in einer einzelnen Zeile deklarieren:

var
  gast: array of array[0..1] of string;

Nun wollen wir unsere Gästeliste erneut einlesen:

var
  index, anzahlgaeste: Integer;
  gast: array of array[0..1] of string;
begin
  Writeln('Bitte geben Sie die Anzahl der Gäste ein:');
  Readln(anzahlgaeste);
  SetLength(gast, anzahlgaeste);
  for index := 0 to High(gast) do
  begin
    Writeln('Bitte geben Sie den Vornamen des ', index + 1, '. Gastes ein:');
    Readln(gast[index, 0]);
    Writeln('Bitte geben Sie den Nachnamen des ', index + 1, '. Gastes ein:');
    Readln(gast[index, 1]);
  end;
  SetLength(gast, 0);
end.

Wie zu erkennen ist, werden die Indizes innerhalb der Array-Klammern durch ein Komma getrennt.


Arrow left.png Pascal: Sets Inhaltsverzeichnis Pascal: Records Arrow right.png
Persönliche Werkzeuge