9-3_For

Werbung
FOR
Anweisung
Aufgabe:
Ausgabe aller ganzen
Zahlen von
0 bis 100
auf dem Bildschirm
int main(){
int i;
i=0;
// wie geht es
// weiter ??
Schleifenzähler verändern
Initialisierung
Bedingung
for (i=0; i<=100; i=i+1){
printf("%d\n",i);
}
printf("Das wars schon");
return 0;
Bedingung falsch
}
Bedingung wahr
Programmverlauf
for (i=0; i<=100; i=i+1){
printf("%d\n",i);
}
printf("Das wars schon");
return 0;
}
Dynamische
Entwicklung
des Inhalts der
Variablen
i
for (i=0; i<=100; i=i+1){
printf("%d\n",i);
}
printf("Das wars schon");
i
0
1
for (i=0; i<=100; i=i+1){
printf("%d\n",i);
}
printf("Das wars schon");
i
0
1
2
.... usw.
bis i den Wert 100 hat
for (i=0; i<=100; i=i+1){
printf("%d\n",i);
}
printf("Das wars schon");
i
0
1
2
... 100 101
for (i=0; i<=100; i=i+1){
printf("%d\n",i);
}
printf("Das wars schon");
i
0
1
2
... 100 101
C-Syntax für
FOR - Anweisung
Den Schleifenzähler verändern
Bedingung
Initialisierung
for (Ausdr1; Ausdr2; Ausdr3){
Anweisung(en);
}
bei einer Anweisung sind
Klammern nicht nötig.
Trotzdem:
Immer Klammern machen.
Blockende
kein Semikolon
for (Ausdr1; Ausdr2; Ausdr3){
Anweisung(en);
}
Diesen Teil innerhalb einer
for-Anweisung nennt man
auch Schleifenrumpf
Warum gibt es nur eine
Ausgabe auf dem
Bildschirm ?
for (i=0; i<=100; i=i+1); {
printf("%d\n",i);
}
Weil der Compiler dieses
Konstrukt als die zwei
folgenden Anweisungen
auffasst:
for (i=0; i<=100; i=i+1);
{
printf("%d\n",i);
}
Nach for (...) muss eine Anweisung kommen !
Diese Anweisung ist die "leere Anweisung" (die nichts macht bzw.
bewirkt), die durch den leeren Ausdruck, der mit einem Semikolon
abgeschlossen wird, zu einer Anweisung wird.
Diese wird solange ausgeführt, solange i<=100 , also 101 mal.
DANACH wird einmal printf("%d\n",i) ausgeführt.
Das heißt
for (i=0; i<=100; i=i+1);
wird vom Compiler wie folgt
interpretiert:
for (i=0; i<=100; i=i+1)
;
Was wird also ausgegeben ?
101
Aufgabe:
Flußdiagramm der
FOR - Anweisung mit
beliebigem A1, A2, A3 und
beliebigen Anweisung(en)
A, also der folgenden
Anweisung …
for (A1; A2; A3){
A;
}
Initialisierung (A1)
Bedingung
(A2)
wahr
A
Schleifenzähler verändern
(A3)
falsch
Oder alternativ:
Initialisierung (A1)
Schleifenzähler verändern
(A3)
A
Bedingung
(A2)
falsch
wahr
Struktogramm:
for(Ausdr1; Ausdr2; Ausdr3)
Anweisung(en)
Die for-Schleife nennt man
auch Zählschleife, weil
durch den Anfangswert und
den Endwert der
Schleifenvariablen die
Anzahl der
Schleifendurchgänge
festgelegt sind.
Wie oft wird der
Schleifenrumpf einer forSchleife durchlaufen.
Nennen Sie die obere bzw.
untere Grenze.
0 ...  Durchgänge, wobei
die Initialisierung (Ausdr1)
aber auf jeden Fall genau 1
Mal gemacht wird.
Zum Schluss:
Eine Besonderheit von
allen 3 Schleifenarten:
break und continue
Für alle drei Arten von
Schleifen, for Schleife,
while Schleife und do-while
Schleife existieren noch zwei
wichtige Anweisungen,
nämlich break und continue.
Die break-Anweisung
veranlaßt, daß die Schleife
sofort verlassen wird.
Bei verschachtelten Schleifen
wird die aktuelle Schleife
sofort verlassen.
Die continue-Anweisung
veranlaßt, daß sofort zum
Anfang der Schleife
(Schleifen-Bedingung)
gesprungen wird.
Im Gegensatz zur breakAnweisung wird die Schleife
nicht verlassen.
Bei einer for-Schleife wird
dagegen mit dem Abarbeiten
des letzten Ausdrucks in der
for-Klammer weitergemacht.
Beispiele
Was gibt das folgende
Programm auf dem Bildschirm
aus?
int main(){
10/3=3.333333
double teiler,erg;
10/2=5.000000
teiler=4;
while(teiler>=-2){
10/1=10.000000
teiler--;
Hallo Welt
if(teiler==0){
break;
Warum wird nicht 10/0=... ausgegeben?
}
erg=10/teiler;
printf("10/%f=%f\n",teiler,erg);
}
printf("Hallo Welt\n");
return 0;
}
Wenn der teiler 0 wird, wird break ausgeführt. Dies veranlaßt das
Verlassen der Schleife und die Ausführung der nächsten Anweisung
Was gibt das folgende
Programm auf dem Bildschirm
aus?
int main(){
10/3=3.333333
double teiler,erg;
10/2=5.000000
teiler=4;
10/1=10.000000
while(teiler>=-2){
10/-1=-10.000000
teiler--;
10/-2=-5.000000
if(teiler==0){
10/-3=-3.333333
continue;
}
Hallo Welt
erg=10/teiler;
printf("10/%f=%f\n",teiler,erg);
}
Warum wird bei teiler=0 nicht die Schleife verlassen?
printf("Hallo Welt\n");
return 0;
}
Wenn der teiler 0 wird, wird wieder an den Anfang der Schleife
gesprungen.
Was gibt das folgende
Programm auf dem Bildschirm
aus?
10/3=3.333333
10/2=5.000000
10/1=10.000000
int main(){
double teiler, erg;
}
10/-1=-10.000000
10/-2=-5.000000
Hallo Welt
for(teiler=3;teiler>=-2;teiler--){
if(teiler==0){
continue;
}
Warum wird bei teiler=0 nicht die Schleife verlassen?
erg=10/teiler;
printf("10/%f=%f\n",teiler,erg);
} Aus Platzmangel wurden die Ausgaben nicht untereinander
printf("Hallo Welt\n");
geschrieben
return
0; 0 wird, wird sofort an den letzten Ausdruck der
Wenn der teiler
for-Klammer gesprungen.
Herunterladen