Übungsaufgaben
Zehn Übungen zu Zufallszahlen, Spielschleifen und der Halbierungsstrategie — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du nicht weiterkommst, helfen die gestuften Tipps.
Ordne jedem Code-Baustein seine Aufgabe im Zahlenraten zu.
srand und rand. srand liefert keine Zufallszahl, sondern legt nur fest, wo die Zahlenfolge startet. Die Uhrzeit sorgt dafür, dass jeder Programmstart anders beginnt.#include-Zeilen: Welche Funktion steckt in welchem Header?srand steht für seed, den Startwert.Nenne zu jeder Aussage, ob sie stimmt.
srand in der Schleife macht den Zufall kaputt, weil time(0) sich nur einmal pro Sekunde ändert.%-Aussagen mit dem kleinsten und größten möglichen Rest.time(0) liefert die Sekunden seit 1970 — innerhalb einer Sekunde immer dieselbe Zahl.int z = rand() % 6 + 1 * 2;
Mia will damit „einen Würfel verdoppeln“. Gib den größten Wert an, den z tatsächlich annehmen kann.
% und *: Gerechnet wird (rand() % 6) + (1 * 2), also 0 … 5 plus 2 = 2 … 7. Typischer Fehler: 12 — für den verdoppelten Würfel bräuchte Mia (rand() % 6 + 1) * 2.% und * binden stärker als +.rand() % 6 ist höchstens 5, 1 * 2 ist 2.Aus rand() % n (Werte 0 … n − 1) wird die Formel a + rand() % (b - a + 1) für Zahlen von a bis b. Leite die Werte Schritt für Schritt her.
- Für Zahlen von 20 bis 50: \(n = b - a + 1\) =
-
kleinster Wert von
20 + rand() % 31 -
größter Wert von
20 + rand() % 31 - Für Zahlen von −5 bis 5: \(n\) =
-5 + rand() % 11.do { cout << "Dein Tipp: "; cin >> tipp; versuche++; if (tipp < geheim) cout << "groesser" << endl; else if (tipp > geheim) cout << "kleiner" << endl; else cout << "Treffer" << endl; } while (tipp != geheim);
Die Geheimzahl ist 71, versuche startet bei 0. Stelle die Partie in der Tabelle dar (Ausgabe als groesser, kleiner oder Treffer).
| Tipp | Ausgabe | versuche |
|---|---|---|
| 50 | ||
| 75 | ||
| 62 | ||
| 68 | ||
| 71 |
versuche++ steht vor der Prüfung, deshalb zählt auch der Treffer mit.versuche um 1 — auch beim Treffer.Ein Würfel wird so lange geworfen, bis die Augensumme mindestens 20 ist; dann wird die Zahl der Würfe ausgegeben. Ergänze die Lücken.
#include <iostream> #include #include <ctime> using namespace std; int wuerfeln() { return ; } int main() { ; int summe = 0, wuerfe = 0; while () { summe = summe + wuerfeln(); wuerfe++; } cout << "20 erreicht nach " << wuerfe << " Wuerfen" << endl; return 0; }
rand() % 6 allein liefert 0 bis 5 — ein Würfel ohne Sechs, dafür mit Null. srand(0) startet immer gleich, jedes Spiel verliefe identisch. Typischer Fehler bei der Bedingung: summe == 20 — am Anfang ist die Summe 0, die Bedingung also falsch, und die Schleife läuft kein einziges Mal (Ausgabe „nach 0 Wuerfen“).Hier rät der Computer selbst — mit while und Ganzzahldivision aus 2.1.
int unten = 1, oben = 100, versuche = 0, tipp = 0; while (tipp != geheim) { tipp = (unten + oben) / 2; versuche++; if (tipp < geheim) unten = tipp + 1; else if (tipp > geheim) oben = tipp - 1; }
Analysiere den Code für geheim = 83 und markiere alle zutreffenden Aussagen.
geheim = 50 trifft schon der erste Tipp, die Schleife läuft also nur einmal. Typischer Fehler: (76 + 100) / 2 als 88,0 und (76 + 87) / 2 als 81,5 rechnen — Ganzzahldivision schneidet ab: 81.unten, oben und tipp.Gesucht ist eine Zahl von 1 bis 100; am Ende soll die Zahl der Versuche erscheinen. Überprüfe den Code — drei Zeilen sind fehlerhaft.
srand steht einmal vor der Schleife. Der Fehler in Zeile 15 ist der auffälligste — das Spiel endet nach dem ersten Fehlversuch. Die beiden anderen fallen beim Testen leicht durch: Die 100 fehlt nur selten, und ein uninitialisiertes versuche ist manchmal zufällig 0 (-Wall warnt aber).do-while-Bedingung sagt, wann weitergemacht wird.Beim Raten mit geschickter Halbierung braucht man für die Zahlen 1 bis 100 höchstens 7 Versuche. Schätze für andere Bereiche ab, wie viele Versuche man höchstens braucht.
Ein anderes Konsolenspiel: Drei Malaufgaben mit Zufallszahlen von 1 bis 10, am Ende die Zahl der richtigen Antworten. Der Zufallsgenerator wird ganz zu Beginn gestartet. Entwirf den Rumpf von main, indem du die Zeilen ordnest.
srand dagegen gehört davor, sonst liefert es innerhalb einer Sekunde immer dieselben Zahlen. Die Ausgabe des Ergebnisses steht nach der Schleife, sonst erscheint sie nach jeder Aufgabe.