Erraten der Zufallszahl funktioniert nicht



  • Hier einmal der gesamte Quellcode:

    #include <ctime>													//Header-Datei für time bei srand
    #include <cstdlib>													//Header-Datei für rand und srand
    #include <iostream>													//Header-Datei für "cin" und "cout"
    using namespace std;
    
    int main(void)
    	{
    		int zahl, einlesen;											//Variablen "Zahl" und "Einlesen" als Integer(da Zahlen) deklarieren
    		int versuche;												//Versuche ist auch Integer da die Versuche gezählt werden
    
    		srand((unsigned)time(NULL));
    		zahl=rand();												//Zahl über Zufallsgenerator erzeugt
    		zahl=zahl%1000+1;											//"rand() erzeugt eine Zufallszahl zwischen 2^0 und 2^15, deswegen 
    																	//%1000+1; %=Modulo -> keine Kommazahlen; 0 bis 1000
    
    		cout<<"Zufallszahl zwischen 1 und 1000 eingeben";
    		cin>>einlesen;
    
    		for(versuche=0; zahl!=einlesen; versuche++)					//Versuche muss mit =0 initialisiert werden
    		{
    				if( einlesen<zahl)
    					{
    						cout<<"Eingebene Zahl ist zu klein!\n";
    						cout<<"Erneute eingabe\n";
    						cin>> einlesen;
    					}
    
    				else if (einlesen>zahl)
    					{
    						cout<<"Eingebene Zahl ist zu gross!\n";
    						cout<<"Erneute eingabe!\n";
    						cin>> einlesen;
    					}
    
    				if(einlesen==zahl)
    				{
    					if(versuche<10)
    					{
    						cout<<"Weniger als 10 Versuche, Glueck gehabt\n";
    						cout<<"Anzahl der Versuche:\n\n"<<versuche<<endl;
    					}
    					if(versuche==10)
    					{
    
    							cout<<"Prima, 10 Versuche, sie sind ueberlegt an das Problem herangegangen\n";
    					}		cout<<"Anzahl der Versuche:\n\n"<<versuche<<endl;
    
    					if(versuche>10)
    					{
    						cout<<"Mehr als 10 Versuche, sie haben mehr oder weniger im Nebel gestochert\n";
    						cout<<"Anzahl der Versuche:\n"<<versuche<<endl;
    
    					}
    				}
    		}
        enum {RICHTIG, ZU_GROSS, ZU_KLEIN};
    
        if(einlesen<zahl)
        {
            cout << "ZU_KLEIN";
        }
    
        if(einlesen == zahl)
        {
            cout << "RICHTIG";
        }
    
        if(einlesen > zahl)
        {
            cout << "ZU_GROSS";
        }
    		return 0;
    }
    

    Er funktioniert zumindest bei mir noch nicht ganz... Ich weiß nicht, wie ich "ZU_GROSS", "ZU_KLEIN" und "RICHTIG" einbauen soll, damit das eingebungen wird...

    Sollte ich dazu eine Funktion schreiben??



  • silent_max schrieb:

    Er funktioniert zumindest bei mir...

    😮
    Das hat mit der Aufgabenstellung nichts zu tun.

    Du hast vergessen dein Hirn zu benutzen.



  • noch nie mit Enumerationen gearbeitet?

    weil so ist die nutzung falsch.

    hat da nicht jemand en guten link?



  • DirkB schrieb:

    silent_max schrieb:

    Er funktioniert zumindest bei mir...

    😮
    Das hat mit der Aufgabenstellung nichts zu tun.

    Du hast vergessen dein Hirn zu benutzen.

    Ich habe nur den Quellcode gepostet, bevor ich mein Hirn eingeschaltet habe.

    Ich hoffe, dass folgender Code jetzt passt:

    #include <ctime>													//Header-Datei für time bei srand
    #include <cstdlib>													//Header-Datei für rand und srand
    #include <iostream>													//Header-Datei für "cin" und "cout"
    using namespace std;
    
    enum {RICHTIG, ZU_GROSS, ZU_KLEIN};
    
    int main(void)
    	{
    		int zahl, einlesen;											//Variablen "Zahl" und "Einlesen" als Integer(da Zahlen) deklarieren
    		int versuche;												//Versuche ist auch Integer da die Versuche gezählt werden
    
    		srand((unsigned)time(NULL));
    		zahl=rand();												//Zahl über Zufallsgenerator erzeugt
    		zahl=zahl%1000+1;											//"rand() erzeugt eine Zufallszahl zwischen 2^0 und 2^15, deswegen 
    																	//%1000+1; %=Modulo -> keine Kommazahlen; 0 bis 1000
    
    		cout<<"Zufallszahl zwischen 1 und 1000 eingeben";
    		cin>>einlesen;
    
    		for(versuche=0; zahl!=einlesen; versuche++)					//Versuche muss mit =0 initialisiert werden
    		{
    				if( einlesen<zahl)
    					{
    						cout<<"Eingebene Zahl ist zu klein!\n";
    						cout << "ZU_KLEIN\n";
    						cout<<"Erneute eingabe\n";
    						cin>> einlesen;
    					}
    
    				else if (einlesen>zahl)
    					{
    						cout<<"Eingebene Zahl ist zu gross!\n";
    						cout << "ZU_GROSS\n";
    						cout<<"Erneute eingabe!\n";
    						cin>> einlesen;
    					}
    
    				if(einlesen==zahl)
    				{
    					cout << "RICHTIG\n";
    					if(versuche<10)
    					{
    						cout<<"Weniger als 10 Versuche, Glueck gehabt\n";
    						cout<<"Anzahl der Versuche:\n\n"<<versuche<<endl;
    					}
    					if(versuche==10)
    					{
    
    							cout<<"Prima, 10 Versuche, sie sind ueberlegt an das Problem herangegangen\n";
    					}		cout<<"Anzahl der Versuche:\n\n"<<versuche<<endl;
    
    					if(versuche>10)
    					{
    						cout<<"Mehr als 10 Versuche, sie haben mehr oder weniger im Nebel gestochert\n";
    						cout<<"Anzahl der Versuche:\n"<<versuche<<endl;
    
    					}
    				}
    		}
    
    		return 0;
    }
    


  • Was passiert wenn du Zeile 6 löschst?
    Glaubst du wirklich du hast die enums benutz, oder nur dahingeschrieben?



  • Skym0sh0 schrieb:

    ... hat da nicht jemand en guten link?

    Ich habe da gerade einen gesehen. Dunkelblau Schrift auf hellblauen Hintergrund.



  • silent_max schrieb:

    Ich hoffe, dass folgender Code jetzt passt:

    Nein, ist an der Aufgabenstellung vorbei.



  • Skym0sh0 schrieb:

    Nein, ist an der Aufgabenstellung vorbei.

    Wie würdest Du denn das mit dem Enum machen??



  • @silent_max: Mach uns ma nen Ablaufplan (pseudocode) wie du dir dein Programm vorstellst.



  • DirkB schrieb:

    Skym0sh0 schrieb:

    ... hat da nicht jemand en guten link?

    Ich habe da gerade einen gesehen. Dunkelblau Schrift auf hellblauen Hintergrund.

    Hab ich gepostet gehabt. Aber ist halt ein Spoiler, sprich eine Komplettlösung zu der Aufgabe und das sollte nicht in deinem Sinne sein.

    Zumal ich eine mathematische Funktion benutzt habe um es mir ein wenig zu vereinfachen...



  • silent_max schrieb:

    Wie würdest Du denn das mit dem Enum machen??

    Auf Seite 4 von diesem Thread hat Skym0sh0 einen Link gepostet unter dem Text Achtung Spoiler. (Ein Link erscheint hier in dunkelblauer Schrift)



  • ScottZhang schrieb:

    @silent_max: Mach uns ma nen Ablaufplan (pseudocode) wie du dir dein Programm vorstellst.

    Ich kann nur schreiben, was ich aus der Aufgabenstellung heraus verstehe...

    -> Ausgabe von "Zufallszahl zwischen 1 und 1000 eingeben"
    -> Zahl einlesen
    -> Falls zu klein => Ausgabe von "Die eingegebene Zahl ist zu klein! ZU_KLEIN Erneute Eingabe"
    Falls zu gross => Ausgabe von "Die eingegebene Zahl ist zu gross! ZU_GROSS Erneute Eingabe"
    Falls richtig => Ausgabe von " RICHTIG. Sie haben ... Versuche gebraucht!"



  • Da steht nichts davon, dass der Text "ZU_KLEIN" oder "RICHTIG" auf dem Schirm erscheinen soll.

    Du sollst eine Funktion schreiben die den Vergleich für dich erledigt.
    Statt

    if( einlesen<zahl)
    

    soll dann

    if( my_check(einlesen, zahl) == ZU_KLEIN) //  ohne "" um ZU_KLEIN. Das ist ein enum.
    ...
    

    Du musst jetzt noch die Funktion my_check schreiben die den Vergleich macht und entsprechend die Werte zurück gibt.



  • DirkB schrieb:

    Da steht nichts davon, dass der Text "ZU_KLEIN" oder "RICHTIG" auf dem Schirm erscheinen soll.

    Du sollst eine Funktion schreiben die den Vergleich für dich erledigt.
    Statt

    if( einlesen<zahl)
    

    soll dann

    if( my_check(einlesen, zahl) == ZU_KLEIN) //  ohne "" um ZU_KLEIN. Das ist ein enum.
    ...
    

    Du musst jetzt noch die Funktion my_check schreiben die den Vergleich macht und entsprechend die Werte zurück gibt.

    Ist denn mein Code so vorbei an der Aufgabe??

    Also muss ich für ZU_GROSS und RICHTIG auch eine Funktion schreiben??

    Edit: Da muss ich den ganzen Code umschreiben oder wie verstehe ich das??
    Edit²: mycheck muss doch schon vom Typ int sein?
    Edit³: Wenn ich jetzt folgenden Code hinzufüge

    int my_check();
    ...
    ...
    ...
    int my_check (int Ergebnis)
    {
    	if(my_check (einlesen, zahl) == ZU_KLEIN)
    		cout << "Zu Klein\n";
    	if(my_check (einlesen, zahl) == RICHTIG)
    		cout << "Richtig\n";
    	if(my_check (einlesen, zahl) == ZU_GROSS)
    		cout << "Zu gross\n";
    	return ergebnis;
    }
    

    dann sind my_check , einlesen , zahl , RICHTIG und Ergebnis rot unterringelt....



  • silent_max schrieb:

    Also muss ich für ZU_GROSS und RICHTIG auch eine Funktion schreiben??

    Nein.
    Das soll die eine Funktion erledigen

    Aufgabe schrieb:

    Die Überprüfung der Zufallszahl soll in einem Unterprogramm erfolgen. Das Unterprogramm liefert einen Enumwert zurück, der angibt ob die Zahl RICHTIG, ZU_GROSS oder ZU_KLEIN war.

    silent_max schrieb:

    Edit: Da muss ich den ganzen Code umschreiben oder wie verstehe ich das??
    Edit²: mycheck muss doch schon vom Typ int sein?

    Nein, musst du nicht.
    Ein enum ist ein int. Da haben die Zahlen nur andere Namen.

    silent_max schrieb:

    Edit³: Wenn ich jetzt folgenden Code hinzufüge

    int my_check();
    ...
    ...
    ...
    int my_check (int Ergebnis)
    {
    	if(my_check (einlesen, zahl) == ZU_KLEIN)
    		cout << "Zu Klein\n";
    	if(my_check (einlesen, zahl) == RICHTIG)
    		cout << "Richtig\n";
    	if(my_check (einlesen, zahl) == ZU_GROSS)
    		cout << "Zu gross\n";
    	return ergebnis;
    }
    

    dann sind my_check , einlesen/[c],[c]zahl , RICHTIG und Ergebnis rot unterringelt....

    - Der Prototyp (Zeile 1) passt nicht zur Definition (Zeile 5)
    - Den Paramter Ergebnis benutzt du nicht in der Funktion.
    - Du machst einen rekursiven Aufruf mit anderen Parametern (Zeile 7, 9, 11)
    - Die Variablen einlesen, zahl und ergebnis sind in der Funktion nicht
    definiert.

    Die Zeilen 7 bis 12 gehören in dein main in deine for-Schleife (oberer Teil).
    Was bisher in deiner for-Schleife war (der Vergleich auf kleiner oder größer) kommt in die Funktion.
    Achte auf die Parameter.

    Natürlich musst du da noch Sachen anpassen.
    Nochmal mit eingeschaltetem Hirn überlegen.



  • ... womit wir wieder bei Grundlagen wären:
    Funktionen, Funktionsdeklarationen/definitionen, Parameter, Rückgabe usw.

    Noch mal:
    Du musst langsam Schritt für Schritt machen, und den nächsten Schritt immer erst dann, wenn Du den vorherigen verstanden hast.

    Deinem Code zufolge hast Du nur eine sehr geringe Vorstellung vom Konzept der Funktionen ...

    Ich befürchte auch, dafür ist ein Forum nur sehr bedingt geeignet ...



  • silent_max schrieb:

    -> Ausgabe von "Zufallszahl zwischen 1 und 1000 eingeben"
    -> Zahl einlesen
    -> Falls zu klein => Ausgabe von "Die eingegebene Zahl ist zu klein! ZU_KLEIN Erneute Eingabe"
    Falls zu gross => Ausgabe von "Die eingegebene Zahl ist zu gross! ZU_GROSS Erneute Eingabe"
    Falls richtig => Ausgabe von " RICHTIG. Sie haben ... Versuche gebraucht!"

    Falsch, denn du sollst die Zahlen einlesen solange wie sie nicht richtig ist und nicht nur 2mal!

    Denk mal nicht ans C++ programmieren. Gib einfach ma nen Ablaufplan an, irgendwas pseudocode mäßiges, kannste dir ausdenken. Stell dir vor den Plan müsstes du dan jemanden geben, und du willst das derjenige die Aufgabe zu deiner Zufreidenheit erledigt. Ums drastisch zu machen, stell dir vor deine Leben hänge davon ab 😃



  • DirkB schrieb:

    Aufgabe schrieb:

    Die Überprüfung der Zufallszahl soll in einem Unterprogramm erfolgen. Das Unterprogramm liefert einen Enumwert zurück, der angibt ob die Zahl RICHTIG, ZU_GROSS oder ZU_KLEIN war.

    Ich denke jetzt nur mal in Schriftform ... also so zusagend laut... daher erwarte ich keine Antwort...

    Wenn ich

    enum Ergebnis{ZU_KLEIN,RICHTIG,ZU_GROSS}
    {
      ...
    }
    

    schreibe, dann bekomme ich die Meldung

    Error: Es wurde eine Deklaration erwartet
    

    Hm... im Buch "Der C++ Programmierer" steht bzgl. enum als Rückgabewert nichts brauchbares...

    Edit: Himmel verdammt ich bin kurz vor´m ... Ich verstehe an der Stelle nicht, was ihr mit enum{ZU_KLEIN,RICHTIG,ZU_GROSS} meint... wenn ich daraus eine Funktion basteln will, dann kommt bei mir die Meldung Error: Es wurde eine Deklaration erwartet

    Wie würdet ihr denn aus dem enum eine Funktion basteln??



  • Oh man, ich hoffe du weisst was Funktionen sind.

    Du sollst nix weiter machen als eine Funktion schreiben die deine zwei Zahlen vergleicht!
    Das Ergebnis codierst in Form eines enums, den es gibt genau drei Fälle

    // definition eines Typs: hier enum
    enum Relation {ZU_KLEIN, ZU_GLEICH, ZU_GROSS};
    
    // Funktionen: <rückgabe_typ> <funktione_name> (<Argumenten_liste>)
       Relation vergleiche(int variabel, int fix);
    // ^^^^^^^^
    // Rückgabetyp!!!
    
    Relation vergleiche(int variabel, int fix)
    {
      //gaaaanz ausfürlich
      if      ( variabel <  fix ) return ZU_KLEIN;
      else if ( variable == fix ) return ZU_GLEICH; // :D
      else                        return ZU_GROSS;
    }
    


  • ich verweise an der stelle nochmal auf Shade of Mine's Tutorial. Wie ich finde sehr gutes Ding, leider absolut nicht merh aktuell und auch nicht mehr wirklich online

    Inhalt
    Enums...


Anmelden zum Antworten