Beispiel 3: Ordnungsnummern, Zeichenketten, Geltungsbereiche

24.10.2016 08:31 Uhr

Ordnungsnummern

#include <iostream>

using namespace std;

int main()
{
char roemisch[10];
int arabisch;


cout << "Bitte geben Sie eine Römische Zahl ein: ";
cin >> roemisch;

arabisch=0;
for (int i = 0; roemisch[i]!=0; i = i + 1)
    {
    if (roemisch[i] == 'i') arabisch = arabisch + 1;
    else if (roemisch[i] == 'v') arabisch = arabisch + 5;
    else if (roemisch[i] == 'x') arabisch = arabisch + 10;
    else if (roemisch[i] == 'l') arabisch = arabisch + 50;
    else if (roemisch[i] == 'c') arabisch = arabisch + 100;
    else if (roemisch[i] == 'd') arabisch = arabisch + 500;
    else if (roemisch[i] == 'm') arabisch = arabisch + 1000;
    }

cout << roemisch << " in roemischer Notation entspricht " <<
        arabisch << " in arabischer." << endl;

return 0;
}

Einzelne Elemente eines Arrays können durch die Angabe der Ordnungsnummer in eckigen Klammern angegeben werden.

roemisch[i] bezeichnet also das „ite“ Element des Arrays roemisch.

Dabei gilt für ein Array

char roemisch[10];

  1. Das erste Element jedes Arrays hat die Ordnungsnummer Null; unser array beginnt also mit  roemisch[0]nichtmit roemisch[1].
  2. Dementsprechend ist das letzte Element eines Arrays immer um genau eins kleiner, als die Zahl, mit der es dimensioniert wird, in unserem Beispiel also roemisch[9]nicht roemisch[10].

Dementsprechend lautet die Grundform einer for-Schleife, mit der alle Elemente eines Arrays bearbeitet werden sollen:

Datentyp Variablenname[Dimension];

for (int Laufvariable=0;
     Laufvariable < Dimension;
     Laufvariable = Laufvariable + 1) 
        {
        ... Bearbeite Variablenname[Laufvariable] ...
        }

Zeichenketten

#include <iostream>

using namespace std;

int main()
{
char roemisch[10];
int arabisch;


cout << "Bitte geben Sie eine Römische Zahl ein: ";
cin >> roemisch;

arabisch=0;
for (int i = 0; roemisch[i] != 0; i = i + 1)
    {
    if (roemisch[i] == 'i') arabisch = arabisch + 1;
    else if (roemisch[i] == 'v') arabisch = arabisch + 5;
    else if (roemisch[i] == 'x') arabisch = arabisch + 10;
    else if (roemisch[i] == 'l') arabisch = arabisch + 50;
    else if (roemisch[i] == 'c') arabisch = arabisch + 100;
    else if (roemisch[i] == 'd') arabisch = arabisch + 500;
    else if (roemisch[i] == 'm') arabisch = arabisch + 1000;
    }

cout << roemisch << " in roemischer Notation entspricht " <<
        arabisch << " in arabischer." << endl;

return 0;
}

Arrays, die Zeichen enthalten, heißen auch Zeichenketten oder Strings.

Für sie wurde die Konvention geschaffen, daß nach dem letzten sinnvollen Zeichen jeweils ein Zeichen mit dem numerischen Wert Null angefügt wird.

Dies bedeutet, daß Arrays, die Strings enthalten sollen, jeweils ein Zeichen größer sein müssen, als tatsächlich benötigt wird. Das Wort „vier“ benötigt als Zeichenkette also fünf Zeichen zu seiner Darstellung. (‚v‘, ‚i‘, ‚e‘, ‚r‘ und eine Null.)

Dementsprechend lautet die Grundform einer for-Schleife, mit der die sinnvollen Zeichen eines Stringsbearbeitet werden sollen:

char Variablenname[Dimension];

for (int Laufvariable=0;
     Variablenname[Laufvariable] != 0;
     Laufvariable = Laufvariable + 1)
        {
        ... Bearbeite Variablenname[Laufvariable] ...
        }

Geltungsbereiche

#include <iostream>

using namespace std;

int main()
{
char roemisch[10];
int arabisch;

cout << "Bitte geben Sie eine Römische Zahl ein: ";
cin >> roemisch;

arabisch=0;
for (int i = 0; roemisch[i] != 0; i = i + 1)
    {
    if (roemisch[i] == 'i') arabisch = arabisch + 1;
    else if (roemisch[i] == 'v') arabisch = arabisch + 5;
    else if (roemisch[i] == 'x') arabisch = arabisch + 10;
    else if (roemisch[i] == 'l') arabisch = arabisch + 50;
    else if (roemisch[i] == 'c') arabisch = arabisch + 100;
    else if (roemisch[i] == 'd') arabisch = arabisch + 500;
    else if (roemisch[i] == 'm') arabisch = arabisch + 1000;
    }

cout << roemisch << " in roemischer Notation entspricht " <<

        arabisch << " in arabischer." << endl;

return 0;
}

Es ist nicht gleichgültig, wo Variablen definiert werden. Eine Variable „gilt“ grundsätzlich:

  1. Zwischen dem innersten paar aus öffnenden und schließenden Klammern, innerhalb dessen sie definiert wird, oder
  2. Innerhalb einer for-Schleife in deren Schleifenkopf sie definiert wird.

Würden wir das hier verwendete for-Statement ändern zu:
for (int i = 0, arabisch = 0; ...)

wäre die Variable „arabisch“ in unserem abschließenden cout Befehl also nicht mehr bekannt.

Würden wir die Laufvariable „i“ außerhalb der for-Schleife definieren, wäre sie in unserer ganzen Funktion main() bekannt … und dadurch für versehentliche Änderungen anfällig.

Jenen Teil eines Programmes, innerhalb dessen eine Variable bekannt ist, nennen wir ihren Geltungsbereich oder scope. Dabei gilt:

Variablen sollten immer so definiert werden, daß sie den kleinstmöglichen Geltungsbereich haben, der für das Erreichen des Programmzwecks sinnvoll ist.


Leider hat der Welt führender Hersteller von Software, Microsoft, seit einigen Jahren die Erweiterung von C++ zu einer Logik, bei der diese Form der Definition von Variablen innerhalb einer for-schleife mit einem Scope nur für diese for-Schleife möglich wird, verschlafen. (Wenn Sie unter Microsoft Visual C++ in zwei hintereinander stehenden for-Schleifen desselben Programmes zweimal denselben Variablennamen verwenden, entsteht ein Konflikt.)

In dieser und den folgenden Erläuterungen beschreiben wir daher, wie die Dinge aussehen sollten, wenn Sie andere Compiler ohne Entwicklungsumgebung verwenden; in den lauffähigen Beispielen haben wir später (Beispiel 8 ff. von heute) in einigen Fällen die Variablendefinitionen für den Microsoft-Compiler vereinfacht.