Sie sind auf Seite 1von 15

5.

Kontrollstrukturen
5.1 Verbundanweisung / Anweisungsblock

{
// Anweisung1;
// Anweisung2;
// Anweisung3;
}

5.2 Bedingte Verzweigung

if (Bedingung)
Bedingung falsch
{ Bedingung Anweisungen 2
Anweisungen 1 wahr falsch
}
else Anweisungen 1 Anweisungen 2 wahr
{
Anweisungen 2 Anweisungen 1
}
• Verschachtelung möglich …
• else if möglich
58

5.3 Auswahl / Fallunterscheidung


Auswahl einer aus mehr als zwei Möglichkeiten für die Programmfortsetzung

Ausdruck (Fallauswahl)
Fall 1 Fall 2 Fall 3 Fall 4 ... default
Anwei- Anw. Anw. Anw. ... Anw.
sung

Typisch: Reaktion auf Tasten- / Menüeingaben

59
switch (Ausdruck)
{
case Ausdruck1:
Anweisungen;
keine Klammern
Anweisungen;
break; break nicht vergessen, sonst wird der nächste
case Ausdruck2: case-Teil mit ausgeführt (kann auch Absicht sein)
Anweisungen;
break;
...
default: für den Fall, dass kein Ausdruck übereinstimmt
Anweisungen
}

In switch-Anweisungen dürfen nur dezimale Ganzzahlen und einzelne Zeichen


verwendet werden.

Bei anderen Überprüfungen: if else -Verzweigungen

60

5.4 Laufschleifen / Wiederholungsanweisungen


for (Initialisierung; Bedingung; Aktualisierung)
Zählergesteuert {
Initialisierung
Anweisungen;
} Solange Bedingung wahr

Anweisung(en)

Aktualisierung

Ausdruck
Kopfgesteuert while (Bedingung)
{
Anweisungen; Anweisung
}

do
Fußgesteuert { Anweisung
Anweisungen;
}
while (Bedingung) Ausdruck

61
Ausdruck 1 Ausdruck 2 Ausdruck 3
for (Initialisierung; Bedingung; Aktualisierung)
Zählergesteuert {
Ausdruck 1
Anweisungen;
} Solange Ausdruck 2 wahr

Anweisung

Beispiel… Ausdruck 3

double fakultaet(int n)
{
double f=1.;
int i;
KEIN Semikolon !! (Warum?)
for (i = 2; i <= n; i++)
f *= i;

return f;
}

62

Ausdruck 1 Ausdruck 2 Ausdruck 3


for (Initialisierung; Bedingung; Aktualisierung)
Zählergesteuert {
Ausdruck 1
Anweisungen;
} Solange Ausdruck 2 wahr

Anweisung

Gegenbeispiel… Ausdruck 3

long int Zerlegung (int zahl)


{
long int teiler= 2;
for ( ; teiler* teiler <= zahl; (0 == (zahl% teiler)? zahl /= teiler: teiler++)) ;
return (zahl);
}

63
5.5 Sprunganweisungen

continue Der aktuelle Schleifendurchlauf wird abgebrochen


Fortsetzung mit dem nächsten Durchlauf

break Abbruch der gesamten Schleife (oder Fallauswahl)


Fortsetzung hinter der Schleife oder switch

goto goto Bezeichner;


...
... 
Bezeichner: Anweisung;
Anweisung;

64

5.5 Sprunganweisungen

continue Der aktuelle Schleifendurchlauf wird abgebrochen


Fortsetzung mit dem nächsten Durchlauf

break Abbruch der gesamten Schleife (oder Fallauswahl)


Fortsetzung hinter der Schleife oder switch

int i = 0;

for (;;)
{
printf ("%d\n", i++);
if (i == 10)
break;
}

65
5.5 Sprunganweisungen

continue Der aktuelle Schleifendurchlauf wird abgebrochen


Fortsetzung mit dem nächsten Durchlauf

break Abbruch der gesamten Schleife (oder Fallauswahl)


Fortsetzung hinter der Schleife oder switch

int i = 0;

for (;;)
{
if (i == 4) Warum geht‘s nicht weiter?
continue;
printf ("%d\n", i++);
if (i == 10)
break;
}

66

5.5 Sprunganweisungen

continue Der aktuelle Schleifendurchlauf wird abgebrochen


Fortsetzung mit dem nächsten Durchlauf

break Abbruch der gesamten Schleife (oder Fallauswahl)


Fortsetzung hinter der Schleife oder switch

int i = 0;

for (i = 0; i < 10; i++)


{
if (i == 4)
continue;
printf ("%d\n", i);
}

67
6. Funktionen
6.1 Allgemeines
„Unterprogramme, Prozeduren, …“ (in C alles das gleiche…)
Typisches Beispiel: Einkapselung einer Berechnung

vgl. Praktikum !

Allgemeiner Aufbau

Resultattyp Funktionsname (evtl. Parameterliste)


{
Vereinbarungen
Anweisungen
evtl. Wertrückgabe
}

sonst: int ( + Warnung)


68

#include <stdio.h>

// ----- power: base hoch n; n >= 0 -----------

