Zählschleifen: Verschachtelung
Eine interessante Anwendung von Zählschleifen ist ihre Verschachtelung. Betrachte die folgende Aufgabenstellung.
Der Hamster will eine Treppe aus Körnern bauen, zehn Stufen lang. Die erste Stufe soll ein Korn hoch sein, die zweite zwei Körner usw. Zu Beginn hat der Hamster ausreichend Körner im Maul.


Betrachte nun das folgende dazugehörige Programm.
void main()
{
// Arbeite zehn Kacheln ab
for (int i = 1; i <= 10; i++)
{
// Lege `i` Koerner durch Zaehlen von 1 bis `i`.
for (int j = 1; j <= i; j++)
{
gib();
}
// Nun zur naechsten Kachel
vor();
}
}
In der inneren for-Schleife (Z. 7 bis 10) wird eine Zählvariable j von 1 bis i gezählt. Das bedeutet also: Im...
i=1ten Durchlauf: Von 1 bis 1 (ergibt 1 Korn)i=2ten Durchlauf: Von 1 bis 2 (ergibt 2 Körner)i=3ten Durchlauf: Von 1 bis 3 (ergibt 3 Körner)- ...
i=10ten Durchlauf: Von 1 bis 10 (ergibt 10 Körner)
Die Treppe soll so geändert werden, dass die Stufen immer pro Kacheln um zwei Körner höher werden.


Ändere dazu die äußere Zählschleife wie folgt ab: Es soll von 2 bis 20 gezählt werden, wobei in jedem Schritt mit i = i+2 die Stufenhöhe um zwei erhöht werden soll. Es ergeben sich also wieder zehn Stufen.
void main()
{
// Arbeite zehn Kacheln ab
for (int i = 2; i <= 20; i=i+2)
{
// Lege `i` Koerner durch Zaehlen von 1 bis `i`.
for (int j = 1; j <= i; j++)
{
gib();
}
// Nun zur naechsten Kachel
vor();
}
}
Die Treppe soll so geändert werden, dass die Stufen absteigend verlaufen.


Ändere dazu die äußere Zählschleife wie folgt ab: Es soll von 10 bis 1 gezählt werden, wobei in jedem Schritt mit i-- die Stufenhöhe um eins verringert werden soll. Beachte, dass bei der Schleifenbedingung nun geprüft wreden muss, ob die Zählvariable i nun $\ge$ 1 ist.
void main()
{
// Arbeite zehn Kacheln ab
for (int i = 10; i >= 1; i--)
{
// Lege `i` Koerner durch Zaehlen von 1 bis `i`.
for (int j = 1; j <= i; j++)
{
gib();
}
// Nun zur naechsten Kachel
vor();
}
}
Der Hamster soll zunächst einen ausreichenden Vorrat an Körnern erhalten, mindestens 100 Stück. Anschließend soll er ein Quadrat mit Seitenlänge 10 legen. Verwende verschachtelte for-Schleifen, um alle Zeilen und Spalten zu durchlaufen.


Beginne mit folgendem Grundgerüst.
void main()
{
for (int zeile = 0; zeile < 9; zeile++)
{
// Hier wird jede Zeile bis auf die letzte einmal durchlaufen, von...
// - oben (`zeile` = 0) bis
// - unten (`zeile` = 8).
// In jeder Zeile sollen nun folgende Programmteile abgearbeitet werden:
// 1) Laufe 9 Schritte gen Osten und lege jedes Mal ein Korn.
legeZeile();
// 2) Drehe dich um.
// TODO
// 3) Laufe 9 Schritte zurueck gen Westen.
// TODO
// 4) Gehe eine Zeile nach Sueden und drehe dich nach Osten.
// TODO
}
// Lege die letzte Zeile.
// TODO
}
// Laufe eine Zeile von links nach rechts ab und platziere
// auf jedem Feld (also in jeder Spalte) ein Korn.
void legeZeile()
{
gib();
for (int spalte = 0; spalte < 9; spalte++)
{
vor();
gib();
}
}
Ersetze die vier oben mit TODO markierten Lücken durch geeignete Programmzeilen.
- Das erste
TODO(Umdrehen) ist einfach. - Beim zweiten
TODOüberlege dir, wie du einefor-Schleife verwenden kannst, um exakt neun Schritte zu laufen. - Das dritte
TODO(Zeile wechseln) ist einfach. - Das vierte
TODO(letzte Zeile legen) ist ebenfalls einfach!
void main()
{
for (int zeile = 0; zeile < 9; zeile++)
{
// Hier wird jede Zeile bis auf die letzte einmal durchlaufen, von...
// - oben (`zeile` = 0) bis
// - unten (`zeile` = 8).
// In jeder Zeile sollen nun folgende Programmteile abgearbeitet werden:
// 1) Laufe 9 Schritte gen Osten und lege jedes Mal ein Korn.
legeZeile();
// 2) Drehe dich um.
linksUm();
linksUm();
// 3) Laufe 9 Schritte gen Westen.
for (int spalte = 9; spalte > 0; spalte--)
{
vor();
}
// 4) Gehe eine Zeile nach Sueden und drehe dich nach Osten.
linksUm();
vor();
linksUm();
}
// Lege die letzte Zeile.
legeZeile();
}
// Laufe eine Zeile von links nach rechts ab und platziere
// auf jedem Feld (also in jeder Spalte) ein Korn.
void legeZeile()
{
gib();
for (int spalte = 0; spalte < 9; spalte++)
{
vor();
gib();
}
} Der Hamster soll zunächst einen ausreichenden Vorrat an Körnern erhalten. Anschließend soll er ein Dreieck wie in der Abbildung dargestellt legen.


Beginne mit folgendem Grundgerüst.
void main()
{
for (int zeile = 9; zeile > 0; zeile--)
{
// Hier wird jede Zeile bis auf die erste einmal durchlaufen, von...
// - unten (`zeile` = 9) bis
// - oben (`zeile` = 1).
// Die erste Zeile (`zeile` = 0) muss am Ende extra behandelt werden.
// In jeder Zeile sollen nun folgende Programmteile abgearbeitet werden:
// 1) Laufe `zeile` Schritte gen Osten, lege dabei jedes Mal ein Korn.
for (int i = 0; i < zeile; i++)
{
gib();
vor();
}
gib();
// 2) Drehe dich um.
// TODO
// 3) Laufe `zeile - 1` Schritte gen Westen.
// TODO
// 4) Gehe ein Feld nach Norden und drehe dich nach Osten.
// TODO
}
// Nun noch das letzte Korn legen.
// TODO
}
void rechtsUm()
{
linksUm();
linksUm();
linksUm();
}
Ersetze die vier oben mit TODO markierten Lücken durch geeignete Programmzeilen.
- Das erste
TODO(Umdrehen) ist einfach. - Beim zweiten
TODOüberlege dir, wie du einefor-Schleife verwenden kannst, um die Anzahl an Schritten auszuführen. - Das dritte
TODO(Zeile wechseln) ist einfach. - Das vierte
TODO(letzte Zeile legen) ist ebenfalls einfach!
void main()
{
for (int zeile = 9; zeile > 0; zeile--)
{
// Hier wird jede Zeile bis auf die letzte einmal durchlaufen, von...
// - unten (`zeile` = 9) bis
// - oben (`zeile` = 1).
// Die letzte Zeile (`zeile` = 0) muss zum Schluss extra behandelt werden.
// In jeder Zeile sollen nun folgende Programmteile abgearbeitet werden:
// 1) Laufe `zeile` Schritte gen Osten, lege dabei jedes Mal ein Korn.
for (int i = 0; i < zeile; i++)
{
gib();
vor();
}
gib();
// 2) Drehe dich um.
linksUm();
linksUm();
// 3) Laufe `zeile - 1` Schritte gen Westen.
for (int i = 0; i < zeile - 1; i++)
{
vor();
}
// 4) Gehe ein Feld nach Norden und drehe dich nach Osten.
rechtsUm();
vor();
rechtsUm();
}
// Nun noch das letzte Korn legen.
gib();
}
void rechtsUm()
{
linksUm();
linksUm();
linksUm();
} Ändere die vorangehenden Aufgaben wie folgt ab: Der Benutzer / die Benutzerin soll zunächst gefragt werden nach der Seitenlänge des Quadrats bzw. des Dreiecks. Stelle sicher, dass der Hamster genug Startkörner im Maul hat.
Verwende dazu den Befehl liesZahl(). Ein Beispiel für seine Verwendung findest du hier.