// Example array
{
const int N=5;
double x[N], y[10]; // Declaration
x[0] = 1.0; // Manipulations
x[1] = -2;
x[2] = -x[1];
x[3] = x[1]+x[2];
x[4] = x[1]*x[2];
// access to x[5] , i.e., x[N] is not permitted
}
|
Die eckigen Klammern dienen im Vereinbarungsteil der Dimensionsvereinbarung
x[N] und im Anweisungsteil dem Zugriff auf einzelne
Feldelemente x[3] .
Das Feld kann schon bei Deklaration initialisiert werden:
double x[N] = {9,7,6,5,7}
Achtung : Die Numerierung der Feldelemente beginnt mit 0. Daher darf nur auf Feldelemente xi, i = 0,..., N - 1 zugegriffen werden. Andernfalls sind mysteriöses Programmverhalten, unerklärliche Fehlberechnungen und plötzliche Programmabstürze zu erwarten, deren Ursache nicht offensichtlich ist da sie eventuell erst in weit entfernten Programmteilen auftreten können.
Typischer Fehler
// Typical error
{
const int N = 123;
int ij[N] , i;
...
for (i = 1; i <= N; i++) // !! WRONG !!
{
cout << ij[i] << endl;
}
}
|
Es werden die Feldelemente ij1, ij2, ij3, ij4 und der unsinnige Wert von ij5 ausgegeben, jedoch nicht das allererste Feldelement ij0 .
Die Dimension eines statischen Feldes muß zum Zeitpunkt der Compilierung bekannt sein, daher dürfen nur Konstanten oder aus Konstanten bestehende Ausdrücke als Dimension auftreten.
{
const int N = 5, M = 1;
int size;
float x[5]; // Correct
short i[N]; // Correct
char c[N-M+1]; // Correct
int ij[size]; // !! WRONG !!
}
|
Beispiel: Ein interessanter Spezialfall des Feldes ist die Zeichenkette (String). Wir initialisieren den String mit dem Wort ''Mathematik'' und geben ihn in Normalschrift und zeichenweise aus.
// String variables
#include <iostream.h>
#include <string.h>
main()
{
const int L=11; // 10+1
char word[L];
int i;
strcpy(word,"Mathematik"); // initialization
cout << endl << word << endl;
for (i = 0; i < L; i++)
{
cout << word[i] << " " ;
}
cout << endl;
}
|
Die Zeichenkette hätte auch mit
char word[L] = "Mathematik";
oder
char word[] = "Mathematik";
initialisiert werden können, wobei in letzterem Fall
die Länge des Feldes word aus der Länge der
Zeichenkettenkonstante bestimmt wird.
Beispiel:
Berechnung der L2-Norm eines Vektors, d.h.,
|| ![]()
: =
// Array: L_2 n
#include <iostream.h
#include <math.h>
main()
{
const int N=10;
double x[N], norm;
// Initialize x
for (i = 0; i < N ; i++)
{
x[i] = sqrt(i+1.0);
}
// L_2 norm calculation
norm = 0.0;
for (i = 0; i < N; i++)
{
norm += x[i]*x[i];
}
norm = sqrt(norm);
cout << " L2-norm : " << norm << endl;
}
|
Als kleines Beispiel diene uns die Fibonacci Zahlenfolge, welche über die zweistufige Rekursion


// Demo of Fibonacci numbers
#include <iostream.h>
#include <math.h>
main()
{
const int N = 20;
int i;
int x[N+1]; // !! N+1 !!
double fib;
// Calculate Fibonacci numbers
x[0] = 0; x[1] = 1;
for ( i = 2; i <= N; i++ )
x[i] = x[i-1] + x[i-2];
// Output x
...
/// Check last Fibonacci number
fib = ( pow(0.5*(1.0+sqrt(5.0)),N)
-pow(0.5*(1.0-sqrt(5.0)),N) )/sqrt(5.0);
cout << "fib(" << N << ") = " << fib << endl;
}
|
Als weiteres Beispiel sollen Minimum und Maximum eines Vektors bestimmt und die entsprechenden Vektorelemente miteinander vertauscht werden (analog zu Pivotisierung). (siehe Ex513.cc) Dies beinhaltet die beiden Teilaufgaben:
|
Beim Vertauschen führt
die naheliegende, erste Idee x[kmin] = x[kmax]
x[kmax] = x[kmin]
nicht zum Erfolg. Warum? |
// Pivot for a vector
#include <iostream.h>
#include <float.h>
main()
{
const int N=10;
double x[N], xmin, xmax, tmp;
int kmin, kmax, i;
// Initialize x
for (i = 0; i < N ; i++)
{
cin >> x[i];
}
// Initialize min/max
xmin = DBL_MAX; // in floats.h
xmax = -DBL_MAX;
// Initialize indices
kmin = kmax = -1;
// Determine min/max
for (i = 0; i < N; i++)
{
if ( xmin > x[i] )
{
xmin = x[i];
kmin = i;
}
if ( xmax < x[i] )
{
xmax = x[i];
kmax = i;
}
}
// Swap Pivot elements
// Do nothing for N=0 or constant vector
if ( kmax != kmin )
{
tmp = x[kmin];
x[kmin] = x[kmax];
x[kmax] = tmp;
}
// Print Pivot vector
...
}
|