for-Schleife
Die for-Schleife wird hauptsächlich eingesetzt, wenn vor dem Eintritt in die Schleife bekannt ist, wie oft Anweisungen wiederholt auszuführen sind.
Syntax
Die for-Schleife hat folgende Syntax:
for (AUSRUCK1; AUSDRUCK2; AUSDRUCK3)
ANWEISUNG;
Die drei Ausdrücke in der Klammer werden jeweils durch ein Semikolon getrennt und das die Schleife abschließende Semikolon folgt erst nach der auszuführenden Anweisung.
Schleifenaufbau
Initialisierungsausdruck
Der erste Ausdruck AUSDRUCK1 ist der Initialisierungsausdruck. Er wird nur einmal ausgeführt, und zwar bevor die Anweisung in der Schleife das erste Mal ausgeführt wird. Im Regelfall initialisiert er einen Schleifenzähler, d.h., er legt den Startwert fest, mit dem die Schleife begonnen wird.
for (auto index=0; ... ; ...)
ANWEISUNG;
Eine (wie im Beispiel) im Initialisierungsausdruck definierte Variable ist nur in der Schleife gültig. Es können auch mehrere Variablen im Initialisierungsausdruck definiert werden, die aber alle den selben Datentyp haben müssen.
Der Initialisierungsausdruck kann aus mehreren Anweisungen bestehen. Die Anweisungen werden dann durch Kommas getrennt aufgelistet. Selbstverständlich muss die Variable count vorher definiert worden sein.
short count;
...
for (count=0, auto index=0; ... ; ...)
ANWEISUNG;
Abbruchbedingung
Der nächste Ausdruck AUSDRUCK2 legt die Abbruchbedingung der Schleife fest. Die Schleife wird so lange durchlaufen, wie die Auswertung des Ausdrucks true ergibt.
for (auto index=0; index<10 ; ...)
ANWEISUNG;
Auch die Abbruchbedingung kann aus mehreren Bedingungen bestehen, die durch logische Operatoren verknüpft werden. Im nachfolgenden Beispiel wird die for-Schleife so lange durchlaufen, solange index kleiner 10 und done gleich true ist.
bool done = true;
for (int index=1; (index<10) && (done); ...)
ANWEISUNG;
Setzen Sie die einzelnen Bedingungen immer in Klammern. Dies ist zwar keine Vorschrift, vermeidet aber unliebsame Überraschungen in Bezug auf die Rangfolge der Operationen.
Schleifenaktion
Der letzte Ausdruck AUSDRUCK3 in der Schleifenklammer legt die Aktion fest, die nach dem Ausführen der Schleifenanweisung (siehe nächsten Punkt) und vor dem Auswerten der Abbruchbedingung ausgeführt wird.
for (auto index=0; index<10; index++)
ANWEISUNG;
In der Regel wird hier die im ersten Ausdruck initialisierte Schleifenvariable verändert. Auch dieser Ausdruck kann aus mehreren Anweisungen bestehen, die wieder durch Kommas getrennt aufgelistet werden. Der Lesbarkeit wegen sollte nur die Schleifenvariable verändert werden und alles andere in der, im Anschluss beschriebenen, Schleifenanweisung durchgeführt werden.
Jeder der 3 Ausdrücke, Schleifeninitialisierung, Abbruchbedingung und Schleifenaktion, ist optional, jedoch sind die beiden Semikolon innerhalb der Klammer immer anzugeben. Eine for-Schleife ohne Abbruchbedingung und 'Notausgang' erzeugt eine Endlos-Schleife.
// Endlos-Schleife
for (index=0; ; index++)
ANWEISUNG;
Schleifenanweisung
Die Schleifenanweisung besteht standardmäßig aus einer Anweisung. Mehrere Anweisungen sind in einen Block {...} einzuschließen. Auch die Angabe einer Schleifenanweisung ist optional. Aus diesem Grund liefert die letzte for-Schleife im Beispiel beim Übersetzen keinen Fehler.
#include <print>
int main()
{
// Schleife mit einer Schleifenanweisung
for (auto index=0; index<3; index++)
std::println("Schleifenzaehler: {}",index);
// Schleife mit mehreren Schleifenanweisungen
for (auto index=0; index<3; index++)
{
std::print("{}",index);
std::println(". Schleife");
}
// Aber Achtung! Leerschleife
for (auto index=0; index<3; index++);
std::println("Schleife");
}
Schleifenzaehler: 0
Schleifenzaehler: 1
Schleifenzaehler: 2
0. Schleife
1. Schleife
2. Schleife
Schleife
Es gibt eine zweite Form der for-Schleife, die range-for-Schleife. Ihr Einsatzgebiet ist das Durchlaufen von Felder bzw. Container. Aus diesem Grund erfolgt die Beschreibung der range-for-Schleife erst später an entsprechender Stelle.
Übungen
for_01
Erstellen Sie ein Programm, das die Weite und Höhe eines schrägen Wurfs nach folgender Formel berechnet:
Weite = (Abwurfgeschwindigkeit2 *
sin(2*Abwurfwinkel)) / G
Höhe = (Abwurfgeschwindigkeit2 *
sin(Abwurfwinkel)2) / (2*G)
Die Bibliotheksfunktion sin() zur Berechnung des Sinus hat folgende Funktionsdeklaration in cmath
double erg = sin (double rad);
sin() erwartet den Winkel als Radiant (2*PI = 360 Grad) und nicht in Grad! Die Abwurfgeschwindigkeit ist in m/s einzusetzen und für die Gravitationskonstante G 9.81m/s2. Beide Formeln liefern ihr Ergebnis in m zurück.
Berechnen Sie die Wurfhöhe und Wurfweite für Abwurfwinkel zwischen 10 und 85 Grad und einer Abwurfgeschwindigkeit von 10 m/s. Der Abwurfwinkel ist dabei in 5er-Schritten zu inkrementieren.
Achten Sie bei der Ausgabe auf eine saubere Formatierung!
Winkel: 10 Grad -> Weite: 3.49m, Hoehe: 0.15m
Winkel: 15 Grad -> Weite: 5.10m, Hoehe: 0.34m
Winkel: 20 Grad -> Weite: 6.55m, Hoehe: 0.60m
Winkel: 25 Grad -> Weite: 7.81m, Hoehe: 0.91m
Winkel: 30 Grad -> Weite: 8.83m, Hoehe: 1.27m
Winkel: 35 Grad -> Weite: 9.58m, Hoehe: 1.68m
Winkel: 40 Grad -> Weite: 10.04m, Hoehe: 2.11m
Winkel: 45 Grad -> Weite: 10.19m, Hoehe: 2.55m
Winkel: 50 Grad -> Weite: 10.04m, Hoehe: 2.99m
Winkel: 55 Grad -> Weite: 9.58m, Hoehe: 3.42m
Winkel: 60 Grad -> Weite: 8.83m, Hoehe: 3.82m
Winkel: 65 Grad -> Weite: 7.81m, Hoehe: 4.19m
Winkel: 70 Grad -> Weite: 6.55m, Hoehe: 4.50m
Winkel: 75 Grad -> Weite: 5.10m, Hoehe: 4.76m
Winkel: 80 Grad -> Weite: 3.49m, Hoehe: 4.94m
Winkel: 85 Grad -> Weite: 1.77m, Hoehe: 5.06m
for_02
Es ist eine Tabelle der ASCII-Zeichen mit den dezimalen Codes von 32 bis 127 wie unten dargestellt auszugeben. Zuerst ist der jeweilige ASCII-Code 3-stellig auszugeben und danach das dazugehörige ASCII-Zeichen. Die Tabelle soll 5 Spalten besitzen.
32 33 ! 34 " 35 # 36 $
37 % 38 & 39 ' 40 ( 41 )
42 * 43 + 44 , 45 - 46 .
47 / 48 0 49 1 50 2 51 3
52 4 53 5 54 6 55 7 56 8
57 9 58 : 59 ; 60 < 61 =
62 > 63 ? 64 @ 65 A 66 B
67 C 68 D 69 E 70 F 71 G
72 H 73 I 74 J 75 K 76 L
77 M 78 N 79 O 80 P 81 Q
82 R 83 S 84 T 85 U 86 V
87 W 88 X 89 Y 90 Z 91 [
92 \ 93 ] 94 ^ 95 _ 96 `
97 a 98 b 99 c 100 d 101 e
102 f 103 g 104 h 105 i 106 j
107 k 108 l 109 m 110 n 111 o
112 p 113 q 114 r 115 s 116 t
117 u 118 v 119 w 120 x 121 y
122 z 123 { 124 | 125 } 126 ~
127