9-1_While

Werbung
WHILE Anweisung
Aufgabe:
Ausgabe aller ganzen
Zahlen von
0 bis 100
auf dem Bildschirm
Schreibaufwendige
Lösung:
int main(){
printf("0 \n");
printf("1 \n");
printf("2 \n");
// usw.
//...
printf("100 \n");
return 0;
}
Elegantere
Lösung:
int main(){
int i;
i=0;
// wie geht es
// weiter ??
Bedingung
while (i<=100){
printf("%d\n",i);
Bedingung wahr
i=i+1;
}
printf("Das war es");
return 0;
Die while–Anweisung ist EINE
}
(komplexe) Anweisung, in der
Anweisungen vorkommen.
Bedingung falsch
Programmverlauf
i = 0;
while (i<=100){
printf("%d\n",i);
i=i+1;
}
printf("Das war es");
return 0;
}
Dynamische
Entwicklung
des Inhalts der
Variablen
i
i = 0;
while (i<=100){
printf("%d\n",i);
i=i+1;
}
printf("Das war es");
i
0
1
i = 0;
while (i<=100){
printf("%d\n",i);
i=i+1;
}
printf("Das war es");
i
0
1
2
.... usw.
bis i den Wert 100 hat
i = 0;
while (i<=100){
printf("%d\n",i);
i=i+1;
}
printf("Das war es");
i
0
1
2
... 100 101
i = 0;
while (i<=100){
printf("%d\n",i);
i=i+1;
}
printf("Das war es");
i
0
1
2
... 100 101
C-Syntax für
WHILE - Anweisung
bei einer Anweisung sind
Klammern nicht nötig.
Trotzdem:
Immer Klammern machen.
while (Ausdruck){
Anweisung(en);
}
Diesen Teil innerhalb einer
while-Anweisung nennt man
auch Schleifenrumpf
Blockende
kein Semikolon
Warum Endlosschleife
?
i=0;
while (i<=3); {
i = i+1;
}
Warum Endlosschleife
?
i=0;
while (i<=3); {
i = i+1;
}
man braucht keine
öffnende { Klammer, da
es nur 1 Anweisung gibt
Nach der Bedingung (i<=3) 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<=3 (in diesem Fall: 0 <=3)
ist, also immer.
Warum Endlosschleife
?
i=0;
while (i<=3); {
i = i+1;
}
Diese Schleife ist also eine
Endlosschleife.
Das heißt
while (i<=3);
wird vom Compiler wie folgt
interpretiert:
while (i<=3)
;
Aufgabe:
Flußdiagramm der
WHILE – Anweisung mit
einer beliebigen Bedingung
B und beliebigen
Anweisung(en) A, also der
folgenden Anweisung …
while (B) {
A;
}
falsch
B
wahr
A
WHILE - Anweisung
als Struktogramm
Bedingung
Anweisung(en)
AUFGABE:
Stellen Sie den Programmteil unten als
Struktogramm dar
i = 0;
while (i<=100){
printf("%d\n",i);
i=i+1;
}
printf("Das war es");
i = 0
while(i<=100)
Ausgabe(i)
i = i+1
Ausgabe("Das war es")
Die WHILE - Anweisung
nennt man auch
kopfgesteuerte bzw.
abweisende Schleife, weil
die Bedingung am Kopf der
Schleife steht, bzw. die
Schleife nicht durchlaufen
werden muss (Durchgang
wird abgewiesen)
Wie oft wird der
Schleifenrumpf einer
kopfgesteuerten Schleife
durchlaufen.
Nennen Sie die obere bzw.
untere Grenze.
0 ...  Durchgänge
Zum Schluss ein kleiner
Ausflug.
Manchmal braucht man
Zufallszahlen, um z.B. die
Gewinnchancen beim Lotto
zu simulieren. Dies ist für
Leute von Vorteil, die keine
größeren Kenntnisse in
Wahrscheinlichkeitstheorie
haben.
Dafür stellt die
Entwicklungsumgebung die
Funktionen srand(...) und
rand() zur Verfügung.
srand(...) bewirkt, dass bei
jedem Programmstart ein
anderer Satz von
Zufallszahlen gewählt wird.
Würde dies nicht gemacht,
würde jeder Programmlauf
mit dem gleichen Satz von
Zufallszahlen arbeiten.
srand(...) soll als erste
Anweisung im Programm
genau einmal verwendet
werden.
rand() liefert eine
Zufallszahl zwischen 0 und
einer (großen) maximalen
Zahl (siehe Hilfe)
#include
#include
#include
#include
"stdafx.h"
<stdlib.h>
<stdio.h>
<time.h>
int main(){
int i = 0;
int zufallszahl;
}
genau ein Mal am
Programmanfang
verwenden
erzeugt eine Zufallszahl
srand((unsigned)time(NULL));
while(i<100){
i=i+1;
zufallszahl=rand();
printf("%d\n",zufallszahl);
}
return 0;
Ist die folgende Schleife
eine Endlosschleife?
#include "stdafx.h"
#include <stdio.h>
Beachten Sie dazu, dass i
eine integer-Variable ist und
4 Byte Speicher benötigt.
Der Zahlenbereich geht von:
-2147483648
bis
2147483647
int main(){
int i;
i = 0;
while (i>=0){
i=i+1;
}
printf("i=%d ", i);
return 0;
}
#include "stdafx.h"
#include <stdio.h>
-2147483648 ... 2147483647
i wird also bis 2147483647
hochgezählt, das ist als Dualzahl:
int main(){
01111111 11111111 11111111 11111111
int i;
dies um 1 hochgezählt ergibt:
i = 0;
while (i>=0){
10000000 00000000 00000000 00000000
i=i+1;
Das ist als Dezimalzahl:
}
printf("i=%d ", i);
return 0; -2147483648 (die kleinste negative Zahl)
}
also keine
Endlosschleife !!
-2147483648
was wird also auf dem
Bildschirm ausgegeben?
Herunterladen