Dauerschleife? Warum?



  • hmm.. also um ehrlich zu sein kann ich das Problem nicht weiter einschränken, denn mein Compiler gibt a.) keine Fehlermeldung aus und das Programm läuft b.) nur bis Anzahl == 2.



  • Ich hab dein Beispiel mal kompiliert, und weis immer noch nicht was du genau möchtest. Fragen wir mal so: WELCHE Schleife läuft nur bis zwei ?!

    Ein kleiner Tipp, vielleicht bringt es dann die gewünschte Lösung: Setze mal für die erste for Schleife geschweifte Klammern, und du wirst merken, dass sie aufeinmal zählt ;). Die ist doch völlig offen, im Gegensatz zur zweiten, da hast du es richtig gemacht.

    MfG mikey.



  • Hmm, nein, das ist es lieder nicht (ich habe es sogar mal so gelernt, dass man, wenn man innerhalb einer For-Schleife nur einen Befehl ausführt, man keine Klammern benötigt). Die erste For-Schleife dient also dazu, dass in dem Array Zahlen1 1,2,3,4,5 usw steht.
    also ->

    for(k=0;k<anzahl;k++)
    	{zahlen[k]=(k+1);}
    

    Wie auch immer. Mein Anliegen ist folgendes:

    Ich will, dass das Array, welches VOR der zweiten Schleife streng geordnet ist
    Zahlen[0] = 1
    Zahlen[1] = 2
    Zahlen[2] = 3
    Zahlen[3] = 4
    ...
    nach der zweiten Schleife ungeordnet ist,
    z.B.
    Zahlen2[0] = 2
    Zahlen2[1] = 4
    Zahlen2[2] = 3
    Zahlen2[3] = 1

    allerdings soll keine Zahl doppelt vorhanden sein.

    Und das geht nur, solange Anzahl == 2 ist, für Anzahl == 3 hängt es sich auf (Dauerschleife)

    Danke schonmal.



  • std::random_shuffle() wäre wohl nicht ganz angebracht?



  • der Verweiss auf die STD ist zwar manchmal sehr gut. Aber viele Dinge programmiert man ja um ein grundverständnis für eben solche Containerklassen zu bekommen. Ich errinnere mich noch an Algorithmen und Datenstrukturen wo wir eigene Hashmaps sowie Suchbäume gebaut haben oder auch Stacks etc. Obwohl es dafür schon genügend dinge gibt.

    Aber zur eigentlichen fragen.
    Was genau soll deine zweite schleife erzielen? Ein zufälliges mischen würde ich damit erzielen das ich von 0 - Anzahl laufe.... eine zufallszahl <= anzahl ziehe und das element mit dem an der zufälligen position tausche. Ist zwar nicht das non plus ultra an zufälligkeit. Aber es wäre ein ansatz.

    schnelles pseudo C++ beispiel

    for ( int i = 0; i < anzahl; ++i)
    {
        swapField = rand() % anzahl;
        int cur = feld[i];
        feld[i] = feld[swapField];
        delf[swapField] = cur;
    }
    

    da du beim erzeugen der zahlen schon gesichert hast das keine doppelt vorhanden ist passiert das hier ja auch nicht.



  • Hi,

    erstmal Danke für die Antworten.

    Also erstmal.. ich bin C++ Anfänger (relativ). Habs nur dieses Sem. gehabt und auch nur zwei Semesterwochenstunden (also praktisch garnicht).

    Meine Idee war folgende:

    Ich habe das geordnete Array. Nun Schreibe ich das in ein neues Array eine beliebige Zahl an die nullte Position, welche ein Element aus dem ersten Array ist. Die entsprechende Zahl wird aus der alten Liste gelöscht.

    Nun suche ich mir erneut eine zufällige Zahl.

    Nun überprüfe ich, ob in dem alten Array an entsprechender Position (zahl-1) noch eine Zahl steht (dieses Element also noch nicht in der NEUEN Liste vorhanden ist), oder ob eine Null drinnen steht (das Element also bereits in der neuen Liste vorhanden ist).

    Den letzten Schritt führt man solange durch, bis nur noch Nullen in dem ersten Array stehen.

    Es gibt sicherlich elegantere Möglichkeiten.

    Meine Möglichkeit ging nicht, weil der Zufallsgenerator garnicht so zufüllige Zahlen mir würfelt 😞

    Habe nun des Quelltext etwas abgeändert, und nun funktioniert es.

    (Habe die Funktion bereits ins Hauptprogramm integriert, der Funktion wird das geordnete Array bereits übergeben)

    [cpp]void zufall(int zahlen[],int anzahl)
    {

    int k;
    int start;
    int zahlen2[anzahl];

    srand(time(NULL));
    start = rand() % anzahl;

    zahlen2[0]=start;
    zahlen[(start-1)]=0;

    int test=0;
    for(k=1;k<anzahl;k++)

    {
    srand(start);
    start = rand() % anzahl;

    if(zahlen[(start-1)]==0)
    {
    k=k-1;
    test=test+1233; }

    else
    {
    test=0;
    zahlen2[k]=start;
    zahlen[(start-1)]=0;
    }

    start=start+test;

    }

    for(k=0;k<anzahl;k++)
    zahlen[k]=zahlen2[k];

    }

    [/cpp]

    So wirklich zufällig sind die Zahlen zwar immer noch nicht, aber es langt für meine Bedürfnisse.

    Gruß

    p.s.: Was ist die Random(shuffle) funktion??



  • void zufall(int zahlen[],int anzahl) 
    { 
    
    int k;
    int start;
    int zahlen2[anzahl];
    
        srand(time(NULL));
        start = rand() % anzahl;
    
    	zahlen2[0]=start;
    	zahlen[(start-1)]=0;
    
    int test=0;
    for(k=1;k<anzahl;k++)
    
    	{
    	srand(start);
    	start = rand() % anzahl;
    
    	if(zahlen[(start-1)]==0)
    		{
    		k=k-1;
    		test=test+1233;
    		}
    
    	else
    		{
    		test=0;
    		zahlen2[k]=start;
    		zahlen[(start-1)]=0;
    		}
    
    	start=start+test;
    
    	}
    
    for(k=0;k<anzahl;k++)
    	zahlen[k]=zahlen2[k];
    
    }
    


  • Die Dauerschleife entsteht dadurch, dass Du 'k' immer dekrementierst, sobald keine Zahl !=0 gefunden wird. Und dass ist spätestens dann der Fall, wenn zahlen2 gefüllt und zahlen[] mit 0'en überschrieben wird.
    .. und es sucht ewig nach einer Zahl!=0

    BTW. das srand in der for-SChleife ist überflüssig, bzw. sogar falsch und es muss wohl zahlen[start] statt start-1 heißen.

    Gruß
    Werner



  • Werner Salomon schrieb:

    Die Dauerschleife entsteht dadurch, dass Du 'k' immer dekrementierst, sobald keine Zahl !=0 gefunden wird. Und dass ist spätestens dann der Fall, wenn zahlen2 gefüllt und zahlen[] mit 0'en überschrieben wird.
    .. und es sucht ewig nach einer Zahl!=0

    BTW. das srand in der for-SChleife ist überflüssig, bzw. sogar falsch und es muss wohl zahlen[start] statt start-1 heißen.

    Gruß
    Werner

    Und warum geht dann das Programm, nachdem ich die Variable TEST eingebaut habe??



  • void zufall(int zahlen[],int anzahl) 
    { 
    
    int k; 
    int start; 
    int zahlen2[anzahl];
    

    Äh, sorry, aber das geht in C++ garnicht. In C ja, in C++ nein.
    Würde mich interessieren welcher Compiler das ist dass der das frisst...


Anmelden zum Antworten