Verstehe Schleife nicht



  • Hi, ich versuche die Schleife zu verstehen weshalb ich die couts in den Code gemacht habe. Könnt ihr den bitte bitte versuchen? Ich Frage mich ob die Ausgabe alles wiederspiegelt bzw Ausgaben aus irgendwelchen Gründen fehlen. Ich schätze halt ja aber kein Plan.

    #include <iostream>
    
    using namespace std;
    
    int main () {
    	
    	const int n = 10;
    	int liste[n] = { 2, 7, 5, 90, 6, 51, 38, 54, 1, 100 } ;
    	
    	for (int i = 0 ; i < n; ++i) 
    		{
    			for (int j = 9 ;  j > i ; --j)
    			{		
    				if (liste[j] < liste[j-1])
    				{
    		    		int temp = liste[j];
        				liste[j] = liste[j-1];
    	    			liste[j-1] = temp;
    	    			
    	    	    			cout << "\t\tj = " << j << flush << endl;							
    	    		}
    	    					cout << "\ti = "<< i << flush << endl;
        		}    		
        	}
    	cout << endl << endl;
    	for (int i = 0; i < n; i++) {
    		cout << liste[i] << endl;
    	}
    }
    


  • naja du könntest noch nach jedem durchgang alle elemente ausgeben, oder was willst du fragen?



  • @ycbm sagte in Verstehe Schleife nicht:

    << flush << endl;

    Das endl beinhaltet schon das flush. Das ist der Unterschied zum '\n'



  • Eigentlich willst du doch nur sortieren. Damit du nicht denkst, dass C++ kompliziert sein muss, kannst du deinen Code zusammenschrumpfen auf:

    #include <algorithm>
    #include <iostream>
    
    int main(int argc, char **argv) {
        int liste[] = { 2, 7, 5, 90, 6, 51, 38, 54, 1, 100 };
        std::sort(std::begin(liste), std::end(liste));
        for (const auto &wert : liste)
            std::cout << wert << '\n';
    }
    

    Vorteil: man sieht sofort, was genau passiert.
    Nachteil: damit lernst du nicht, wie Bubblesort funktioniert 🙂

    Dennoch noch eine Anmerkung: Ich finde den Bezeichner "liste" für das Array mäßig gut gelungen. Was sind das für Werte? Eine Liste im C++-Sinne ist es nicht (unter Liste versteht man in C++ meistens std::list, also doppelt verkettete Listen).

    Außerdem brauchst du die Größe des Arrays nicht extra anzugeben, die findet der Compiler selbständig heraus, wenn du die Zahl in den eckigen Klammern weglässt.

    Außerdem kann man überlegen, ob nicht ein std::array schöner wäre oder du gleich einen std::vector nehmen solltest (den brauchst du, wenn die Anzahl der Zahlen erst zur Laufeit ermittelt werden kann).

    Zu dem Endl und Flush hier noch mal ein Video mit Erklärungen: https://www.youtube.com/watch?v=GMqQOEZYVJQ
    Generell muss man sehr selten von Hand flushen.



  • so könnte ein naiver bubblesort aussehen:

    #include <iostream>
    
    int swap(int *liste, int size)
    {
        int swaps = 0;
        for (int s = 1; s < size; s++)
        {
            if (liste[s] < liste[s - 1])
            {
                swaps++;
                int tmp = liste[s];
                liste[s] = liste[s - 1];
                liste[s - 1] = tmp;
            }
        }
        return swaps;
    }
    
    int main()
    {
        int liste[] = { 2, 7, 5, 90, 6, 51, 38, 54, 1, 100 };
        int size = sizeof(liste) / sizeof(int);
    
        do; while (swap(liste, size) != 0);
    
        for (int i = 0; i < size; i++)
        {
            std::cout << liste[i] << ' ';
        }
    }
    
    


  • @Wade1234
    Wenn ich den Code starte kommen 45 "i" couts und bei "j" nur 15. Mir kommt die Ausgabe unvollständig vor, ist sies..?



  • Hast du die Ausgaben vllt. an falscher Stelle hingeschrieben (durch die eigenartige Einrückung auf Anhieb nicht gut zu erkennen)?
    j gibst du nur innerhalb des Tausch-Blocks aus und i jedesmal danach (aber noch innerhalb der j-Schleife)!



  • @ycbm ja weil j im in der verzweigung und i in der inneren schleife ausgegeben wird. kurz: du hast eine klammer falsch gesetzt.


Anmelden zum Antworten