Wahrheitswerte: Aufgaben
Betrachte die folgenden drei Programme.
void main()
{
boolean b = true;
// Laufe
while (vornFrei())
{
vor();
b = !b;
}
// Teile Ergebnis mit
if (b)
{
schreib("True!");
}
else
{
schreib("False!");
}
}
void main()
{
boolean b = kornDa();
// Laufe
while (vornFrei())
{
vor();
b = b || kornDa();
}
// Teile Ergebnis mit
if (b)
{
schreib("True!");
}
else
{
schreib("False!");
}
}
void main()
{
boolean b = kornDa();
// Laufe
while (vornFrei())
{
vor();
b = b && kornDa();
}
// Teile Ergebnis mit
if (b)
{
schreib("True!");
}
else
{
schreib("False!");
}
}
Was tun die Programme a), b) und c) jeweils?
Gehe wie folgt vor: Starte mit einem einfachen Territorium, z.B. einem der folgenden:
Überlege dir jeweils im Kopf, wie die ersten Schritte des Hamsters aussehen würden. Wie würde sich die Variable b in den ersten Schritten verändern? Probiere anschließend das Programm mit den Beispiel-Territorien aus.
Beschreibe, wofür die Programme a), b) und c) verwendet werden können.
Das Programm a) prüft, ob die aktuelle Zeile eine gerade Anzahl an Kacheln enthält.
Das Programm b) prüft, ob in der aktuellen Zeile mindestens eine Kachel ein Korn enthält.
Das Programm c) prüft, ob in der aktuellen Zeile jede Kachel ein Korn enthält.
Der Hamster möchte eine Kachelreihe fegen. Auf jeder Kachel liegt maximal ein Korn. Er geht nun durch die Reihe und fegt jedes Korn um eine Kachel weiter nach rechts. Falls sich rechts keine Kachel mehr befindet, so behält er das Korn für sich.


Schreibe ein entsprechendes Programm. Beginne mit folgendem Grundgerüst und ergänze bei // TODO.
void main()
{
// Bedeutung der folgenden Variablen:
// `true` : auf der letzten Kachel befand sich ein Korn (wird jetzt "getragen")
// `false`: auf der letzten Kachel befand sich kein Korn
boolean traegtKorn = false;
while (vornFrei())
{
vor();
// TODO: Korn nehmen oder geben
}
}
Betrachte bei // TODO drei Fälle (Verwende eine Fallunterscheidung):
-
Aktuelle Kachel enthält kein Korn „
&&“ die VariabletraegtKornisttrue$\Rightarrow$ Gib ein Korn ab (vom letzten Feld) und setze die Variable
traegtKornauffalse. -
Aktuelle Kachel enthält ein Korn „
&&“ die VariabletraegtKornistfalse$\Rightarrow$ Nimm das Korn und setze die Variable
traegtKornauftrue(„Vormerken“). -
Weder noch
$\Rightarrow$ Nichts zu tun: Entweder das Korn bleibt, wo es ist, oder aber die Kachel bleibt leer, wie sie ist.
Der Tipp 1 sagt schon ziemlich ausführlich, was zu tun ist. Das „&&“ gibt einen Tipp, wie du einen entsprechenden logischen Ausdruck für eine Fallunterscheidung formulieren kannst. Betrachte auch noch einmal das Beispiel zum Arbeiten mit boolean-Variablen.
void main()
{
// Bedeutung der folgenden Variablen:
// `true` : auf der letzten Kachel befand sich ein Korn (wird jetzt "getragen")
// `false`: auf der letzten Kachel befand sich kein Korn
boolean traegtKorn = false;
while (vornFrei())
{
vor();
if (kornDa() && !traegtKorn)
{
nimm();
traegtKorn = true;
}
if (!kornDa() && traegtKorn)
{
gib();
traegtKorn = false;
}
}
}
Der Hamster blickt in einem leeren Territorium nach Süden. Er will nun das gesamte Territorium in Schlangenlinien von oben nach unten durchlaufen.
Es ergibt sich dabei immer dasselbe Muster:
- Der Hamster geht einen Schritt nach Süden.
- Der Hamster wendet sich nach Osten (blau) bzw. Westen (grün).
- Der Hamster läuft bis zum Ende der Reihe.
- Der Hamster wendet sich nach Süden: Nach rechts drehen (blau) bzw. links drehen (grün).
Schreibe eine Prozedur laufeReihe, welche genau die oben genannten Schritte ausführt. Die Prozedur soll einen Parameter boolean nachOsten erhalten.
Falls nachOsten auf true gesetzt ist (blau), soll sich der Hamster bei Schritt 2. nach links drehen; andernfalls nach rechts.
Falls nachOsten auf false gesetzt ist (grün), soll sich der Hamster bei Schritt 4. nach rechts drehen; andernfalls nach links.
Die main-Prozedur soll nun laufeReihe so oft ausführen, wie vornFrei ist. Dabei muss eine boolean-Variable nach jeder Reihe zwischen Osten und Westen „umgeschaltet“ werden, und die aktuelle Himmelsrichtung an laufeReihe übergeben werden.
Beginne mit folgendem Grundgerüst.
void main()
{
boolean alsNaechstesNachOsten = true;
while (vornFrei())
{
// TODO
}
}
// Vorher: Hamster blickt nach Sueden
// Nachher: Hamster blickt nach Sueden und befindet sich
// eine Zeile tiefer, in der anderen Himmelsrichtung
void laufeReihe(boolean nachOsten)
{
// TODO
}
void rechtsUm()
{
linksUm();
linksUm();
linksUm();
}
void main()
{
boolean alsNaechstesNachOsten = true;
while (vornFrei())
{
laufeReihe(nachOsten);
alsNaechstesNachOsten = !alsNaechstesNachOsten;
}
}
// Vorher: Hamster blickt nach Sueden
// Nachher: Hamster blickt nach Sueden und befindet sich
// eine Zeile tiefer, in der anderen Himmelsrichtung
void laufeReihe(boolean nachOsten)
{
vor();
if (nachOsten)
{
linksUm();
}
else
{
rechtsUm();
}
while (vornFrei())
{
vor();
}
if (nachOsten)
{
rechtsUm();
}
else
{
linksUm();
}
}
void rechtsUm()
{
linksUm();
linksUm();
linksUm();
}