Selection Sort in Lottozahlengenerator



  • Hallo Leute,

    ich habe hier einen Lottozahlengenerator programmiert und nun habe ich das Problem, dass die Zahlen noch unsortiert ausgegeben werden.

    Es werden mir 10 Zeilen mit jeweils 6 Zahlen generiert, wobei in einer Zeile keine Zahl doppelt vorkommt. (Um 10 Ziehungen zu simulieren)

    Nun habe ich die Frage, ob mir jemand eventuell den Selection Sort in mein Programm integrieren könnte?

    Hier mal mein Code:

    #include <cstdlib>
    #include <iostream>
    #include <time.h>
    
    using namespace std;
    
    int main()
    {
        // Deklaration
        int LottoFeld[10][6];
        int z;
        int s;
        int i;
        bool gueltig;
    
        srand(time (NULL));
    
        // Anzahl der Ziehungen
        for(z=0; z<=9; z++)
          {
                 // Anzahl der Zahlen
                 for(s=0; s<=5; s++)
                   {
                          // Hilfsvariable für die Gültigkeitsprüfung
                          gueltig = false;
                          // Gültigkeitsprüfung
                          while(gueltig == false)
                            {
                                        // Ziehung der Zufallszahl
                                        LottoFeld[z][s]=(rand()%49)+1;
                                        // gueltig wird auf true gesetzt
                                        gueltig = true;
    
                                        // Alle vorhergehenden Zahlen überprüfen
                                        for(i=0; i<s; i++)
                                          {
                                                 // Prüfung auf doppelten Eintrag
                                                 if(LottoFeld[z][i]==LottoFeld[z][s])
                                                   {
                                                      // Wenn doppelt, Abbruch und neu ziehen
                                                      gueltig = false;
                                                      break;
                                                   }
                                          };
                            }
    
                   };
          };
    
          // Ausgabe
          for(z=0; z<=9; z++)
            {
                   for(s=0; s<=5; s++)
                     {
                            cout << "  " << LottoFeld[z][s] << "\t";
                     };
                   cout << "\n";
            };
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Vielen Dank im Voraus! 🙂



  • Du hast eine der kompliziertesten Varienten für die Ziehung von Lottozahlen programmiert (Tip: Wenn Du es machst, wie es beim richtigen Lotto gemacht wird, ist es viel einfacher). Dann solltest Du eigentlich dan Sortieralgorithmus auch noch hinbekommen.



  • Das Semikolon nach den for-Schleifen könntest du entfernen, oder kenn ich da was noch nicht?^^



  • Ich weiß, dass es kompliziert ist 😃

    Der Lottozahlengenerator an sich ist eine vorgefertigte Version von meinem Lehrer, die wir gemeinsam erarbeitet haben. (Der hat selber keinen Plan von dem Zeugs hab ich manchmal das Gefühl.. Siehe Semikolon nach den for-Schleifen).

    Ich würde theoretisch auch das Bubble-Sort nehmen, oder gar einen ganz anderen Lottozahlengenerator.. Aber naja, er hat gesagt es soll Selection Sort sein.

    Nur habe ich kP davon wie ich das da einbauen soll.. 😞



  • #include <cstdlib>
    #include <iostream>
    #include <time.h>
    
    using namespace std;
    
    int main()
    {
        // Deklaration
        int LottoFeld[10][6];
        int z;
        int s;
        int i;
        bool gueltig;
    
        srand(time (NULL));
    
        // Anzahl der Ziehungen
        for(z=0; z<=9; z++)
        {
            //der Generator, wie gehabt...
        };
    
        //hier wuede ich sortieren.
    
        // Ausgabe
        for(z=0; z<=9; z++)
        {
            for(s=0; s<=5; s++)
            {
                cout << "  " << LottoFeld[z][s] << "\t";
            };
            cout << "\n";
        };
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Selection Sort geht so. Damit Du das umsetzen kannst, musst Du schon verstehen, was ihr das "zusammen" programmiert habt.
    Ich Hinsicht darauf, dass Du vermutlich irgendwann mal einen Test zum Thema Programmieren schreiben musst, solltest Du es erstmal selbst versuchen, und dann bei weiteren Problemen noch einmal hier fragen.



  • Mir war in der Vorlesung gerade langweilig:

    void selection_sort( int data[], const size_t data_len )
    {
    	for ( size_t i = 0; i < data_len; ++i ) // Beginne von links durchs Array zu laufen
    	{
    		size_t min_index = i; // Index des minimalen Elements (>= i)
    		for ( size_t j = i + 1; j < data_len; ++j ) // Durchlaufe das Array von links ab index i + 1
    			if ( data[j] < data[min_index] ) // Kleineres Element als data[max_index] gefunden
    				min_index = j;
    		if ( i != min_index ) // Falls ein kleineres Element gefunden wurde
    			std::swap( data[i], data[min_index]);
    	}
    }
    

    Ich habs in 5 Minuten programmiert und nicht getestet (es koennte also noch Fehler drin haben). Es soll dir aber eine Idee geben, wie man das in C++ umsetzen kann.

    PS:
    Du solltest besser std::vector verwenden als rohe Arrays.



  • Komme grad voll nicht drauf klar, wie ich das da einbauen soll 😞 😕



  • [gelöschter Senf]



  • Deniska93 schrieb:

    Komme grad voll nicht drauf klar, wie ich das da einbauen soll 😞 😕

    Versuchs doch einfach mal, und frage dann.

    @icarus2: Es wäre besser gewesen, wenn er es erstmal selbst versucht hätte. So bringt es Ihm, wie Du siehst, kein Stück weiter.



  • Tachyon schrieb:

    @icarus2: Es wäre besser gewesen, wenn er es erstmal selbst versucht hätte. So bringt es Ihm, wie Du siehst, kein Stück weiter.

    Ja, stimmt schon. Mach ich normalerweise auch nicht.

    @Deniska93:
    Weisst du ueberhaupt wie Selection Sort funktioniert? Also koenntest du den Algorithmus auf einem Blatt Papier ausfuehren?
    Wenn man das kann, sollte man normalerweise den Algorithmus auch implementieren koennen.



  • Man nimmt das kleinste Element aus dem gesamten array und stellt es nach vorne und verkleinert das array dann um 1. und dann sucht man wieder das kleinste aus dem array und dann ans ende von dem vorderen array.

    So verstehe ich das Selection Sort.

    Aber implementieren.. steh grad einfach nur aufm Schlauch, ist nicht mein Tag glaub ich .. 😕



  • Versuch es einfach mal. Zeichne dir ein Array auf ein Blatt, ueberlege wie du es von Hand machst und dazu versuchst du den Algorithmus zu implementieren.

    Wichtig ist, dass du es einfach einmal selber versuchst. Wenn es dann nicht klappt, dann poste deinen Code und wir koennen dir konkret weiterhelfen.



  • icarus2 schrieb:

    Mir war in der Vorlesung gerade langweilig:

    .. und ich warte gerade auf das Ende meines Builds

    Deniska93 schrieb:

    Komme grad voll nicht drauf klar, wie ich das da einbauen soll 😞 😕

    So:

    #include <cstdlib>
    #include <iostream>
    #include <ctime> // time
    #include <algorithm> // min_element, iter_swap
    
    template< typename I >
    void selection_sort( I first, I last )
    {
        for( ; first != last; ++first )
            std::iter_swap( first, std::min_element( first, last ) ); // tausche das erste Element mit dem kleinsten Element
    }
    
    using namespace std;
    
    int main()
    {
        // Deklaration
        int LottoFeld[10][6];
        int z;
        int s;
        int i;
        bool gueltig;
    
        srand(time (NULL));
    
        // Anzahl der Ziehungen
        for(z=0; z<=9; z++)
        {
            // Anzahl der Zahlen
            for(s=0; s<=5; s++)
            {
                // Hilfsvariable für die Gültigkeitsprüfung
                gueltig = false;
                // Gültigkeitsprüfung
                while(gueltig == false)
                {
                    // Ziehung der Zufallszahl
                    LottoFeld[z][s]=(rand()%49)+1;
                    // gueltig wird auf true gesetzt
                    gueltig = true;
    
                    // Alle vorhergehenden Zahlen überprüfen
                    for(i=0; i<s; i++)
                    {
                        // Prüfung auf doppelten Eintrag
                        if(LottoFeld[z][i]==LottoFeld[z][s])
                        {
                            // Wenn doppelt, Abbruch und neu ziehen
                            gueltig = false;
                            break;
                        }
                    }
                }
            }
            selection_sort( LottoFeld[z], LottoFeld[z] + 6 ); // <== hier kommt's hin
        };
    
        // Ausgabe
        for(z=0; z<=9; z++)
        {
            for(s=0; s<=5; s++)
            {
                cout << "  " << LottoFeld[z][s] << "\t";
            };
            cout << "\n";
        };
        cin.get();
        return 0;
    }
    

    Gruß
    Werner


Log in to reply