Erraten der Zufallszahl funktioniert nicht



  • 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...



  • Ich merke schon, hauptberuflich werde ich C++ nicht machen...

    Die Funkton habe ich jetzt so geschrieben:

    enum Relation{ZU_KLEIN,RICHTIG,ZU_GROSS};
    
    Relation vergleiche(int eingabe, int zahl)
    {
    	if (eingabe<zahl)
    		return ZU_KLEIN;
    	if (eingabe>zahl)
    		return ZU_GROSS;
    	if (eingabe==zahl)
    		return RICHTIG;
    }
    

    Nun wollte ich per cout die Funktion aufrufen, beispielsweise so:

    cout << vergleich(einlesen, zahl);
    

    Und was ist?? Mal wieder die Meldung

    Error: Der Bezeichner "vergleich" ist nicht definiert
    


  • Mach für heute Schluss und gehs morgen wieder an.

    Du hast einfach nurn 'e' vergessen 😉



  • ScottZhang schrieb:

    Mach für heute Schluss und gehs morgen wieder an.

    Du hast einfach nurn 'e' vergessen 😉

    SSSSSSSSSSSSScccccccccccccccccccccccchhhhhhhhhhhhhhhhrrrrrrrrrrrrrrrrrrreeeeeeeeeeeeeiiiiiiiiiiiiiiii

    Edit:

    enum Relation{ZU_KLEIN,RICHTIG,ZU_GROSS};
    
    Relation vergleiche(int eingabe, int zahl)
    {
    	if (eingabe<zahl)
    		return ZU_KLEIN;
    	if (eingabe>zahl)
    		return ZU_GROSS;
    	if (eingabe==zahl)
    		return RICHTIG;
    }
    

    Ist es normal, dass bei ZU_GROSS 2, bei ZU_KLEIN 0 und bei RICHTIG 1 rauskommt?



  • ja



  • Damit andere Anfänger, die eine ähnliche Problemstellung haben und nicht mehr weiter wissen, auch etwas davon haben, hier noch einmal der gesamte Code:

    #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 Relation{ZU_KLEIN,RICHTIG,ZU_GROSS};
    
    Relation vergleiche(int eingabe, int zahl)
    {
    	if (eingabe<zahl)
    		return ZU_KLEIN;
    	if (eingabe>zahl)
    		return ZU_GROSS;
    	if (eingabe==zahl)
    		return RICHTIG;
    }
    
    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<<"Eingegebene Zahl ist zu klein!\n";
    						cout << vergleiche(einlesen, zahl);
    						cout<<"Erneute eingabe\n";
    						cin>> einlesen;
    					}
    
    				else if (einlesen>zahl)
    					{
    						cout<<"Eingegebene Zahl ist zu gross!\n";
    						cout << vergleiche(einlesen, zahl);
    						cout<<"Erneute eingabe!\n";
    						cin>> einlesen;
    					}
    
    				if(einlesen==zahl)
    				{
    					cout << vergleiche(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;
    
    					}
    				}
    		}
    
    		return 0;
    }
    

    Euch gilt auch noch Dank

    Gruß

    Max



  • bei enums werden (sofern nicht anders angegeben) die einzelnen Enumeranden von 0 an hochgezählt.

    enum Beispiel
    {
        Zero, // 0
        One, // 1
        Two, // 2
        Second_Zero = 0, // 0
        Eins, // 1
        Zwei, // 2
        Tausend = 1000, // 1000
        Next, // 1001
    ... etc.
    };
    


  • nee du, das gehste morgen nochma in ruhe durch ...

    (Edit: bezihet sich auf das 2te post vor mir)



  • ...



  • Soviel musst du gar nicht ändern:
    Meine Anmerkungen nach // //

    #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 Relation{ZU_KLEIN,RICHTIG,ZU_GROSS};
    
    Relation vergleiche(int eingabe, int zahl)
    {
    	if (eingabe<zahl)
    		return ZU_KLEIN;
    	else if (eingabe>zahl)    // mit else //
    		return ZU_GROSS;
    	else // if (eingabe==zahl) //
    		return RICHTIG;
    }
    
    int main(void)
    	{
    		int zahl, einlesen = 0;							  		    //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 " << endl;
    
    		for(versuche=0; zahl!=einlesen; versuche++)  // // eine fussgesteuerte Schleife (do-while) waere besser					
    		{
    
       		    cin>>einlesen;  // // Am Anfang der Schleife einlesen.
    
                if (vergleiche(einlesen, zahl) == ZU_KLEIN)
                { cout<<"Eingegebene Zahl ist zu klein!\n";
    			  cout<<"Erneute eingabe\n";
                }
                else if (vergleiche(einlesen, zahl) == ZU_GROSS)
                { cout<<"Eingegebene Zahl ist zu gross!\n";
    			  cout<<"Erneute eingabe\n";
                }
    
    		} //  // Hier ist die Schleife schon zu ende
    // //				if(einlesen==zahl)  wird nicht mehr gebraucht, geht nicht anders, da sonst die Schleif nicht beendet ist
    // //				{
    // //					cout << vergleiche(einlesen, zahl);  was soll das ?
    
    					cout<<"Anzahl der Versuche: "<<versuche<<endl;  // // einmal für alle drei Fälle
    
    					if(versuche<10)
    						cout<<"Weniger als 10 Versuche, Glueck gehabt\n";
                        else if(versuche>10)
    						cout<<"Mehr als 10 Versuche, sie haben mehr oder weniger im Nebel gestochert\n";
                        else // // if(versuche==10) kein if mehr, es bleibt keine andere Moeglichkeit
                            cout<<"Prima, 10 Versuche, sie sind ueberlegt an das Problem herangegangen\n";
    
    // //				} noch vom if einlesen==zahl)
    // //		} falsch von for
    
    		return 0;
    }
    


  • ...


Anmelden zum Antworten