Befehle freigegeben

Kap 4.
Befehle und Struktogramme
4.1 Elementare Befehle
Befehlstypen
Beispiel aus dem Musterprogramm
Zuweisung
(eigentlich kein Befehl)
x=a;
Verzweigung
Wiederholung/Schleife
Block
(zusammengesetzt)
if ( a<=0 )// unzulaessige Eingabe
while ( abs (x*x-a)>genauigkeit )
{
}
Ein-/Ausgabe
(eigentlich kein Befehl)
cin>>a;
cout <<"\n a muss > 0 sein ";
Sowohl Zuweisung als auch Ein-/Ausgabe sind Ausdrücke mit einem Wert !!!
Operand Operator Operand
x
=
a
cin
>>
a
Dr. Norbert Spangler / Programmieren I
25.10.2015
2
Elementare Befehle
Die elementaren "Befehle" sind also
Verzweigung
Fallunterscheidungen
Schleife
Wiederholungen
Block
Ein Block ist aus anderen Befehlen zusammengesetzt
„Ausdrücke“ wie Zuweisung oder Ein-/Ausgabe
Anmerkung: Es kann jeder Ausdruck hingeschrieben werden also auch
1;
a<5;
In der Regel macht dies keinen Sinn.
Dr. Norbert Spangler / Programmieren I
25.10.2015
3
4.2 Grafische Darstellung
Zur Verdeutlichung der Logik eines Programmes sind grafische
Darstellungen sehr hilfreich.
Hierzu gibt es eine Reihe von Möglichkeiten und Tools:
Flußdiagramme
Struktogramme (*)
UML (Unified Modeling Language) -> in P2
Ziele sind u.a.
eine bessere Darstellung komplexer Abläufe
Unterstützung bei der Entwicklung
Dokumentation des Programms
Dr. Norbert Spangler / Programmieren I
25.10.2015
4
Grafische Darstellung des Programmablaufs/Flussdiagramm
Start
a lesen
a<=
0
nein
Flußdiagramme sind einfach
zu verstehen, werden aber
schnell unübersichtlich.
ja
a
unzulässig
x=a
Es gibt nur wenige (kleine)
Symbole
x=x-…
nein
Ergebn
is
genau
ja
Ergebnis
ausgeben
Ende
Dr. Norbert Spangler / Programmieren I
25.10.2015
5
Grafische Darstellung des Programmablaufs/Struktogramm
Struktogramme unterstützen
sehr gut die Entwicklung
komplexer Abläufe und sind
daher eher ein Mittel zur
Unterstützung des Entwurfs
und nicht zur Dokumentation.
Es gibt nur wenige Symbole
und daher ist diese Technik sehr
einfach.
Sie sind ab sofort zu jedem
Programm anzufertigen und
vor Beginn des Praktikums
zusammen mit dem Testplan
abzugeben.
Dr. Norbert Spangler / Programmieren I
Wurzel berechnen
Eingabe a
a <= 0
Ja
a muss >0
sein
Nein
x=a
Solangex*x-a ungenau
x*x-a
x = x - ------2x
Ausgabe x
25.10.2015
6
Grafische Darstellung des Programmablaufs/UML
UML Unified Modeling Language
Ist eine Sprache für die Modellierung von Programmen mit
grafischen Symbolen für die verwendeten Begriffe.
UML ist wesentlich komplexer (es gibt 13 Diagrammtypen) als
die bisher genannten Beispiele und wird in späteren Vorlesungen
angesprochen. Beispiele siehe unten (Quelle: Wikipedia)
Dr. Norbert Spangler / Programmieren I
25.10.2015
7
4.3 Blöcke und Gültigkeitsbereiche
Ein Block ist die Zusammenfassung mehrerer Befehle
mittels eines Paars geschweifter Klammern:
{
hier kommen die Befehle des Blocks
}
Ein Block ist praktisch eine Aggregation von Befehlen
zu „einem Befehl“.
Er wird immer dort verwendet, wo nur ein Befehl stehen
soll, wo man aber mehrere Befehle ausführen möchte.
Dies wird in der Regel bei den Wiederholungen und
Verzweigungen der Fall sein.
Dr. Norbert Spangler / Programmieren I
25.10.2015
8
Gültigkeitsbereich
In einem Block dürfen auch Variable deklariert werden, welche dann aber
nur in diesem Block verwendet werden können!
Unter dem Gültigkeitsbereich einer Variablen versteht man daher den
Programmabschnitt, wo die Variable bekannt ist und wo sie verwendet
werden kann.
Der Bereich beginnt mit der Stelle innerhalb des Blocks, wo sie deklariert
wird und endet am Ende dieses Blocks. Nach Beendigung des Blocks
existiert diese Variable nicht mehr. Ihr Speicherplatz ist freigegeben.
Derartige Variable nennt man lokale Variable. Sie sind im Stack abgelegt.
{
…
Deklaration z.B. int i
Gültigkeitsbereich
}
Dr. Norbert Spangler / Programmieren I
25.10.2015
9
Gültigkeitsbereich/globale Variable
Globale Variable müssen außerhalb von geschweiften
Klammern deklariert werden, also vor dem Programm.
Damit sind sie überall bekannt, d.h. in jedem Block.
// lokal/global
#include <iostream>
using namespace std;
int i=2;
void main()
{
int j=1;
{
int k=2;
}
}
Globale Variable
Lokale Variable
Weil globale Variable überall bekannt sind und
überall damit geändert werden können stellen
sie ein Risiko dar und sollten üblicherweise
nicht verwendet werden.
Ausnahme etwa: globale Konstanten
Dr. Norbert Spangler / Programmieren I
25.10.2015
10
Gültigkeitsbereich/Beispiel
Der Name der Variablen
// lokal/global
#include <iostream>
kann auch dem einer
using namespace std;
Variablen gleich sein, die
int i=2;//global
schon vorher deklariert
void main()
wurde. Damit "überdeckt
{
diese Variable die vorher
int j=1;//Block 1
{
deklarierte, solange man sich
int j=2;//Block 2
in dem entsprechenden
cout << i << j << endl;
Gültigkeitsbereich im Block
}
befindet.
cout << i << j << endl;
}
Was wird ausgegeben?
Dr. Norbert Spangler / Programmieren I
25.10.2015
11
4.4 Zuweisungen
Zuweisung sind aus Kapitel 3 bekannt.
Sie stellen eigentlich einen Ausdruck dar !!!
Beispiel
flaeche=r*r*3.14159;
i = i+1;
Bzw. auch
i+=1;//zusammengesetzte Zuweisung
Aufbau
Variable = Ausdruck
L-Wert = R-Wert
bzw. Variable op= Ausdruck
Die Zuweisung ist ein Ausdruck der Form Operand – Operator – Operand.
Der Wert des Ausdrucks ist der R-Wert.
Dr. Norbert Spangler / Programmieren I
25.10.2015
12
Zuweisungen/Struktogramm
flaeche = r*r*3.14159
Symbol: Rechteck !!!!!!!
flaeche = r2*pi
Inhalte sind beliebig zu beschreiben.
Es muss kein C++ Code sein.
Es kann also auch r2*π da stehen.
x2 − a
x = x−
2x
C++ Code sollte aber daraus direkt ableitbar sein
Anmerkung: Das Rechtecksymbol ist das allgemeine Symbol innerhalb
der Struktogramme. Es kann jeder Befehl hineingeschrieben werden.
Dr. Norbert Spangler / Programmieren I
25.10.2015
13
Sequenz
i = i+1
j+=2
Ausgabe i und j
Es dürfen auch mehrere Befehle in ein Rechteck,
bzw. ein Block
i = i+1
j+=2
Mehrere Rechtecke können direkt untereinander
sein. Dies wird dann auch als Sequenz
bezeichnet.
Ausgabe i und j
Dr. Norbert Spangler / Programmieren I
25.10.2015
14
4.5 Verzweigungen
Verzweigungen dienen zur Fallunterscheidung,
d.h. in Abhängigkeit von einer Bedingung (=boolscher Ausdruck mit dem Wert
wahr oder falsch ) soll zwischen verschiedenen Möglichkeiten der weiteren
Befehlsausführung entschieden werden wie z.B.
- beim Wurzelziehen (Radikand <0 )
- beim Suchen ( Vergleich mit dem gesuchten Element)
- bei der Eingabe (zulässig ja/nein).
- Menue: der Anwender kann aus einer Reihe von Aktionen auswählen
Es gibt 3 Arten von Verzweigungen
Verzweigungen mit if-else
switch
Auswahloperator ?
Dr. Norbert Spangler / Programmieren I
25.10.2015
15
Verzweigung mit if – else : Beispiele
if ( x<y )
minimum=x;
else
minimum=y;
cout<<minimum;
Einrücken und Klammern
if/else stehen in derselben Spalte.
Die Klammern sollten auf Höhe von
if / else stehen
if ( x<y )
{//if-Block
Die Befehle (des Blocks) im
minimum=x;
cout<<" das Minimum ist x"<<endl; if- bzw. else-Zweig sollten stets
eingerückt werden: z.B. 4 Positionen
}
else
{//else-Block
minimum=y;
cout<<" das Minimum ist y"<<endl;
}
cout<< “ Der Wert des Minimums ist “<<minimum<<endl;
Dr. Norbert Spangler / Programmieren I
25.10.2015
16
Verzweigung mit if-else : Allgemein
if ( Bedingung ) // if-else
Anweisung1
else
Anweisung2
Anweisung3//naechste Anweisung nach dem if-else
Wirkungsweise
Auswertung der Bedingung = boolescher Ausdruck
falls true (d.h. nicht 0) : Führe Anweisung1 aus, dann kommt Anweisung3
falls false (d.h. 0 )
: Führe Anweisung2 aus, dann kommt Anweisung3
Anmerkung:
-Mit Anweisung ist jeweils auch ein Block gemeint (siehe Musterprogramm)
-Bedingung ist jeder Ausdruck, der wahr oder falsch ist
-Der else-Zweig kann weggelassen werden.
if ( Bedingung) //if ohne else
Anweisung1
Anweisung3//naechste Anweisung
Dr. Norbert Spangler / Programmieren I
25.10.2015
17
Struktogramm
Dr. Norbert Spangler / Programmieren I
25.10.2015
18
Sequenz:
2 Rechtecke
untereinander
Dr. Norbert Spangler / Programmieren I
25.10.2015
19
Verschachtelung
// Werte Stromimpuls
#include <iostream>
using namespace std;
void main()
{
double t;
cin >> t ;
if ( t < 0 )
cout << " Wert ist " << 0 <<endl;
else
{
if ( t < 1 )
cout << " Wert ist " << t <<endl;
else
{
if ( t < 2 )
cout << " Wert ist " << 2-t <<endl;
else
cout << " Wert ist " << 0 <<endl;
}
}
}
Dr. Norbert Spangler / Programmieren I
Verschachtelung
t<0
ja
nein
t<1
ja
nein
Ausgabe 0
t<2
Ausgabe t
ja
nein
Ausgabe 2-t
Ausgabe 0
if-else Befehle müssen immer
vollständig
im if oder else Block eines
„übergeordneten“
if-else Befehls enthalten sein
Übliche Vorgehensweise:
Von außen nach innen.
25.10.2015
20
Alternative: else-if-Kette
// Werte Stromimpuls
#include <iostream>
using namespace std;
void main()
{
double t;
-1
-0,5
cin >> t ;
if ( t < 0 )
cout << " Wert ist " << 0 <<endl;
else if ( t < 1 )
cout << " Wert ist " << t <<endl;
else if ( t < 2 )
cout << " Wert ist " << 2-t <<endl;
else
cout << " Wert ist " << 0 <<endl;
1,2
1
0,8
0,6
0,4
0,2
0
0
0,5
1
1,5
2
2,5
}
if - else if - else if - … else
Dr. Norbert Spangler / Programmieren I
else if Kette
25.10.2015
21
else if Kette
if ( Bedingung1)
Anweisung1
else if (Bedingung2)
Anweisung2
else if ....
else
Anweisungm
Anweisungn
Wirkungsweise
Auswertung von Bedingung1
falls true : Führe Anweisung1 aus,
dann Anweisungn
falls false:
Auswertung von Bedingung2
falls true : Führe Anweisung2 aus,
dann Anweisungn
falls false:
.....
Dr. Norbert Spangler / Programmieren I
25.10.2015
22
Struktogramm ELSE-IF-Kette
Verschachtelung
t<0
ja
nein
t<1
ja
nein
Ausgabe 0
t<2
Ausgabe t
ja
nein
Ausgabe 2-t
Ausgabe 0
Wie Verschachtelung
Dr. Norbert Spangler / Programmieren I
25.10.2015
23
IF-Sünden
Sünde 1: Abfrage boolscher Größen
bool a;
….
if ( a==true)// a ist schon wahr oder falsch!!!!
{}
//kein Vergleich erforderlich
bool b;
….
if ( b==false)
{}
Besser:
if ( a )
{}
Besser:
if ( !b )
{}
Sünde 2: Namensvergabe
bool keinFehler;// statt a wie oben
…
if ( keinFehler )
{}
Dr. Norbert Spangler / Programmieren I
bool fehler;// statt b wie oben
…
if ( !fehler )
{}
25.10.2015
24
Sünde 3: Vergleiche
IF-Sünden
bool gleich;
int wert, eingabe;
….
if (eingabe == wert)
gleich=true;
else
gleich=false;
bool ungleich;
int wert,eingabe;
….
if eingabe!=wert)
ungleich=true;
else
ungleich=false;
Besser:
gleich = (eingabe==wert);
Besser:
ungleich = (eingabe!=wert);
Sünde 4: 2xif verschachtelt aber nur ein else („Dangling else“)
bool b1,b2,
if (b1) if ( b2) cout<<"1"; else cout<<"2";
Wohin gehört das else ? Was passiert? Was ist gewollt?
Besser: geschweifte Klammern setzen
Dr. Norbert Spangler / Programmieren I
25.10.2015
25
Verzweigung mit Switch: Beispiel
// Kleinrechner/switch
void main()
{
int i,j;
Rechner
char op;
cin >> i >> op >> j;
switch (op)
{
case '+' :
cout << i << op << j <<" = " << i+j << endl;
break;
case '-' :
cout << i << op << j <<" = " << i-j << endl;
break;
case '*' :
cout << i << op << j <<" = " << i*j << endl;
break;
case '/' :
cout << i << op << j <<" = " << i/j << endl;
break;
case '%' :
cout << i << op << j <<" = " << i%j << endl;
break;
default :
cout << " unzulässiger Operator " << endl;
}
Dr. Norbert Spangler / Programmieren I
}
für Grundrechenarten + - * / und %
25.10.2015
26
Switch- allgemein
switch ( ganzzahliger Wert )
{
case konstante1:
Befehl;Befehl;...Befehl;
break;
case konstante2:
Befehl;Befehl;...Befehl;
break;
.....
default:
Befehl;Befehl;...Befehl;
}
Einrücken/Klammern
Analog Verzweigung
Kann weggelassen werden
In der Regel nicht sinnvoll.
Kann weggelassen werden
Nicht empfehlenswert !!!!!
Empfehlung: als ganzzahzliger Wert ist der Typ char geeigneter als int/short etc.,
da es keine Eingabefehler geben kann.
Dr. Norbert Spangler / Programmieren I
25.10.2015
27
switch
Wirkungsweise
Bestimmung des Werts (muss ganzzahliger Typ sein)
Vergleich mit den ganzzahligen Konstanten (alle verschieden)
Bei Übereinstimmung mit einer Konstanten->Verzweigung zur case – Marke.
Ausführung der Befehle bis zum break, dann Verzweigung zum Ende
(nach dem switch).
Fehlt der break-Befehl wird mit dem darauf folgenden Befehl fortgesetzt !!!!!
Stimmt der Wert mit keiner Konstanten überein wird bei default fortgesetzt,
Sofern vorhanden (wenn nicht, findet keine Aktion statt).
Dr. Norbert Spangler / Programmieren I
25.10.2015
28
Struktogramm
switch
op
+
Ausgabe
i+j
*
Ausgabe
/
Ausgabe
i-j
Dr. Norbert Spangler / Programmieren I
i*j
%
Ausgabe
i/j
sonst
Ausgabe
i modulo j
Fehler
meldung
25.10.2015
29
Gegenüberstellung
Die else-if Kette ist universeller als switch. Sie kann mit beliebigen
Bedingungen formuliert werden.
Switch ist beschränkt auf den Vergleich ganzzahliger Ausdrücke (u.a.
Aufzählungstyp !!), ist aber übersichtlicher, insbesondere wenn es viele
Fälle sind, die logisch eher alle „gleichwertig“ sind.
Switch ist besonders bei einer Menue-Auswahl empfehlenswert.
Dr. Norbert Spangler / Programmieren I
25.10.2015
30
Verzweigung mit dem Auswahloperator
Beispiel
Form :
Anstelle von
(Bedingung) ? wert1: wert2;
if ( x<y )
minimum = x;
else
minimum = y;
Wirkung :
Ist die Bedingung wahr, wird wert1 verwendet,
sonst wert2.
kann auch
minimum = (x<y)? x : y;
mit dem Auswahloperator ? verwendet werden
(bedingte Bewertung).
Der Auswahloperator wird bei größeren Ausdrücken schnell unübersichtlich
wert=(t<0)?0:(t<1)?t:(t<2)?(2-t):0;
Dr. Norbert Spangler / Programmieren I
25.10.2015
31
4.6 Schleifen (Wiederholungen)
Schleifen dienen dazu, eine Gruppe von Befehlen zu wiederholen etwa bei
- Der Eingabe einer Tabelle von Zahlen
- Berechnung des Durchschnitts einer großen Menge von Zahlen
- Der Bestimmung des Minimums/Maximus einer Menge von Messwerten
- Der Suche eines Elements in einer Tabelle
- Der Wahl einer Aktion durch den Anwender in einem Menue
Diese Wiederholungen finden solange statt, wie eine Wiederholungsbedingung
(WB ) gilt bzw. ein Ende noch nicht erreicht ist:
-Noch Daten da
-Noch nicht alle Zahlen untersucht (bei Maximum, Minimum, Suche)
-Der Anwender hat keine Lust mehr
WB ist üblicherweise ein Ausdruck vom Typ bool.
Das Prinzip ist also
…..
WB prüfen – Befehle ausführen – WB prüfen – ….
C++ kennt 3 verschiedene Arten von Schleifen
Dr. Norbert Spangler / Programmieren I
25.10.2015
32
Übersicht Schleifen
while-Schleife (siehe Musterprogramm)
while (WB) { Befehle }
Arbeitsweise: WB – Befehle – WB – Befehle – WB …
do-while-Schleife
Einrücken/Klammer
Analog Verzweigung
do { Befehle } while (WB)
Arbeitsweise: Befehle – WB – Befehle – WB – Befehle – WB …
for-Schleife (Verallgemeinerung der while-Schleife)
Übliche Arbeitsweise:
Eine ganzzahlige Zählvariable durchläuft Werte von einem Anfangswert bis zu
einem Endwert
Dr. Norbert Spangler / Programmieren I
25.10.2015
33
While-Schleife
while (WB) { Befehle }
Arbeitsweise: WB – Befehle – WB – Befehle – WB …
while ( Wiederholungsbedingung)
Anweisung1
Anweisung2//naechste Anweisung
Wirkung
(*) Werte Bedingung aus
falls true : Führe Anweisung1 aus
Mache weiter bei (*)
falls false: Führe Anweisung2 aus
Kopfgesteuerte Schleife
Dr. Norbert Spangler / Programmieren I
25.10.2015
34
Struktogramm/Allgemein
Dr. Norbert Spangler / Programmieren I
25.10.2015
35
Modellierung einer while-Schleife
1) Identifizierung der Wiederholungsbedingung (WB) der Schleife
(ev. Negation einer Abbruchbedingung)
2) Identifizierung aller Befehle, die wiederholt werden wie z.B.:
nächste Daten lesen – neue Summe berechnen – zählen – ...
3) Ermittlung, ob die Schleife immer mindestens einmal durchlaufen wird
falls ja:
do while -> später
andernfalls: while
4) Existenz von Befehlen unter 3) prüfen, welche WB ändern.
Ansonsten ist es eine unendliche Schleife.
Dr. Norbert Spangler / Programmieren I
25.10.2015
36
Beispiel
a) Musterprogramm
b) Aufgabe:
es sollen positive Zahlen eingelesen und deren Summe berechnet werden.
Bei Eingabe einer Zahl <=0 endet die Verarbeitung.
Wiederholungsbedingung (WB) : eingelesene Zahl > 0
Befehle in der Schleife : aktuelle Summe bestimmen, neue Zahl lesen
Mindestens einmal: nein, wenn die erste Zahl <= 0 ist -> while-Schleife
Änderung WB : ja da neue Zahl gelesen wird
Dr. Norbert Spangler / Programmieren I
25.10.2015
37
Beispiel
While-Schleife
summe = 0
erste zahl lesen
zahl>0
summe=summe+zahl
zahl lesen
summe weiter verarbeiten
double summe=0.0, zahl;
cin>>zahl;
while ( zahl>0 )
{
summe+=zahl;
cin>>zahl;
}
//summe ist berechnet
Übliche Vorgehensweise, wenn eine unbekannte Anzahl von
Daten zu lesen ist:
1. Lesen (genauer Leseversuch) direkt vor der Schleife
2. WB: Kontrolle der Eingabe
3. am Ende der Schleife: nächster Lesebefehl
Dr. Norbert Spangler / Programmieren I
25.10.2015
38
do while Schleife
do { Befehle } while (WB)
Arbeitsweise: Befehle – WB – Befehle – WB – Befehle – WB …
do
Anweisung1
while ( Wiederholungsbedingung)
Anweisung2
Wirkung
(*) Führe Anweisung1 aus
Werte WB (boolscher Ausdruck) aus
falls true : Mache weiter bei (*)
falls false: Führe Anweisung2 aus
In einer do while Schleife
wird die Anweisung in der
Schleife mindestens 1 mal
ausgeführt !!!!
Fußgesteuerte Schleife
Modellierung analog while-Schleife
Dr. Norbert Spangler / Programmieren I
25.10.2015
39
Struktogramm
Dr. Norbert Spangler / Programmieren I
25.10.2015
40
Beispiel: Do-While
Die Do-While-Schleife ist eher selten. Typische Anwendungen sind Aktionen,
wo erst danach entschieden werden kann, ob die Aktion zu wiederholen ist.
Ein Beispiel wäre die Eingabe einer Zahl, die zwischen 1 und 100 sein soll.
do
{
cout<<“Zahl eingeben“<<endl;
cin>>zahl;
}
while ( zahl<=0 || zahl>100 )//Kontrolle
Allgemein
Dr. Norbert Spangler / Programmieren I
25.10.2015
41
for-Schleife- ein Beispiel
Es sollen n ganze Zahlen gelesen und aufsummiert werden. n ist ebenfalls
einzulesen. Hier steht die Anzahl der Wiederholungen zu Beginn der
Schleife fest.
int n,summe=0,zahl;
cin>>n;
for ( int zaehler=1; zaehler<=n; zaehler++)
{
cin>>zahl;
summe+=zahl;
}
Einrücken/Klammer
analog Verzweigung
Wirkung
Initialisierung(1 mal) : zaehler wird deklariert und 1 gesetzt
* WB prüfen: ist zaehler<=n
wie While-Schleife
Befehle: zahl lesen und aufsummieren
wie While-Schleife
Reinitialisierung: zaehler erhöhen
weiter bei *
Dr. Norbert Spangler / Programmieren I
25.10.2015
42
for-Schleife allgemein
for (Anweisung1;Wiederholungsbedingung;Anweisung3)
Anweisung2
Anweisung4//naechste Anweisung
Wirkung
Führe Anweisung1(=Initialisierung) aus
(ev. mehrere durch Komma getrennt,
Deklarationen sind üblich)
int zaehler=1
(*) Werte die Wiederholungsbedingung aus-> also kopfgesteuert
Falls true : Führe Anweisung2 (Schleifenbefehle) aus
Führe Anweisung3 (=Reinitialisierung) aus
(ev. mehrere durch Komma getrennt)
Weiter bei (*)
zaehler<=n
zaehler++
Falls false: Weiter mit dem ersten Befehl nach der Schleife
Anweisung4
Dr. Norbert Spangler / Programmieren I
25.10.2015
43
Struktogramm/vereinfacht
Die For-Schleife ist kopfgesteuert.
Daher ist das Symbol identisch zur
While-Schleife.
Hinweis:
Der structorizer schlägt hier ein anderes Symbol vor, welches
üblicherweise als „Endlosschleife“ verwendet wird.
Wir werden es hier nicht verwenden!!
Dr. Norbert Spangler / Programmieren I
25.10.2015
44
Modellierung von for-Schleifen (Zählschleifen)
1.
2)
3)
4)
5)
Prinzipielles Vorgehen bei üblichen einfachen Schleifen
Bestimmung des Zählers und seines Anfangswertes, der Anzahl der
Wiederholungen bzw. des Wertes wo die Schleife endet
Initialisierung: Zähler= Anfangswert
Wiederholungsbedingung: Zähler < =Endwert oder Zähler<Wert
Reinitialisierung: Zähler um 1 erhöhen
Identifizierung aller Befehle, die wiederholt werden wie z.B.:
nächste Daten lesen – neue Summe berechnen ...
Die Möglichkeiten einer for-Schleife sind aber wesentlich weitreichender als
hier dargestellt.
Dr. Norbert Spangler / Programmieren I
25.10.2015
45
Struktogramm/Beispiel
For-Schleife
summe = 0
n lesen
zaehler von 1 bis n
zahl lesen
summe=summe+zahl
summe weiter verarbeiten
Dr. Norbert Spangler / Programmieren I
25.10.2015
46
For-Schleife: Variationen
Für eine Schleife über geraden Zahlen ändert man die Reinitialisierung
for (int i=0 ; i<n ; i=i+2)
{ .... }
Für eine „Rückwärtsschleife“ formuliert man beispielsweise wie folgt
for (int k=m ; k>0 ; k=k-1)//Alternative k-{ .... }
Eine Schleife über „relle Zahlen“
for (double x=0.0, x<=1; x+=0.01)
{ .... }
Mehrere Befehle, durch Komma getrennt, bei Initialisierung und Reinitialisierung
for (int i=1, k=100; i<n && k > 0; i=i+1,k=k-1)
{ .... }
Eine Endlosschleife
for (; ;) //Alternative while(1) oder while(true)
{ .... }
Dr. Norbert Spangler / Programmieren I
25.10.2015
47
For-Schleife/ohne Zähler
Die for-Schleife ist ein sehr mächtiger Befehl, der prinzipiell jede Wiederholung modellieren kann.
Dies ist dann oft sehr trickreich, aber meist schwer lesbar/verständlich.
for (Datei oeffnen, hole erste Daten ; kein Dateiende ; lese naechste Daten)
{
verarbeite Daten
}
Initialisierung:
Wiederholungsbedingung:
Schleifenbefehle:
Reinitialisierung:
Datei oeffnen, ersten Datensatz lesen (Versuch)
Leseversuch geglückt, Daten sind da
Daten verarbeiten
naechste Daten lesen (Versuch)
Es ist lesbarer, dies mittels einer While-Schleife zu realisieren.
Datei oeffnen;
Erste Daten holen;
while( kein Dateiende)
{
Daten verarbeiten;
naechste Daten lesen;
}
Dr. Norbert Spangler / Programmieren I
25.10.2015
48
Schleifen: geänderter Ablauf
break : Der Befehl break beendet sofort die aktuelle Schleife, in welcher
dieser Befehl steht. Es geht mit dem ersten Befehl nach der Schleife weiter.
while (true) // keine Endebedingung – unendliche Schleife
{
if ( … )
break;
}
continue : Der Befehl continue beendet die Befehle innerhalb der
Schleife und setzt mit der Überprüfung der Wiederholungsbedingung
bzw. Reinitialisierung bei for-Schleifen fort..
for ( int i=0;i<1000;i++)
{
if ( … )
continue;
}
Dr. Norbert Spangler / Programmieren I
25.10.2015
49
4.7 Ein-/Ausgabe
Die Ein- und Ausgabe in C++ erfolgt üblicherweise mittels cin und cout.
Dies sind jedoch keine Befehle sondern Objekte von Stream-Klassen.
Die (Stream-)Klassen werden im Zusammenhand mit der
Objektorientierung im Sommersemester behandelt.
Die aus C stammenden Funktionen printf/scanf werden nicht betrachtet.
Dr. Norbert Spangler / Programmieren I
25.10.2015
50
Ein-/Ausgabe mit cin/cout
Es können ein aber auch mehrere Daten mit einem Aufruf bearbeitet
werden. Formatierungen sind mittel I/O-Manipulatoren möglich.
cin>>x;
cin>>a>>b>>c;
cout<<i;
cout<<"Ergebnis "<<i<<endl;
cout<<setw(10)<<setprecision(5)<<fixed<<d<<endl;//mit Manipulatoren
Dr. Norbert Spangler / Programmieren I
25.10.2015
51
Weitere Ein-/Ausgabebefehle
character c1;// Variable fuer Zeichen
put schreibt ein Zeichen
cout.put(c1);
get liest das nächste Zeichen, welches auch ein Whitespace-Zeichen sein kann!
cin.get(c1);
read/write Lesen und Schreiben von character-arrays (später)
cin.read(c,10) bzw. cout.write(c,10) für jeweils 10 Zeichen
getline Lesen von Zeichen in eine Variable vom Typ String bis zum Auftreten
eines Begrenzungszeichens.
getline(cin,name) Stringvariable name / Begrenzungszeichen newline
getlinie(cin,name,'#') Stringvariable name / Begrenzungszeichen #
Dr. Norbert Spangler / Programmieren I
25.10.2015
52
4.8 Sonstige Befehle
return Ausdruck Beendigung einer Funktion mit dem Wert des Ausdrucks als
Funktionswert-> Kap. Funktionen
return
beendigung einer Funktion vom Typ void
exit(n)
Beendigung des Programms :Fehlercode n (ganze Zahl)
goto marke
Verzweigung zu einer Marke / soll nicht verwendet werden
„schlechter Programmierstil“
Dr. Norbert Spangler / Programmieren I
25.10.2015
53
4.9 Beispiel for
Es sollen n Zahlen eingelesen und ihr Maximum berechnet
werden. Zusätzlich ist die Nummer der eingelesenen Zahl,
welche,das Maximum ist, zu bestimmen. n ist voher einzulesen.
Achtung: bei Maximum/Minimumsuche
als Anfangswert immer das erste Element
wählen
Testplan
Nr. Fall
1
2
3
4
5
6
Dr. Norbert Spangler / Programmieren I
Eingabe
n Zahlen
Keine Zahl
0
Eine Zahl
1 5
Normal/Anfang 3 8 5 1
Normal/Mitte
3 5 8 1
Normal/Ende
3 5 18
Gleiche Zahlen 3 8 1 8
Ergebnis
Nummer Max
Meldung
1
5
1
8
2
8
3
8
1
8
25.10.2015
54
Beispiel for
void main()
Initialisierung : i=2 (Zählvariable auf den Anfangswert setzen)
{
Wiederholungsbedingung: i<=n (Zählvariable abfragen)
int n;
Reinitialisierung: i=i+1 (Zählvariable hochzählen
cout<<"n einlesen ";
cin >>n;
if ( n<=0 )
cout<<" keine Zahlen gelesen "<<endl;
else
{ int zahl, nummer=1;
cin>>zahl;
int maximum=zahl;
for ( int i=2 ; i<=n ; i++ ) // Zaehlvariable in der Schleife deklarieren
{
cin>>zahl;
if ( zahl>maximum )
{
maximum=zahl;
nummer=i;
}
}
cout<<"Maximum "<<maximum<<" = "<<nummer<<". Zahl"<<endl;
}
Dr. Norbert Spangler / Programmieren I
25.10.2015
55
}
4.10 Beispiele/while
In einem Programm sollen
positive ganze Zahlen
eingelesen und deren
Durchschnitt berechnet
werden. Das Programm endet,
wenn eine negative Zahl oder
0 eingegeben wird. Danach
sind Durchschnitt und Anzahl
der gelesenen Zahlen am
Bildschirm auszugeben.
Achtung:
Hier ist die Anzahl der
Wiederholungen zu Beginn der
Schleife nicht bekannt
-> While-Schleife empfohlen
Dr. Norbert Spangler / Programmieren I
25.10.2015
56
Beispiele/while
// Lesen von positiven Zahlen
#include <iostream>
Welche Testfälle sollte man wählen?
using namespace std;
Welche Schwächen hat dieses
void main()
Programm?
{
int anzahl=0,eingabezahl;
float summe=0.0;
// Erste Zahl eingeben
cout << " Bitte positive Zahl eingeben " << endl;
cout << " Abbruch mit 0 " << endl;
cin >> eingabezahl;
//Schleife
while (eingabezahl>0)
{
anzahl=anzahl+1;//zaehler erhoehen
summ=summe+eingabezahl;//summe bestimmen
cout << " Bitte naechste Zahl eingeben/Abbruch mit 0 " << endl;
cin >> eingabezahl;
}
//Ergebnis ausgeben
cout << " Der Durchschnitt ist : "
<< summe/anzahl << endl;
cout << " Es wurden "<<anzahl<<" Zahlen gelesen"<<endl;
}
Dr. Norbert Spangler / Programmieren I
25.10.2015
57
Beispiele/while
Ein guter vorher erstellter Testplan hätte die Schwächen des Programms
aufgedeckt.
Der Fall n=0 sollte noch nach der Schleife abgefangen werden.
Testplan
Nr. Fall
1
2
3
Eingabe
Ergebnis
Zahlen Durchschnitt Anzahl
Keine Zahl 0
?????????
0
Eine Zahl 2.2 0
2.2
1
Normalfall 1 0.3 2 0 1,1
3
Dr. Norbert Spangler / Programmieren I
25.10.2015
58
Beispiele/while
// Lesen von positiven Zahlen
#include <iostream>
using namespace std;
void main()
Durch die
{
int anzahl=0,eingabezahl;
Berücksichtigung des
float summe=0.0;
Testfalls "keine
// Erste Zahl eingeben
cout << " Bitte positive Zahl eingeben " << endl;
Zahlen" ( Testplan ! )
cout << " Abbruch mit 0 " << endl;
ergibt sich ein
cin >> eingabezahl;
//Schleife
geänderter
while (eingabezahl>0)
Programmcode.
{
anzahl=anzahl+1;
summ=summe+eingabezahl;
cout << " Bitte naechste Zahl eingeben/Abbruch mit 0 " << endl;
cin >> eingabezahl;
}
//Ergebnis ausgeben
if ( anzahl==0 )
cout<<" keine Zahlen gelesen"<<endl;
else
{
cout << " Der Durchschnitt ist : "
<< summe/anzahl << endl;
cout << " Es wurden "<<anzahl<<" Zahlen gelesen"<<endl;
}
} Dr. Norbert Spangler / Programmieren I
25.10.2015
59
4.11 Beispiel do while
Der Anwender soll eine Zahl n>0 eingeben.
void main()
{
int n;
do
{
cout<<endl;
cout<<" Zahl > 0 eingeben ";
cin>>n;
} while(n<=0)
// jetzt geht’s weiter
}
Nachteil:
Der Anwender
bekommt keinen
Hinweis, dass seine
letzte Eingabe
fehlerhaft war.
Aber: Do While Schleifen kommen eher selten vor.
Dr. Norbert Spangler / Programmieren I
25.10.2015
60
4.12 Übung Schleife und switch
Es soll in einem Auswahlmenue der Anwender gefragt
werden, welche Aktion er durchführen will bzw. ob er die
Durchführung von Aktionen abbrechen will.
Als Aktionen sollen der Einfachheit die Aktionen
Ausgabe " Aktion A"
…
Ausgabe " Aktion F"
vorgegeben sein.
Erstellen Sie ein entsprechendes Programm.
Tipp: Lesen sie Zeichen (char) ein für die Wahl des
Menuepunktes und keine Zahlen. Sie ersparen sich
Fehleingaben.
Dr. Norbert Spangler / Programmieren I
25.10.2015
61
Übung Schleife und switch
Testplan
Nr.
1
2
3
4
5
6
7
Fall
Wahl A
Wahl B
Wahl C
Wahl D
Wahl E
Wahl F
Ende
Eingabe
A
B
C
D
E
F
X
Ergebnis
Aktion A: Ausgabe A
Aktion B: Ausgabe B
Aktion C: Ausgabe C
Aktion D: Ausgabe D
Aktion E: Ausgabe E
Aktion F: Ausgabe F
Programmende
Struktogramm und Programm zur Übung
Dr. Norbert Spangler / Programmieren I
25.10.2015
62
4.13 Vorgehensweise Struktogramme
Von außen nach innen
TOP DOWN
Einzelne Rechtecke
erst mit Stichwort
zusammenfassend
beschreiben und dann
detaillieren
Dr. Norbert Spangler / Programmieren I
25.10.2015
63
4.14 echte Klausurerlebnisse