📖 for
- Schleife
Neben while
und do..while
existiert noch eine dritte Schleifenart, die
for
-Schleife.
Die for
-Schleife ist eine Erweiterung der while
Schleife, sodass zwischen
den runden Klammern ()
nicht nur eine <Bedingung>
definiert wird, sonder
auch eine <Zählervariable>
sowie eine <Schrittweite>
.
- 💡 Die drei Teile werden mit einem
;
Semikolon getrennt. - 💡 Für die
for
-Schleife existiertkeineVariante.do..for
Grundform
Die for Kontrollstruktur ist zuerst einmal gewöhnungsbedürftig. Das Muster sieht so aus:
for - Muster
for (
<Zählervariable>;
<Bedingung>;
<Schrittweite>
) {
<Anweisungen, Sequenz>
}
Die 3 Teile in den Runden Klammern ()
sind mit einem Semikolon ;
getrennt!
(und stehen meist auf einer Linie nebeneinander)
for - Ablaufdiagram
<Zählervariable>
Ganz am Anfang wird die <Zählervariable>
initialisiert und ist im
Code-Block sichtbar.
💡 Häufig dient die <Zählervariable>
als Indexnummer und heisst dadurch
i
.
<Bedingung>
Vor jeder Sequenz wird die Bedingung auf Wahrheit geprüft (true
), ob die
die <Anweisungen, Sequenz>
ausgeführt werden sollen oder ob die Schlaufe
beendet wird.
💡 Meistens betrifft die <Bedingung>
die <Zählervariable>
.
<Schrittweite>
Am Schluss einer Sequenz, vor der <Bedingung>
, wird die <Zählervariable>
hoch oder runter gezählt.
💡 i++
Zählt z.B. die Variable i
mit der Schrittweite 1 hoch.
<Anweisungen, Sequenz>
Die <Anweisungen>
im Code-Block werden Ausgeführt, solange die <Bedingung>
wahr (true
) ist.
Grundform am Beispiel
Damit es weniger abstrakt ist, hier ein Beispiel als for
sowie while
Schleife, welches die Zahlen 0 bis 4 ausgibt. Dies soll veranschaulichen, wieso
die for
-Schleife zusätzlich zur while
-Schlaufe in fast jeder
programmiersprache existiert.
for
public class FixeWiederholung {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
}
}
Es wird als Erstes die Variable int i = 0;
initialisiert. Sobald die
Anweisungen innerhalb des Code-Blocks abgearbeitet sind
(System.out.pringln(i);
), springt die Programmausführung bei der schliessenden
geschweiften Klammer wieder zurück zum for, verändert die Variable um die
Schrittweite (i++
) und prüft, ob die Bedingung (i < 5
) noch erfüllt ist.
Wenn ja, wird die Schleife erneut ausgeführt.
while
public class FixeWiederholungWhile {
public static void main(String[] args) {
int i = 0;
while (i < 5) {
System.out.println(i);
i++;
}
}
}
Die while
Variante verhält sie gleich wie die for
Variante. Sie brauch
jedoch mehr Zeilen.
for
hier bevorzugt?int i = 0;
ist ausserhalb der Schlaufe initialisiert!
Dadurch ist diese also in der ganzen äusseren Methode sichtbar und nicht nur im Code-Block der Schlaufe und existiert auch nach dem Beenden der Schlaufe weiter.
<Zählervariable>
int i = 0
: Eine Variable i
mit Datentyp int
wird mit 0
initialisiert
<Bedingung>
i < 5
: Solange i
kleiner als 5 ist, wird die for-Schleife weiterhin
ausgeführt
<Schrittweite>
i++
: Die Variable i
wird bei jedem Durchlauf um 1 erhöht
<Anweisungen, Sequenz>
Mir der Anweisung System.out.println(i);
wird bei jeder Sequenz/Iteration bei
der die <Bedingung>
wahr ist, die Variable i
auf die Konsole ausgegeben.
Programmablauf
Eine for-Schleife wird so durchlaufen, wie folgend dargestellt. Wenn die Bedingung nicht mehr erfüllt ist, wird die Schleife beendet und es wird die erste Anweisung unterhalb der Schleife ausgeführt (roter Pfeil).
- Die Bearbeitung der for-Schleife beginnt beim roten Pfeil. Es wird im ersten
Teil die
<Zählervariable>
i
mit 0 initialisiert. - Im zwieten Teil, der
<Bedingung>
, wird geprüft ob die Zählervariablei
kleiner als 5 ist. - Da dies der Fall ist, wird nun die
<Anweisungen>
(System.out.println(i);
) im Code-Block{}
ausgeführt. - Danach wird "nach oben" zum letzten Teil, der
<Schrittweite>
gesprungen. Hier wird durchi++
die<Zählervariable>
i
um 1 hochgezählt. - Nun wird wieder zur
<Bedingung>
gesprungen. - Wenn die Variable
i
immer noch kleiner als 5 ist, wird die<Anweisung>
wiederholt ausgeführt.
Die Punkte 3-6 (grün), werden solange wiederholt, bis die <Bedingung>
falsch
(false
) und somit die Variable i
mindestens 5 ist. Im oberen Beispiel wird
das nach der 5. Wiederholung der Fall sein.
0
1
2
3
4
🖊 Aufgaben
Auftrag 1
- Geben Sie die Zahlen von 1 bis 10 aus.
- Geben Sie die Zahlen von 37 bis 55 aus.
- Geben Sie jede zweite Zahl von 18 bis 96 aus.
- Fragen Sie den Benutzer nach Startwert, Endwert und Schrittweite und geben Sie die entsprechenden Zahlen aus.
Musterlösung
public class A1aFor1to10 {
public static void main(String[] args) {
for(int i = 1; i <= 10; i++) {
System.out.println(i);
}
}
}
public class A1bFor37to55 {
public static void main(String[] args) {
for(int i = 37; i <= 55; i++) {
System.out.println(i);
}
}
}
public class A1cFor18to96 {
public static void main(String[] args) {
for(int i = 18; i <= 96; i = i + 2) { // es würde auch gehen i += 2;
System.out.println(i);
}
}
}
import mytools.StdInput;
public class A1dFor {
public static void main(String[] args) {
System.out.print("Startwert: ");
int start = StdInput.readInt();
System.out.print("Endwert: ");
int ende = StdInput.readInt();
System.out.print("Schrittweite: ");
int sw = StdInput.readInt();
for(int i = start; i <= ende; i = i + sw) { // es würde auch gehen i += sw;
System.out.println(i);
}
}
}
Auftrag 2a
- Schreiben Sie ein Programm, das eine Zeile mit 10 Sternen ausgibt.
- Die Sterne sollen einzeln in einer for-Schleife ausgegeben werden (also bei jedem Durchlauf der Schleife wird ein Stern der Zeile hinzugefügt).
- Verwenden Sie dazu die Methode
System.out.print
(und nicht System.out.println). Die Ausgabe sieht also so aus:
**********
Musterlösung
public class A2aSterne {
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
System.out.print("*");
}
}
}
public class A2bSterne {
public static void main(String[] args) {
for (int j = 0; j < 5; j++) {
for (int i = 0; i < 10; i++) {
System.out.print("*");
}
System.out.println();
}
}
}
Auftrag 2b
Erweitern Sie das obige Programm so, dass 5 Zeilen mit jeweils 10 Sternen ausgegeben werden. Die 5 Zeilen müssen auch in einer for-Schleife erstellt werden. Die Ausgabe sollte also so aussehen :
**********
**********
**********
**********
**********
Musterlösung
public class A2bSterne {
public static void main(String[] args) {
for (int j = 0; j < 5; j++) {
for (int i = 0; i < 10; i++) {
System.out.print("*");
}
System.out.println();
}
}
}
Auftrag 3
Schreiben Sie ein Programm Flaggen, das folgende Anforderungen erfüllt:
- die Anzahl Zeilen für die Flaggen werden vom Benutzer angegeben
- Zeile 1 enthält 1 Stern, Zeile n enthält n Sterne Die Ausgabe soll so aussehen:
Anzahl Zeilen: 5
*
**
***
****
*****
Musterlösung
import mytools.StdInput;
public class A3aFlaggen {
public static void main(String[] args) {
System.out.println("Flaggen 1");
System.out.print("Anzahl Zeilen: ");
int lines = StdInput.readInt();
for(int currentLine = 0; currentLine < lines; currentLine++) {
for(int currentPos = 0; currentPos <= currentLine; currentPos++) {
System.out.print('*');
}
System.out.println();
}
}
}
import mytools.StdInput;
public class A3bFlaggenMethode {
public static void main(String[] args) {
System.out.println("Flaggen 1");
System.out.print("Anzahl Zeilen: ");
int lines = StdInput.readInt();
flag(lines);
}
public static void flag(int nr_of_lines) {
for (int currentLine = 0; currentLine < nr_of_lines; currentLine++) {
for (int currentPos = 0; currentPos <= currentLine; currentPos++) {
System.out.print("*");
}
System.out.println();
}
}
}
Auftrag 4
Erweitern Sie das Programm so, dass der Benutzer das Zeichen, mit dem die Flagge gezeichnet wird, selbst festlegen kann.
Die Ausgabe soll so aussehen:
Anzahl Zeilen: 5
Zeichen: x
x
xx
xxx
xxxx
xxxxx
Musterlösung
import mytools.StdInput;
public class A4aFlaggen {
public static void main(String[] args) {
System.out.print("Anzahl Zeilen: ");
int lines = StdInput.readInt();
System.out.print("Zeichen: ");
String zeichen = StdInput.readString();
for (int currentLine = 0; currentLine < lines; currentLine++) {
for (int currentPos = 0; currentPos <= currentLine; currentPos++) {
System.out.print(zeichen);
}
System.out.println();
}
}
}
import mytools.StdInput;
public class A4bFlaggenMethode {
public static void main(String[] args) {
System.out.print("Anzahl Zeilen: ");
int lines = StdInput.readInt();
System.out.print("Zeichen: ");
String zeichen = StdInput.readString();
flag(lines, zeichen);
}
public static void flag(int nr_of_lines, String character) {
for (int currentLine = 0; currentLine < nr_of_lines; currentLine++) {
for (int currentPos = 0; currentPos <= currentLine; currentPos++) {
System.out.print(character);
}
System.out.println();
}
}
}
Auftrag 5
Erweitern Sie das Programm so, dass der Benutzer eingeben kann, wie viele Flaggen gezeichnet werden.
Die Ausgabe soll so aussehen:
Anzahl Zeilen: 5
Anzahl Flaggen: 2
Zeichen: @
Flagge 1
@
@@
@@@
@@@@
@@@@@
Flagge 2
@
@@
@@@
@@@@
@@@@@
Musterlösung
import mytools.StdInput;
public class A5aFlaggen {
public static void main(String[] args) {
System.out.print("Anzahl Zeilen: ");
int lines = StdInput.readInt();
System.out.print("Anzahl Flaggen: ");
int flags = StdInput.readInt();
System.out.print("Zeichen: ");
String zeichen = StdInput.readString();
for (int currentFlag = 0; currentFlag < flags; currentFlag++) {
System.out.println();
System.out.println("Flagge " + (currentFlag + 1));
for (int currentLine = 0; currentLine < lines; currentLine++) {
for (int currentPos = 0; currentPos <= currentLine; currentPos++) {
System.out.print(zeichen);
}
System.out.println();
}
}
}
}
import mytools.StdInput;
public class A5bFlaggenMethode {
public static void main(String[] args) {
System.out.print("Anzahl Zeilen: ");
int lines = StdInput.readInt();
System.out.print("Anzahl Flaggen: ");
int flags = StdInput.readInt();
System.out.print("Zeichen: ");
String zeichen = StdInput.readString();
for (int currentFlag = 0; currentFlag < flags; currentFlag++) {
flag(currentFlag + 1, lines, zeichen);
}
// eine andere Variante fuer das Zaehlen der Flaggen ist:
for (int currentFlag = 1; currentFlag <= flags; currentFlag++) {
flag(currentFlag, lines, zeichen);
}
}
public static void flag(int flagNumber, int nr_of_lines, String character) {
System.out.println();
System.out.println("Flagge " + flagNumber);
for (int currentLine = 0; currentLine < nr_of_lines; currentLine++) {
for (int currentPos = 0; currentPos <= currentLine; currentPos++) {
System.out.print(character);
}
System.out.println();
}
}
}