Arrays

Bisher haben wir alle Variablen einzeln definiert. Das kann aber ziemlich aufwendig werden, wenn man eine größere Anzahl von Variablen benötigt:

int x1,x2,x3,x4,x5; /* Die Definition von 1000 Variablen
wäre sinnvoll nicht mehr zu verwalten.*/

Auch die Arbeit mit diesen Variablen ist recht umständlich: Da jede nur unter ihrem Namen angesprochen werden kann, ist es nicht möglich, sie alle in einer Schleife zu durchlaufen. Diese Nachteile lassen sich vermeiden, wenn die Variablen nicht einzeln, sondern gemeinsam als Array definiert werden. Ein Array ist eine Zusammenfassung von Variablen desselben Datentyps unter einem einzigen Namen. Die einzelnen Variablen können über den Namen des Arrays und einen Index angesprochen werden und werden auch als Elemente des Arrays bezeichnet. Der Index kann ein Ausdruck und damit insbesondere eine Variable sein.

Eindimensionale Arrays

Grundlagen

Ein Feld ist ein strukturierter Datentyp mit einer bestimmten Anzahl von Elementen, die alle vom selben Typ sein müssen. In der C++-Literatur werden Felder auch als Vektoren bezeichnet. Mit der Typvereinbarung werden eigene Typnamen für Felder vergeben. Diese neuen Namen können wie Standard-typenbezeichner verwendet werden.

Beispiele:

#define max 7
typedef float Vektor[4]; 
typedef char Zeile[80]; 
typedef int Besetzt[max]; 
typedef int Zaehler[26];

Die Vereinbarung eines Feldtyps enthält die Anzahl der Elemente und den Elementtyp.

Die Anzahl muss eine Konstante sein und wird in eckige Klammern [] eingeschlossen.

Wird ein Feldtyp beispielsweise mit float Vektor[4]; vereinbart, bedeutet dies, dass dieses Feld 4 Elemente (jedes vom Typ float) hat.

Mit diesen Feldtypen können (wie mit jedem anderen Typ) Variablen vereinbart werden.

Vektor v; 
Zeile satz; 
Besetzt besetzt; 
Zaehler anz;

Auf ein einzelnes Feldelement wird über den Namen der Variablen, die mit einem Index versehen wird, zugegriffen. Der Index kann jeder beliebige int-Ausdruck sein. Der Wert des Indexausdrucks muss innerhalb der Indexgrenzen liegen. Die Untergrenze ist immer 0, die Obergrenze ist gleich der Anzahl minus 1.

Der Index wird in eckige Klammern eingeschlossen.

Der Index wird nicht überprüft.

Beispiele:

v[0]=25.2;
v[l]=37.1; 
v[2]=66.3; 
v[3]=97.7;
 
ch=satz[i*2];
 
if (zimmer[i])  ...;
anz[ch-'A']=anz[ch-'A']+l;
/* besser: */
anz[ch-'A']++;

Da Indizes nicht überprüft werden, kann beispielsweise die folgende Zuweisung vom Compiler nicht als fehlerhaft erkannt werden:

v[4]=99.0;

Wird diese Anweisung ausgeführt, kann die Reaktion des Programms nicht vorhergesagt werden. Da die Variablenspeicherplätze nacheinander vergeben werden, kann eine andere Variable verändert werden - ein Fehler, der nur sehr schwer zu finden ist. Oft stürzt auch das Programm ab! Dieser Fehler kann auch bei zu klein dimensionierten Zeichenketten auftreten.

Ein expliziter Name für einen Feldtyp darf auch fehlen, das heißt, der Feldtyp kann direkt in der Variablenvereinbarung stehen.

Beispiele (diese Vereinbarungen entsprechen den schon verwendeten Vereinbarungen):

#define max 7 
int main()
{float v[4];
 char satz[80];
 int zimmer[max]; 
 int anz[26];
} 

Die erste Schreibweise ist aber bei längeren Programmen übersichtlicher und daher zu bevorzugen.

Beispiel 1

10 Zahlen sollen eingelesen werden. Es ist das arithmetische Mittel zu berechnen. Die Anzahl der Zahlen, die größer als das Mittel sind, ist auszugeben.

CPP Code

Beispiel 2

Ein beliebiger Text soll eingelesen und die absolute und relative Häufigkeit der einzelnen Großbuchstaben in Tabellenform ausgegeben werden. Der Text wird durch einen Punkt abgeschlossen.

CPP Code

Übergabe von eindimensionalen Feldern an Unterprogramme

Die Übergabe von Feldern an Unterprogramme erfolgt

Programmbeispiel 1 sieht mit Unterprogrammen so aus:

CPP Code

Grundaufgaben

Erstelle unter Verwendung eines eindimensionalen Arrays ein Programm, dass

Programmgerüst

Aufgaben