Eine neue Aufgabe die mich zum verzweifeln bringt...

flashbrain

Mitglied
Schon wieder muß ich ein Problem lösen das mich etwas überfordert... Die Aufgabe lautet folgendermaßen:

Zahlen raten:
Erstellen Sie ein C++-Programm, in welchem eine vom Computer erzeugte Zufallszahl erraten werden soll. Für das Erzeugen der Zufallszahl sind in Ihrem Programm zunächst die Bibliotheken time.h und stdlib.h mittels #include einzubinden. Initialisieren Sie dann in Ihrem Hauptprogramm den Zufallsgenerator mittels des Befehls srand((unsigned int) time(NULL)); Eine positive, ganzzahlige Zufallszahl p aus der Menge f1; 2; : : : ; qg kann dann durch den Befehl int p=1+rand()%q erzeugt werden. Erzeugen Sie eine Zufallszahl zwischen 1 und 1000. Fragen Sie den Benutzer, in wievielen Versuchen er die gesuchte Zahl erraten will. Lesen Sie diesen Wert in eine Variable int versuche ein. Lesen Sie dann weiter in einer for-Schleife für i = 1; : : : ;versuche die geratenen Zahlen ein und vergleichen Sie die geratene Zahl in jedem Durchlauf mit der zu erratenen Zahl. Geben Sie auf dem Bildschirm eine Meldung aus, ob die geratene Zahl zu klein oder zu gro¼ ist. Informieren Sie den Rater, falls er die richtige Zahl erraten hat. Setzen Sie in diesem Fall die Variable versuche auf Null, um den Schleifendurchlauf abzubrechen. Erteilen Sie dem Rater ein entsprechendes Lob. Wird die gesuchte Zahl innerhalb der vorgegebenen Anzahl von Versuchen nicht erraten, so ist dem Benutzer mitzuteilen, welche Zahl gesucht war. Sprechen Sie Mut für ein erneutes Spiel zu.

Die Aufgabe soll denk ich dazu dienen for Schleifen zu üben... und mein Programm, das leider nicht funktionniert sieht folgendermaßen aus:

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main ()
{
int p = 1 + rand () % 1000, n, i, a;
cout << "Geben Sie ein wieviele Versuche Sie haben wollen, um eine Zufallszahl zwischen 1 und 1000 zu erraten!" <<endl;}
cin >> n;
for ( i = 1; i = n; i++)
{
cout << "Geben Sie eine Zahl zwischen 1 und 1000 ein!" << endl;
cin >> a;
if (a > p) {cout << "Die gesuchte Zahl ist kleiner" << endl;}
if (a < p) {cout << "Die gesuchte Zahl ist größer" << endl;}
if (a = p) {cout << "Herzlichen Glückwunsch! Sie haben die Zahl erraten"; n=0;}
if (i > n) {cout << " Sie haben die maximale Anzahl an Versuchen erreicht. Die gesuchte Zahl lautet: " << p << "! Versuchen Sie es doch gleich noch einmal." << endl;}
}
return 0;
}

Kann mir jemand sagen was ich da falsch gemacht hab?
 
flashbrain hat gesagt.:
Schon wieder muß ich ein Problem lösen das mich etwas überfordert... Die Aufgabe lautet folgendermaßen:

Zahlen raten:
Erstellen Sie ein C++-Programm, in welchem eine vom Computer erzeugte Zufallszahl erraten werden soll. Für das Erzeugen der Zufallszahl sind in Ihrem Programm zunächst die Bibliotheken time.h und stdlib.h mittels #include einzubinden. Initialisieren Sie dann in Ihrem Hauptprogramm den Zufallsgenerator mittels des Befehls srand((unsigned int) time(NULL)); Eine positive, ganzzahlige Zufallszahl p aus der Menge f1; 2; : : : ; qg kann dann durch den Befehl int p=1+rand()%q erzeugt werden. Erzeugen Sie eine Zufallszahl zwischen 1 und 1000. Fragen Sie den Benutzer, in wievielen Versuchen er die gesuchte Zahl erraten will. Lesen Sie diesen Wert in eine Variable int versuche ein. Lesen Sie dann weiter in einer for-Schleife für i = 1; : : : ;versuche die geratenen Zahlen ein und vergleichen Sie die geratene Zahl in jedem Durchlauf mit der zu erratenen Zahl. Geben Sie auf dem Bildschirm eine Meldung aus, ob die geratene Zahl zu klein oder zu gro¼ ist. Informieren Sie den Rater, falls er die richtige Zahl erraten hat. Setzen Sie in diesem Fall die Variable versuche auf Null, um den Schleifendurchlauf abzubrechen. Erteilen Sie dem Rater ein entsprechendes Lob. Wird die gesuchte Zahl innerhalb der vorgegebenen Anzahl von Versuchen nicht erraten, so ist dem Benutzer mitzuteilen, welche Zahl gesucht war. Sprechen Sie Mut für ein erneutes Spiel zu.

