Sie sind auf Seite 1von 4

Vom Struktogramm zum Die öffnende geschweifte Klammer schließt zusam-

men mit der schließenden geschweiften Klammer


Programm am Ende den Funktionskörper ein. In ihm stehen
die ausführbaren Anweisungen.
Ein ganz einfaches C++-Programm sieht so aus:
std::cout << "Hallo 2BKI1!"; Das Objekt
std::cout wird hier zur Ausgabe einer Zei-
#include <iostream> chenkette verwendet. Es wird dazu mit Hilfe des
Operators << mit der Zeichenkette verknüpft. Jede
int main() { Anweisung wird in C++ mit einem Semikolon (;)
std::cout << "Hallo 2BKI1!"; abgeschlossen, so auch diese.
return 0; Zeichenketten werden in C++ in doppelte
} Anführungszeichen gesetzt, einzelne Zeichen
in einfache Anführungszeichen. Die Ausdrücke
Dieses Programm besteht aus vier nicht leeren Zeilen, "x" und ’x’ bedeuten einmal eine Zeichenkette
die folgende Bedeutung haben: mit einem Zeichen, das ein x ist und einmal das
Zeichen x, was einen Unterschied macht (Details
kommen später).
#include <iostream> Das Hashzeichen in der er-
sten Spalte bedeutet, dass es sich um eine return(0); Hier wird die Funktion (und damit das
Präprozessordirektive handelt. Das Schlüsselwort Programm) beendet und der Rückgabewert (das
include weist den Präprozessor an, den Inhalt ei- Ergebnis) festgelegt. Es ist üblich, dass ein
ner Datei an diese Stelle in den Quelltext ein- Rückgabewert von 0 einen fehlerfreien Ablauf si-
zufügen. Der Name der Datei lautet iostream und gnalisiert, während alle anderen Werte auf Fehler
er ist hier in ein < und ein > eingeschlossen. hindeuten. Das gilt aber nur für Programme (also
die main-Funktion) nicht für andere Funktionen.
Durch diese Einfügung wird uns (unter ande-
rem) ein Objekt mit dem Namen std::cout zur
Verfügung gestellt, das wir für Ausgaben (norma- Um zu einem ausführbaren Programm zu kommen, muss
lerweise auf den Bildschirm) verwenden können. ein Struktogramm in einen Quelltext übersetzt werden.
Dabei können wir folgendermaßen vorgehen:
int main() { Alle ausführbare Anweisungen müssen
in C++ in einer Funktion stehen. Daher benötigen
• Jedes Struktogramm wird in genau eine Funktion
wir für ein Programm immer mindestens eine Funk-
übersetzt.
tion. Die Ausführung, bei der die Ausführung ei-
nes Programms beginnt, muss zwingend den Namen • Jede Variable, die verwendet wird muss definiert
main besitzen. Wenn es also in einem Programm werden. Dies geschieht am Besten direkt nach der
nur eine Funktion gibt, dann muss diese main hei- öffnenden Klammer des Funktionskörpers.
ßen. Eine Variablendefinition besteht aus einem Daten-
Dass es sich bei main um eine Funktion han- typ (für ganze Zahlen können wir int verwen-
delt, wird dadurch erkennbar, dass auf den Na- den, wenn diese auch negativ sein können oder
men ein rundes Klammerpaar folgt, das hier unsigned, wenn sie positiv oder Null sind), dem
leer ist. Dieses Klammerpaar ist eine leere Pa- Namen der Variablen, die definiert werden sollen,
rameterliste. Dass die Parameterliste leer ist, be- oder einer durch Kommata getrennten Liste von
deutet, dass der Funktion keine Informationen Namen, wenn mehrere Variablen definiert werden
übergeben werden. Die Parameterliste könnte auch sollen und einem abschließenden Semikolon. Das
(int nargs, char **argv) lauten, dann würde kann zum Beispiel so aussehen:
sie zwei Elemente enthalten. Was das bedeutet, se-
hen wir später. int x;
unsigned i, j, k;
Der Name und die Parameterliste zusammen bilden
die Signatur der Funktion. Zwei Funktionen dürfen Eine Variable enthält initial keinen bestimmten
den selben Namen haben, aber nicht die gleiche Si- Wert,1 sondern einfach das, was zufällig in dem zu-
gnatur. gehörigen Speicher steht. Wir können Variablen je-
Vor dem Namen der Funktion steht der doch initialisieren, indem wir an den Namen ein =
Rückgabetyp. Er legt fest welche Art von Er- und den gewünschten Wert anhängen, wie zum Bei-
gebnis die Funktion erzeugt. Das Schlüsselwort int spiel
bedeutet, dass das Ergebnis eine ganze Zahl ist.
Eine Funktion, die kein Ergebnis erzeugt, bekommt int x=-1;
den Rückgabetyp void. Das Schlüsselwort void unsigned i=7, j, k=0;
kann auch verwendet werden um explizit eine leere 1 Das gilt nicht für globale Variablen, die, wenn eine explizite

Parameterliste anzuzeigen, z.B. main(void). Initialisierung fehlt, mit 0 initialisiert werden.


Die Variable x einhält hier initial den Wert 1, die std::cin >> x >> y >> z;
Variable i den Wert 7 und die Variable k den Wert
8. Die Variable j enthält zunächst einen zufälligen So werden drei Daten in der Eingaben (in einer oder
Wert. mehr Zeilen) erwartet.
Auch Arrays können wir definieren, indem wir an Der Operator >> deutet an, dass Daten vom Objekt
den Namen ein eckiges Klammerpaar anhängen, in std::cin zu den Variablen hin fließen, während bei
dem die Anzahl der Elemente im Array angegeben einer Ausgabe it std::cout der Operator << andeu-
ist. Zum Beispiel tet, dass Daten zum Objekt std::cout hin fließen
(siehe oben).
int a[3];
• Das Programmende markiert im Quelltext ein
Wollen wir ein Array initialisieren, so geben wir return-Statement. Ist der Rückgabetyp der Funk-
die Werte mit Kommata getrennt in geschweiften tion void, gibt es also kein Ergebnis, so steht das
Klammern an. Zum Beispiel Schlüsselwort return alleine da, gefolgt vom an-
schließenden Semikolon. Gibt es ein Ergebnis, so
int a[3]={1,2,3};
wird dieses nach dem Wort return in Form eines
Ausdrucks mit einem geeigneten Wert angegeben.
• Eine Zuweisung im Struktogramm übersetzen wir
Also zur Beispiel return 0;
in eine Zuweisung im Quelltext. Dieser besteht aus
dem Zuweisungsoperator (=, nicht wie im Strukto- • Ein Funktionsaufruf erfolgt in C++ durch den Na-
gramm :=“), links davon der Name einer Variablen men der aufzurufenden Funktion, dem in runden

(z.B. x oder k) oder eines Arrayelements und auf der Klammern eine Werteliste folgt, in der für jeden
rechten Seite ein Ausdruck, dessen Wert von einem Parameter aus der Parameterliste (siehe oben) ein
passenden Typ ist. Wir haben ja bei der Definiti- Wert angegeben wird.
on unserer Variablen jeweils einen Typ angegeben
und wenn wir festgelegt haben, dass die Variable • Eine einfach Verzweigung wird in eine if-
Zahlen enthalten soll, dann können wir ihr keine Verzweigung übersetzt. Sie beginnt mit dem
Zeichenkette zuweisen. Schüsselwort if, dem in runden Klammern die Be-
In den Ausdrücken können die üblichen Rechenzei- dingung folgt. Dies ist ein Ausdruck, dessen Wert
chen verwendet werden, insbesondere +, -, * (für als Wahrheitswert interpretiert werden kann. Das
Multiplikation), / (für Division) und % (für die Mo- kann ein Vergleich sein, wie a==2 (beachte: in Struk-
dulooperation). Es werden im Laufe der Zeit noch togrammen wird eine einfaches = als Vergleichsope-
viele weitere Operatoren hinzukommen. rator verwendet, bei C++ ein doppeltes) oder a>b
oder ein Ausdruck, der eine ganze Zahl ergibt. Dann
• Eine Ausgabe kann mit dem Objekt std::cout er- wird die 0 als false ( falsch“) und jede andere
folgen, wenn die Datei iostream zuvor eingefügt ”
Zahl als true ( wahr“) betrachtet. Der Ja-Zweig
wurde. Sie erfolgt mit dem Operator << und sie ”
wird in geschweiften Klammern angehängt. Ist der
sieht zum Beispiel so aus: Nein-Zweig nicht leer, so kommt nach dem Ja-Zweig
das Schlüsselwort else und danach in geschweiften
std::cout << x; Klammern der Nein-Zweig.
Es können mehrere Ausgaben in einer Anweisung Wir übersetzen also
zusammengefasst werden. Das sieht dann so aus:
a>0?
std::cout << "x=" << x << " y=" << y << "\n"; Ja Nein
• Eine Eingabe kann (wenn die Datei iostream ein-
Ausgabe a Ausgabe a
gefügt wurde, siehe oben) von der Tastatur aus mit Ausgabe " ist positiv" Ausgabe " ist nicht positiv"
dem Objekt std::cin erfolgen. Das kann z.B. so
aussehen: in den Quelltext

std::cin >> x; if(a>0) {


std::cout << a;
Das Programm unterbricht dann an dieser Stelle std::cout << " ist positiv";
die Ausführung, bis eine Eingabe mit der Tasta- } else {
tur geschrieben und mit einem Zeilenumbruch abge- std::cout << a;
schlossen ist. Das eingegebene Datum wird dann in std::cout << " ist nicht positiv";
der Variablen x (die existieren muss!) gespeichert. }
Das Datum muss zur Variablen passen.
Es können auch mehrere Eingaben in einer Zeile • Mehrfachverzweigungen werden in ein switch-
erfolgen: Statement übersetzt. Dieses hat die Form
switch(a) { endet am darauffolgenden Zeilenende. Die zweite Art be-
case 1: std::cout << "eins\n"; ginnt mit einem /* und endet mit */. Alles dazwischen
break; (auch Zeilenumbrüche) gehört zum Kommentar.
case 2: std::cout << "zwei\n";
break; Kommentare werden vom Präprozessor entfernt und ha-
case 3: std::cout << "drei\n"; ben auch den Programmablauf keinen Einfluss.
break;
default: std::cout << "was anderes\n";
} Beispiel

Wichtig ist, dass am Ende jeden Zweiges ein break Wir betrachten das folgende Struktogramm, das den
steht, da sonst die nachfolgenden Anweisungen Bubblesort-Algorithmus beschreibt:
ebenfalls ausgeführt werden. Bubblesort
a: array ganzer Zahlen (Übergabepara-
• Kopfgesteuerte Schleifen werden in while-Schleifen meter)
übersetzt. Diese bestehen aus dem Schlüsselwort n: Anzahl der Elemente in aliste
while, an das in runden Klammern die Abbruchbe- dummy: ganze Zahl (Hilfsvariable)
dingung angehängt wird. Der Schleifenkörper steht i = 1..n-1
danach in geschweiften Klammen. Dieser wird so k = 1..n-1
lange ausgeführt, bis die Abbruchbedingung nicht a[k-1]>a[k] ?
mehr erfüllt ist. Ja Nein
• Zählergesteuerte Schleifen werden im Quelltext dummy := a[k-1]
durch eine for-Schleife realisiert. Diese beginnt mit a[k-1] := a[k]
dem Schlüsselwort for. Danach kommt ein rundes a[k] := dummy
Klammerpaar, dessen Inhalt durch zwei Semikolon
ist drei Teile geteilt wird.
Der erste Teil wird Initialisierung“ genannt. Ob- #include <iostream>

wohl dort fast alle stehen darf, dient er insbeson- void bubblesort(int a[], int n) {
dere dazu der Zählvariablen den Startwert zuzu- // Wir definieren
weisen. Die Zählervariable kann hier auch definiert int dummy;
(und initialisiert) werden.
Der zweite Teil ist die Abbruchbedingung, die gleich for(int i=1; i<=n-1; i=i+1) {
funktioniert, wie bei der while-Schleife. for(int k=1; k<=n-1; k=k+1) {
if(a[k-1]>a[k]) {
Der dritte Teil heißt Inkrementierung“. Auch hier dummy = a[k-1];

darf auch etwas ganz anderes stehen, aber sie a[k-1] = a[k];
ist dafür gedacht, der Zählvariablen den nächsten a[k] = dummy;
Wert zuzuweisen. Dort steht also zumeist etwas wie }
i=i+1. }
Eine for-Schleife wird ausgeführt, indem zuerst die }
Initialisierung ausgeführt wird. Dann wird solan- }
ge, wie die Abbruchbedingung erfüllt ist der Schlei-
fenkörper ausgeführt und anschließend die Inkre- // Die Funktion, bei der die Ausführung beginnt
mentierung. Daraufhin wird die Abbruchbedingung // heißt immer "main".
geprüft usw. int main() {
// Wir definieren das Array mit den
• Fußgesteuerte Schleifen sind im Quelltext // Zahlen, die sortiert werden sollen:
do-while-Schleifen. Bei ihnen steht der Schlei- int a[] = {3, 2, 4, 1, 6, 8, 9};
fenkörper in geschgweifte Klammern eingeschlossen // In der Variablen n steht, wie viele
zwischen den Schlüsselwörtern do und while. Nach // Zahlen das Array a enthält.
dem while folgt in runden Klammern die Ab- int n = 7;
bruchbedingung.
// Wir rufen die Sortierfunktion auf.
Anders als in Struktogrammen, kann in Quelltext bubblesort(a, n);
erläuternder Kommentar eingefügt werden. Es ist eine
gute Idee, davon reichlich Gebrauch zu machen. for(int i=0; i<n; i=i+1) {
std::cout << a[i] << " ";
In C++ werden zwei Arten von Kommentaren unterschie- }
den: Der erste beginnt mit zwei Schrägstrichen (//) und std::cout << "\n";
}

Wir können den Quelltext mit einem einfachen Texte-


ditor schreiben und abspeichern. Dabei ist es üblich für
den Dateinamen eine der Dateiendungen .C, .cc, .c++,
.cxx oder .cpp zu verwenden. Wir nehmen im Folgen-
den an, dass der Name der Datei, in die wir unseren
Quelltext geschrieben haben bubblesort.cpp sei.

Um ein ausführbares Programm zu erstellen, benötigen


wir einen Compiler. Dies ist eigentlich nicht ganz kor-
rekt, obwohl diese Sprechweise üblich ist. Damit aus
dem Quelltext das Executable wird, muss der Quell-
text durch den Präprozessor, dessen Ergebnis durch den
Compiler, der Assemblercode daraus macht. Der Assem-
blercode wird vom Assembler in Objektcode übersetzt,
was wiederum mit Objektcode aus anderen Quellen
vom Linker zum fertigen Executable zusammengebun-
den wird.

Wir müssen uns zunächst nicht um dies Details


kümmern, da das Programm g++ alle diese Schritte zu-
sammenfassen kann. Wir starten das Programm von der
Kommandozeile aus mit dem Kommando
g++.exe -o bubblesort.exe bubblesort.cpp

Dabei legt die Angabe -o bubblesort.exe fest, dass


das Excutable in der Datei bubblesort.exe steht (bei
Windows ist die Dateinamenserweiterung .exe, bei UN-
IX haben ausführbare Dateien zumeist keine Datein-
amenserweiterung).

Nun können wir das Programm mit dem Kommando


./bubblesort.exe

starten.

Das könnte Ihnen auch gefallen