Frage zu Übung(Lottozahlen erzeugen und auf doppelte Prüfen)



  • Hallo Leute, versuche grad autodidaktisch C++ zu lernen und hatte die oben erwähnte Übung.
    Es scheint zu funktionieren.
    Aber ich bin mir nicht sicher, ob ich wirklich alles berücksichtigt habe...
    Vor allem war ja das Sortieren gar nicht gefordert, aber da ich ja immer nur ein Element mit dem nächsten vergleiche, und ich net weiss, ob das erste Element net gleich dem letzten ist, dachte ich, das wäre gar net so doof..

    #include <iostream>                    
    #include <cstdlib>                    
    using namespace std;
    
    int main()                             
    {   
       const int ARRAYGROESSE = 5; //Wert füer die Arraygroesse, hier 6, da 6 aus 49
       const int MODULOTEILER= 49; //Gibt die Anzahl der erzeugten "Zufallszahlen" an
       bool ok = false;	           //Schleifenbedingung für die while-Schleife
       int tausch = 0;             //int-Variable als Tauschcontainer
       int zahlen[ARRAYGROESSE];   //Lottozahlenarray	
    
    	//Array mit Zahlen füllen
       for (int i = 0; i <= ARRAYGROESSE; i++)
       {
    
          zahlen[i] = (rand() % MODULOTEILER) + 1;
    
       }
    
    	//Testausgabe
    	cout << "Ihre Zahlen(unsortiert): " << endl;
    
    	for (int i = 0; i <= ARRAYGROESSE; i++)
    	{
    	  cout << zahlen[i] << endl;
    	}
    
    	//Pruefen, ob Zahl doppelt, solange ist ok falsch	
    	while(!ok) {
    
    		//Schleife über das ganze Array, allerdings bis vor das Ende, damit ich nicht über die Grenze komme, daher nur bis kleiner dem letzten Element
    		//Bei gleich würde ich ja bspw. bei ARRAYGROESSE gleich vier, zahlen[4] mit zahlen[4+1] vergleichen, aber zahlen[4+1] liegt überhalb meiner oeberen arraygrenze 
    	   	for (int i = 0; i < ARRAYGROESSE; i++) {
    
    	   		//Wenn das i-te Element gleich dem (i+1)-te Element,
    	   		if(zahlen[i] == zahlen[i+1]) {	  
    
    			   zahlen[i+1] = (rand() % MODULOTEILER) + 1;  // dann ziehe für das (i-+1)-te Element eine neue Zahl			   
    			   ok= false; //ok wird wieder auf falsch gesetzt, damit die Bedingung für die While-Schleife erhalten bleibt
    			   break;     //For-Schleife neu ausführen
    
    			   }
    			//Wenn das i-te Element groesser als das (i+1)-te Element, dann werden die beiden Zahlen getauscht
    			//Den Tausch und den Neustart der Schleife mache ich hauptsächlich darum, weil ich immer nur ein Element mit dem nächsten vergleiche,
    			//da ist es ja nicht sicher, ob nicht das erste Element gleich dem letzten ist.
    			//Wenn ich sortiere und neustarte, umgehe ich das Problem. Denke ich zumindest...   
    			else if(zahlen[i] > zahlen[i+1]) {
    
    				tausch = zahlen[i+1];
    				zahlen[i+1] = zahlen[i];
    				zahlen[i] = tausch;
    				ok = false; //ok wird wieder auf falsch gesetzt, damit die Bedingung für die While-Schleife erhalten bleibt
    				break;      //For-Schleife neu ausführen
    
    			}
    			//Wenn nichts von beidem erfüllt ist, dann ist ok erstmal wahr. Wenn die Schleife durchläuft, hat man jedes Mal ok und keine Zahl war doppelt
    			//und die Zahlen sind sogar noch sortiert.
    			else {
    
    				ok = true;
    
    			}
    		} 
    	}
    
    	//Testausgabe, ob sortiert und Zahl doppelt:
    	cout << "*************************" << endl;	
    	cout << "Ihre Zahlen(sortiert): " << endl;
    
    	for (int i = 0; i <= ARRAYGROESSE; i++) {
    
    		cout << zahlen[i] << endl;
    
    	}
    
    	return 0;                           
    }
    


  • int zahlen[ARRAYGROESSE];
    for (int i = 0; i <= ARRAYGROESSE; i )
    out of bound. Es muss i < ARRAYGROESSE heissen. Nimm mal eine beliebige, kleine Zahl für ARRAYGROESSE und zähl es mit den Fingern ab, dann wirst du es schnell merken. Kommt mehrfach im Code vor das Problem.



  • Danke für deine Antwort!

    Innerhalb der while-schleife habe ich das doch?
    -aber ausserhalb, zum befüllen und zum ausgeben brauche ich ja wohl auch das fuenfte Element, sonst habe ich ja nur fünf Zahlen erzeugt und ausgegeben!?



  • Das Problem findet sich Zeilen 16, 26, 73. Innerhalb von while ist es richtig gemacht.

    Wenn du 6 Zahlen willst dann musst du hier

    const int ARRAYGROESSE = 5; //Wert füer die Arraygroesse, hier 6, da 6 aus 49
    auch wie im Kommentar eine 6 hinschreiben... 😉

    Dann:
    In das Array passen 6 Werte
    1. Wert hat Index 0
    2. Wert hat Index 1
    ...
    6. Wert hat Index 5



  • hiernamereinschreiben schrieb:

    Innerhalb von while ist es richtig gemacht.

    Nicht wirklich, in Zeile 39 gibts wieder einen out of bound index, i+1. Spiel das mal mit Papier und Bleistift durch.



  • Jetzt werden sicher wieder irgendwelche meckern, daß ich dir ein komplettes Kurzprogramm poste.
    Aber aber man kann auch dadurch was lernen wenn man ganz am Anfang steht:

    #include <iostream> 
    #include <ctime>
    #include <vector>
    #include <algorithm>
    #include <cstdlib> // hatte ich vergessen - interessant, daß die code tags hier beim Kommentar nicht funktionieren
    
    int main(int argc, char* argv[])
    {
    	std::vector<int> lotto;
    	srand( (unsigned) std::time(0) ); // seed for rand mit oldschool cast
    	for ( int i = 0; i < 6; ++i )
    	{
    		int zahl = 0;
    		do
    		{
    			zahl = std::rand() % 49 + 1;
    		} while( std::find( lotto.begin(), lotto.end(), zahl ) != lotto.end() ); // solange im vector gefunden
    		lotto.push_back( zahl );
    	}
    	for( std::vector<int>::const_iterator ci = lotto.begin(); ci != lotto.end(); ++ci)
    		std::cout << *ci << '\n';
    	return 0;
    }
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten