Iteration in C
Feldbreiten
Nach einem Prozentzeichen kann auch noch ein ganzzahliges Numerale eingefügt werden, welches eine Ausgabefeldbreite angibt.
Die Ausgaben werden dann rechtsbündig in das links mit Leerzeichen aufgefüllte Feld geschrieben, was die Ausrichtung von Spalten in Tabellen erleichtert.
main.c
#include <stdio.h> int main( void )
{ printf( "%d\n", 1 );
printf( "%d\n", 12 );
printf( "%d\n", 123 ); printf( "%3d\n", 1 );
printf( "%3d\n", 12 );
printf( "%3d\n", 123 ); }stdout
1
12
123 1
12
123main.c
#include <stdio.h> int main( void )
{ printf( "%5s %5s %5s %5s\n", "A", "B", "C", "D" );
printf( "%5d %5d %5d %5d\n", 1, 321, 1, 321 );
printf( "%5d %5d %5d %5d\n", 12, 12, 12, 12 );
printf( "%5d %5d %5d %5d\n", 123, 1, 123, 1 ); }stdout
A B C D
1 321 1 321
12 12 12 12
123 1 123 1
Die Angabe der Anzahl der Nachkommastellen kann auch mit der Angabe einer Feldbreite kombiniert werden.
main.c
#include <stdio.h>
int main( void )
{ printf( "EUR %6.2f\n", 2.38626622 );
printf( "USD %6.2f\n", 412. );
printf( "DEM %6.2f\n", 11.7 ); }stdout
EUR 2.39
USD 412.00
DEM 11.70
Syntax der while-Anweisung (vereinfacht)
while /ʍɑɪl/ „solange[ wie]“
..-..
' ' .''. .----------. .''. .-----------.
--->( while )--->( ( )--->| Ausdruck |--->( ) )--->| Anweisung |--->
. . '..' '----------' '..' '-----------'
''-''
Nach ihrem einleitenden Schlüsselwort while („während“) wird die Anweisung zur bedingten Ausführung auch while-Anweisung genannt.
Semantik der while-Anweisung
Die Anweisung wird ausgeführt, wenn der Ausdruck ungleich 0 ist. Nach jeder Ausführung der Anweisung wird der Ausdruck erneut ausgewertet. Ergibt sich dann wieder ein Wert ungleich 0, wird die Anweisung erneut ausgeführt.
Eine Wiederholung eines Programmteils ohne entsprechende Wiederholung von Anweisungen im Quelltext wird auch ein Schleife genannt. Daher nennt man die while -Anweisung aus while-Schleife. Die if -Anweisung bildet hingegen keine Schleife.
Unter Iteration verstehen wir hier die Implementation von Schleifen durch solche speziellen Schleifenanweisungen.
Schlüsselwörter
»while« ist ein Schlüsselwort.
Beispiel Endlosschleife
Das folgende Programm mit einer Endlosschleife gibt viele Zahlen aus.
main.c
#include <stdio.h>
#include <stdlib.h> int main( void ){ while( -2 )printf( "%d\n", rand() ); }stdout
41
18467
6334- …
Beispiel Zählschleife
Das folgende Programm zählt in Zweierschritten von 10 (einschließlich) bis 14 (einschließlich).
main.c
#include <stdio.h> int main( void )
{ int i = 10; /* Schleifenvorbereitung */
while
(
i - 16 /* Schleifenpruefung */
)
{ printf( "%d\n", i ); /* Nutzlast */ /* Schleifeninhalt */
i = i + 2; /* Schleifenschritt */ /* Schleifeninhalt */
} /* Schleifeninhalt */ }stdout
10
12
14
In diesem Programm erkennen wir für Schleifen typische Bestandteile: Einen Teil zur Vorbereitung der Schleife (die Schleifenvorbereitung ); die Prüfung zur Entscheidung, ob die Schleife erneut durchlaufen werden soll (die Schleifenprüfung ); den zu wiederholenden Schleifeninhalt; die zu wiederholende Nutzlast der Schleife; und den Schleifenschritt, welcher den Übergang zum nächsten Schleifendurchlauf realisiert.
Die Variable »i« spielt für die Schleife eine entscheidende Rolle. Solch eine Variable wird dementsprechend auch Schleifenvariable genannt.
Programmablaufplan zur Zählschleife
|
V
.---------.
| i := 10 |
'---------'
| .------------.
|<------| i := i + 2 |<-------.
| '------------' |
v |
.-'-. .---------- |
.-' '-. Ja / Ausgabe / |
.-' i - 16 ? '-.---->/ i /----'
'-. .-' / /
'-. .-' -----------
'.'
| Nein
|
V
Struktogramm zur Zählschleife
.-------------------------------------.
| i := 10 |
|-------------------------------------|
| Wiederhole solange wie i - 16 |
| .--------------------------------|
| | Ausgabe i |
| |--------------------------------|
| | i := i + 2 |
'-------------------------------------'
Übungsfragen
- Beispiel Korrektur
Ein Student erklärt: „Bei der If-Schleife wird die Anweisung nach »if( x )« nur dann ausgeführt, wenn der Wert »x« positiv ist.”. Korrigieren Sie eventuelle Fehler des Studenten!
Übungsaufgaben
Wiederholte Ausgabe eines Textes
Schreiben Sie ein Programm, in dem die Anweisung »puts( "Dieses ist ein langer Satz." );« nur einmal vorkommt, und zwar in einer Schleife, von der sie insgesamt zehnmal wiederholt wird. Das Programm soll auf diese Weise die Zeile »Dieses ist ein langer Satz.« zehnmal hintereinander ausgeben.
Zählen von 12 bis 27
Schreiben Sie ein Programm, das die Anweisung »printf( "%d\n", i );« enthält und die Zahlen von 12 bis 27 (eine Zahl pro Zeile, aufsteigend in Einerschritten) ausgibt. Das Programm darf neben der genannten Anweisung keine anderen Ausgabeanweisungen enthalten.
Übungsaufgaben (Gruppe 1)
In Zweierschritten von 14 bis 2 abwärts zählen
Schreiben Sie ein Programm, das die Anweisung »printf( "%d\n", i );« enthält und die Zahlen von 14 bis 2 (eine Zahl pro Zeile) absteigend in Zweierschritten ausgibt. Das Programm darf neben der genannten Anweisung keine anderen Ausgabeanweisungen enthalten.
Grundformen
Schreiben Sie eine Funktion, die mit Sternchen eine Linie ausgibt! Dabei darf das Zeichen »*« (Sternchen, asterisk ) selber nur einmal im Quelltext vorkommen. Die Aufgabe soll also wieder mit einer Schleife gelöst werden. Die Anzahl der Sternchen wird der Funktion als Argument übergeben.
linie( 20 )
********************
Zusatzaufgaben
Zählschleife mit Deckel und Formatierung
Schreiben Sie eine möglichst kurze Funktion »loop« mit zwei ganzzahligen Parameter »min« und »top«, welche alle Zahlen von min einschließlich bis top ausschließlich ausgibt. Die Zahlen sollen in aufsteigender Reihenfolge ausgegeben werden. Falls min ≥ top soll gar nichts ausgegeben werden. Ansonsten soll die Liste der ausgegebenen Zahlen mit einem Punkt ».« beendet werden. Falls mehr als eine Zahl ausgegeben wird, so sollen die Zahlen durch eine Zeichenfolge aus ein Komma und ein Leerzeichen », « getrennt werden. Das letzte Komma soll aber durch die fünf Zeichen » und « ersetzt werden. Diese Anforderungen werden durch die folgenden Beispiele veranschaulicht
Die Auswertung von »loop( 4, 3 )« gibt aus: »«.
Die Auswertung von »loop( 4, 4 )« gibt aus: »«.
Die Auswertung von »loop( 4, 5 )« gibt aus: »4.«.
Die Auswertung von »loop( 4, 6 )« gibt aus: »4 und 5.«.
Die Auswertung von »loop( 4, 7 )« gibt aus: »4, 5 und 6.«.
Die Auswertung von »loop( 4, 8 )« gibt aus: »4, 5, 6 und 7.«.
Die Auswertung von »loop( 4, 9 )« gibt aus: »4, 5, 6, 7 und 8.«.
Grundformen
Schreiben Sie eine Funktion, die mit Sternchen ein Rechteck ausgibt! Argumente sind Breite und Höhe.
rechteck( 17, 4 )
*****************
*****************
*****************
*****************
Grundformen
Zusatzaufgabe Schreiben Sie eine sonst der vorangehenden Übungsaufgabe entsprechende Funktion, die mit Sternchen ein Dreieck ausgibt! Diese Funktion soll die Höhe und die Änderung der Breite pro Zeile als Argumente akzeptieren.
dreieck( 6, 1 )
*
**
***
****
*****
******