Die Aufgabe soll denk ich dazu dienen for Schleifen zu üben... und mein Programm, das leider nicht funktionniert sieht folgendermaßen aus:

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main ()
{
int p = 1 + rand () % 1000, n, i, a;
cout << "Geben Sie ein wieviele Versuche Sie haben wollen, um eine Zufallszahl zwischen 1 und 1000 zu erraten!" <<endl;} <-Diese Klammer ist sicherlich nicht gewollt ! Wenn du die wegmachst, sollte es gehen
cin >> n;
for ( i = 1; i = n; i++)
{
cout << "Geben Sie eine Zahl zwischen 1 und 1000 ein!" << endl;
cin >> a;
if (a > p) {cout << "Die gesuchte Zahl ist kleiner" << endl;}
if (a < p) {cout << "Die gesuchte Zahl ist größer" << endl;}
if (a = p) {cout << "Herzlichen Glückwunsch! Sie haben die Zahl erraten"; n=0;}
if (i > n) {cout << " Sie haben die maximale Anzahl an Versuchen erreicht. Die gesuchte Zahl lautet: " << p << "! Versuchen Sie es doch gleich noch einmal." << endl;}
}
return 0;
}

Kann mir jemand sagen was ich da falsch gemacht hab?


Und benutze demnächst bitte die CODE Tags hier im Forum, sonst kann kein mensch deinen Code lesen. Thx
 
Code:
for ( i = 1; ; i++)
{
cout << "Geben Sie eine Zahl zwischen 1 und 1000 ein!" << endl;
cin >> a;
if (a > p) {cout << "Die gesuchte Zahl ist kleiner" << endl;}
if (a < p) {cout << "Die gesuchte Zahl ist größer" << endl;}
if (a == p) {cout << "Herzlichen Glückwunsch! Sie haben die Zahl erraten"; break;}
if (i > n) {cout << " Sie haben die maximale Anzahl an Versuchen erreicht. Die gesuchte Zahl lautet: " << p << "! Versuchen Sie es doch gleich noch einmal." << endl; break;}
}

denn wenn du in der for-Schleife als Abbruchbedingung i=n schreibst, wird bei jedem durchlaufen der Schleife am Anfang i=n gesetzt. Das nicht so gut, weil dann die if-Bedingung i>n niemals erfüllt sein kann. Tausch mal deine for-Schleife gegen diese hier. Das sollte .....
 
Abgesehn von den Syntaxfehlern (Zuweisungsoperator = mit dem Vergleichsoperator == verwechselt und so...) hast du da auch noch einen logische Fehler:

Du startest die For-Schleife in der der Benutzer raten kann mit i=1 und hast als Ednkriterium i<=n (so müsste es richtig heißen dass er aufhört sobald die Maximalanzahl der Versuche erreicht ist). Stellen wir also fest die Schleife wird zum letzten Mal durchlaufen wenn i=n. Demnach kann es NIE vorkommen dass (i > n) true ergibt.

Nur so als Hinweis: Der C/c++ Programmierer fängt normalerweise bei 0 an zu zählen, ist einfacher und logischer, auch wenn deine Variante nicht falsch ist. So kannst dann schreiben:

Code:
for ( i = 0; i<n ; ++i)
{
cout << "Geben Sie eine Zahl zwischen 1 und 1000 ein!" << endl;
cin >> a;

// Zuerst schauen wir ob es richtig ist!
if (a == p) 
{
    cout << "Herzlichen Glückwunsch! Sie haben die Zahl erraten"; 
    break;
}

// Dann falls nicht ob es der letzte Versuch war, wenn ja kommt die Auflösung
if(i==n-1)
{
    cout << " Sie haben die maximale Anzahl an Versuchen erreicht. Die gesuchte Zahl lautet: " << p << "! Versuchen Sie es doch gleich noch einmal." << endl; 
    break;
}
// Wenn er noch Versuche hat kommt der Tipp
else if (a > p) 
{
    cout << "Die gesuchte Zahl ist kleiner" << endl;
    continue; // Dann macht er direkt mit dem nächsten Schleifendurchlauf weiter
else
{
    cout << "Die gesuchte Zahl ist größer" << endl;
    continue;
}

} // end for


Edit: Wegen der gleichen Zufallszahl: Der Zufallsgenerator ist auch nur ein Alogithmus, sprich er geht immer nach dem gleichen Muster vor. Dass doch immer eine andere Zahl dabei herraus kommt sollte/muss man ihn initialisieren. Dies macht man normal mit der Systemzeit (da diese sich ja immer ändert und er so auch nicht immer gleich initalisiert wird). Wie das geht steht schon in der Aufgabe!

srand((unsigned int) time(NULL));

oder:

randomize();
 
Zuletzt bearbeitet:
Zurück