int power (int base, int n)


{
int i, p;

p = 1;
for (i = 1; i <= n; ++i)
p *= base;
return p;
}
// --------------------------------------------
main ()
{
int i;

for (i = 0; i < 10; ++i)


printf ("%d %d %d\n", i, power (2, i), power (-3, i));
}

69
6.2 Gültigkeitsbereiche von Variablen

Lokale und globale Variablen

#include <stdio.h>
int z = 5;
double f;
globales f
double fakultaet(int n)
{ double f=1.; lokales f
int i; • ist nur in diesem Block gültig
for(i=2; i<=n; i++) • wird erst bei Aufruf der Funktion im Sp. angelegt
f = f * i; • überdeckt hier globales f
return f;
}

main()
{
f = fakultaet(z); Zugriff auf globales f
printf("%g\n", f);
}

Anm.:
Globale Variablen sind auch eine Variante zur Kommunikation mit Funktionen…

70

Statische Variablen

• gelten nur lokal

• behalten den Wert


zwischen Fu.-Aufrufen bei

• haben Default-Wert 0

• Initialisierung nur mit


konstantem Wert !

• Initialisierung gilt beim


ersten Funktionsaufruf

71
Variablen in einzelnen Blöcken

Variablendeklarationen sind nach der { in JEDEM Anweisungsblock möglich


– nicht nur in Funktionsblöcken. Sie gelten dann auch nur dort.

int i;

for (i = 0; ...)
{
int k;
k = i * i;
printf("%d %d\n", i, k);
}

72

6.3 Funktionsdeklaration

Was passiert…?

73
74

Abhilfe: Funktionsdeklaration…

// auch möglich: int fakultaet (int);

75
6.4 Standardbibliothek(en)

Vorgefertigte Funktionen, die ein Anwendungsprogramm nutzen kann.

Eingeteilt in die Bereiche:

• Ein- / Ausgabe
• Datei-Ein- / Ausgabe
• Grenzwerte
• Mathematik
• Zufallszahlen
• Zeichenbehandlung
• Zeichenketten
• Konvertierung
• Speicherverwaltung
• Starten / Beenden
• Nicht-Standardfunktionen

Beispiele

76

6.5 Rekursion

„Funktionen, die einen Aufruf von sich selbst erhalten“

„Funktionen, die sich selbst aufrufen“

Ruft eine Funktion sich selbst rekursiv auf, dann erhält jede Aktivierung
einen neuen Satz aller ihrer automatischen Variablen.

Typisches Beispiel 1:

77
Typisches Beispiel 2:

Die Türme von Hanoi

78

6.6 Überladen von Funktionen

Eine Funktion wird in C++ nicht alleine über ihren Namen identifiziert,
sondern auch über die Anzahl (und den Typ) der Argumente

Achtung: Rückgabewert wird zur Unterscheidung nicht benutzt!

79
80

81
7. Zeiger und Vektoren
7.1 Einführung Zeiger / Pointer

- interne „Hilfsgrößen“, Werte haben außerhalb des laufenden Programms


keine Bedeutung

- Zeiger = Variable, die die Speicheradresse einer Variablen enthält

- typisch: fortlaufend nummerierte Speicherzellen (IMMER ganzzahlig !!)

- ursprünglich: direkter Zugriff für den Programmierer auf die Funktion des
Prozessors

- immer noch:
Übergabe von Variablen zwischen Programm und Funktion
Direkter Zugriff auf Elemente von Datenstrukturen
(Textzeichen, Bildpixel, …)

- „ausgezeichnete Technik, um unverständliche Programme zu schreiben“


(Stimmt. Aber eben nicht nur…)

82

Operatoren:

p c
& Adress-Operator
1245052

* Inhalts-Operator … … 'a' …
1245051
1245052
1245053

p = &c; // "p zeigt auf c"


c = *p; // "c ist Inhalt von p"

83
int x = 1, y = 2, z[10];
int *ip; // ip ist ein Zeiger auf int

ip = &x; // ip zeigt nun auf x


y = *ip; // y ist nun 1
*ip = 0; // x ist nun 0
ip = &z [0]; // ip zeigt nun auf z[0]

Jeder Zeiger zeigt auf einen festgelegten Datentyp (Ausnahme void * )

*ip = *ip + 10; // erhöht x um 10

y = *ip + 1; // weist y den Wert x+1 zu

*ip += 1; // erhöht x um 1
++*ip; // erhöht x um 1
(*ip)++; // erhöht x um 1. Klammern notwendig!

84

7.2 Zeiger und Funktionsargumente

Beliebte Beispielaufgabe:
Eine Funktion, die zwei Zahlen vertauschen soll.

tauscht nix…

Übergabe nur von Argumentwerten  Funktion tauscht nur Kopien der Variablen

85
Lösung: Übergabe von Zeigern

tausch (a, b); // Funktionsaufruf mit Werteparametern


tausch (&a, &b); // Funktionsaufruf mit Referenzparametern
"call by value / call by reference"
 Änderung der Übergabeparameter möglich
 Funktionen mit mehreren „Rückgabewerten“

86

Das könnte Ihnen auch gefallen