Bubblesort mit Funktion (C++)



  • Ich habe mir nochmal paar Tutorials auf Youtube dazu angesehen und ich glaube jetzt habe ich es. Musste für den zweiten Teil der Aufgabe noch zusätzlich einen Array der Länge 100 mit Zufallszahlen zwischen 1 und 100 befüllen und ihn ebenfalls sortieren lassen. Dazu musste ich in der Funktion bubblesort noch zusätzlich die Variable int length hinzufügen, damit ich eben mit verschiedenen Längen arbeiten kann. Zusätzlich musste ich am Ende das return c zu einem return c[0] ändern. Und in der main-Funktion musste ich zwei Abläufe vertauschen, damit es richtig abläuft.

    Hier der korrigierte Code:

    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    
    using namespace std;
    
    void swap(int *c1, int *c2);        //Deklaration der Funktionen swap und bubblesort
    
    int bubblesort(int c[], int length);
    
    int main() {
    	srand(time(0));     //Initialisierung des Zufallszahlengenerators
    	int z[10], i;       //Deklaration der benötigten Arrays und Integer
    	int zufall[100], j;
    
    	cout << "Bitte geben Sie 10 ganze Zahlen groesser gleich 0 ein:" << endl;       //Manuelle Eingabe des Arrays z mit zehn ganzen Zahlen
    	for(i=0; i<10; i++)
    	{
    		cout << "Bitte geben Sie die " << i+1 << ". Zahl ein" << endl;
    		cin >> z[i];
    	}
    	bubblesort(z, 10);      //Aufruf der Funktion bubblesort zum Sortieren des Arrays z und anschließende Ausgabe des sortierten Arrays
    	for(i=0; i<10; i++)
    	{
    		cout << z[i] << endl;
    	}
    	for(j=0; j<100; j++)        //Befüllen des Arrays zufall mit 100 Zufallszahlen
    	{
    		zufall[j]=rand()%100;
    	}
    	bubblesort(zufall, 100);        //Aufruf der Funktion bubblesort zum Sortieren des Arrays z und anschließende Ausgabe des sortierten Arrays
    	for(j=0; j<100; j++)
    	{
    		cout << zufall[j] << endl;
    	}
    
    	return 0;
    }
    
    void swap(int *c1, int *c2)     //Definition der in bubblesort verwendeten swap-Funktion zum Tauschen zweier Werte
    {
    	int t;
    	t=*c1;
    	*c1=*c2;
    	*c2=t;
    }
    
    int bubblesort(int c[], int length)     //Definition der Funktion bubblesort
    {
    	int j1, j2;     //Deklaration zweier Durchlaufindizees
    	for(j2=0; j2<length; j2++)      //Sortierung des Arrays der Laenge lenght innerhalb einer doppelten for-Schleife
    	{
    		for(j1=0; j1<length-j2; j1++)       //Verschiebung der größten Werte  im Array nach hinten, indem bei ungewünschter Reihenfolge swap zum Tauschen aufgerufen wird
    		{
    			if(c[j1]>c[j1+1])
    			{
    			swap(c[j1],c[j1+1]);
    			}
    		}
    	}
    	return c[0];        //Rückgabe des Arrayeintrags (in Form eines Pointers, da Array)
    }
    
    


  • @EinNutzer0 sagte in Bubblesort mit Funktion (C++):

    @DocShoe sagte in Bubblesort mit Funktion (C++):

    wenn nix getauscht wurde biste fertig.

    ja siehe b

    Ups 😉



  • @EJason sagte in Bubblesort mit Funktion (C++):

    das return c zu einem return c[0] ändern

    Warum gibt die Funktion das erste Arrayelement zurück?



  • @manni66 sagte in Bubblesort mit Funktion (C++):

    Warum gibt die Funktion das erste Arrayelement zurück?

    Weil er nicht weiß was er tut. "Tutorials" auf YouTube und trial & error. Wird schon passen.



  • @EJason sagte in Bubblesort mit Funktion (C++):

    #include <stdlib.h>
    #include <time.h>
    
    using namespace std;
    

    lol



  • @Swordfish
    Ja, ich muss ehrlicherweise zugeben, dass ich das mit den Pointern noch nicht so gut verstanden habe. Kennst du vielleicht eine Website, ein Video oder sonstiges Lehrmaterial, die dieses Thema gut erklären? Ich will mich dieses Wochenende intensiver mit meinen Wissenslücken befassen. Die obige Aufgabe musste ich nämlich noch heute abgeben und deswegen war ich etwas in Eile und Panik 😅



  • @EJason sagte in Bubblesort mit Funktion (C++):

    Kennst du vielleicht eine Website, ein Video oder sonstiges Lehrmaterial

    "C++ Primer" oder "Der C++ Programmierer" ... das sind so ausgedruckte und gebundene Webseiten (Tutorials).



  • @Swordfish sagte in Bubblesort mit Funktion (C++):

    @EJason sagte in Bubblesort mit Funktion (C++):

    Kennst du vielleicht eine Website, ein Video oder sonstiges Lehrmaterial

    "C++ Primer" oder "Der C++ Programmierer" ... das sind so ausgedruckte und gebundene Webseiten (Tutorials).

    Made my day 😄



  • @Swordfish sagte in Bubblesort mit Funktion (C++):

    @EJason sagte in Bubblesort mit Funktion (C++):

    #include <stdlib.h>
    #include <time.h>
    
    using namespace std;
    

    lol

    Naja, das ganze Zitat wäre

    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    
    using namespace std;
    

    gewesen.



  • @DocShoe Das lol bezog sich auf die C Header in Kombination mit namespace std.

    @DocShoe sagte in Bubblesort mit Funktion (C++):

    [...] das ganze Zitat [...]

    ich kann nichts dafür daß man keine Base für die Zeilennummern angeben kann.



  • @Swordfish
    Ja, eben, für #include <stdlib.h> und #include <time.h> ist das using namespace std; unsinnig und sorgt für Compilerfehler, weil der namespace unbekannt ist. Mit #include <iostream> wird das sinnvoll.
    Bin heute vllt etwas kleinkariert.



  • @DocShoe sagte in Bubblesort mit Funktion (C++):

    @Swordfish
    Ja, eben, für #include <stdlib.h> und #include <time.h> ist das using namespace std; unsinnig und sorgt für Compilerfehler, weil der namespace unbekannt ist. Mit #include <iostream> wird das sinnvoll.
    Bin heute vllt etwas kleinkariert.

    Ich glaube, der Punkt ist doch eher, dass die beiden Header auf C (nicht C++) hindeuten und using namespace std auch eher ein Antipattern ist (zumindest wenn global eingesetzt). Lediglich am #include <iostream> gibt es nichts zu kritisieren.

    @EJason Das ist aber im Wesentlichen wieder das altbekannte Problem, dass du vermutlich gerade eine Mischung aus C und C++ lernst. Viele "C++-Tutorials" sind eigentlich (schlechte) C-Tutorials, die dann noch zusätzlich "iostream" und somit cin/cout verwenden. In C++ würdest du zum Beispiel auch std::swap verwenden können - das, wenn du dir die Doku anguckst, jeweils Referenzen statt Pointer nimmt. Es ist also sehr fraglich, was du hier lernst. Auf jeden Fall kein idiomatisches C++.



  • @EJason sagte in Bubblesort mit Funktion (C++):

    @Swordfish
    Ja, ich muss ehrlicherweise zugeben, dass ich das mit den Pointern noch nicht so gut verstanden habe. Kennst du vielleicht eine Website, ein Video oder sonstiges Lehrmaterial, die dieses Thema gut erklären?

    @Swordfish sagte in Bubblesort mit Funktion (C++):

    "C++ Primer" oder "Der C++ Programmierer" ... das sind so ausgedruckte und gebundene Webseiten (Tutorials).

    Die Reihe hier fand ich gar nicht so schlecht:
    [C++ von { bis }] 6 - Zeiger
    (nur mal eine Folge als passendes Beispiel)



  • @zeropage
    Ja, der hat mir auch gut gefallen, zumindest die Sachen, die ich gesehen habe.



  • @DocShoe @wob Die beiden zitierten Header gibt es auch in C++. Aber die heißen geringfügig anders und packen ihr Zeugs auch nach std. Das war mein Punkt.


  • Gesperrt

    Hier wär die C++-Variante (ohne das Einlesen, vielleicht ginge es noch einfacher):

    #include <cstdlib>
    #include <iostream>
    
    size_t bs(const size_t len, int *const a)
    {
        size_t i, j;
        bool conti = true;
        for (i = 0; conti; i++)
        {
            conti = false;
            for (j = 0; j < len - 1 - i; j++)
            {
                if (a[j] > a[j + 1])
                {
                    conti = true;
                    std::swap(a[j], a[j + 1]);
                }
            }
        }
        return i;
    }
    
    int main(int argc, char **argv)
    {
        int a[][5] = {{1, 2, 3, 4, 5}, {5, 4, 3, 2, 1}};
        size_t len = sizeof(a[0]) / sizeof(int);
    
        std::cout << bs(len, a[0]) << std::endl;
        for (int i : a[0])
        {
            std::cout << i << ", ";
        }
        std::cout << std::endl;
    
        std::cout << bs(len, a[1]) << std::endl;
        for (int i : a[1])
        {
            std::cout << i << ", ";
        }
        std::cout << std::endl;
    
        return EXIT_SUCCESS;
    }
    

    Edit: Und noch eine generische Variante:

    #include <cstdlib>
    #include <iostream>
    #include <functional>
    
    template <class T>
    size_t bs(const size_t len, T *const a, const std::function<bool(const T &, const T &)> c)
    {
        size_t i, j;
        bool conti = true;
        for (i = 0; conti; i++)
        {
            conti = false;
            for (j = 0; j < len - 1 - i; j++)
            {
                if (c(a[j], a[j + 1]))
                {
                    conti = true;
                    std::swap(a[j], a[j + 1]);
                }
            }
        }
        return i;
    }
    
    int main(int argc, char **argv)
    {
        float a[2][5];
        size_t len = sizeof(a[0]) / sizeof(int);
        auto compare = [](float x, float y) -> bool { return x > y; };
        for (size_t i = 0; i < 2; i++)
        {
            for (size_t j = 0; j < len; j++)
            {
                a[i][j] = rand() % 20;
            }
        }
    
        std::cout << bs<float>(len, a[0], compare) << std::endl;
        for (int i : a[0])
        {
            std::cout << i << ", ";
        }
        std::cout << std::endl;
    
        std::cout << bs<float>(len, a[1], compare) << std::endl;
        for (int i : a[1])
        {
            std::cout << i << ", ";
        }
        std::cout << std::endl;
    
        return EXIT_SUCCESS;
    }
    


  • @EJason sagte in Bubblesort mit Funktion (C++):

    Kennst du vielleicht eine Website, ein Video oder sonstiges Lehrmaterial, die dieses Thema gut erklären?

    Was ich Dir vorher durch die Blume sagen wollte bringt @hustbaer hier gut auf den Punkt:

    @hustbaer sagte in Anfänger - Programm funktioniert, aber....:

    C++ ist halt ne ziemliche Sau, da stimme ich @Mechanics voll zu. Gründe dafür gibt es einige. Der ganze ranzige Legacy-Kram der von C übernommen wurde, [...]
    Eines der grossen Probleme dabei ist dass du in C++ so viele Dinge machen kannst die "funktionieren" (bzw. zu funktionieren scheinen), aber totaler Quatsch sind oder sogar einfach nur falsch. Schlimmer noch: Viele Tutorials sind von Anfängern oder Stümpern geschrieben und bis zum Rand voll mit Fehlern. Dummerweise kannst du als Anfänger das aber nicht riechen.



  • @EinNutzer0 Würdest Du Anti-Patterns vielleicht einmal bleiben lassen? stdout ist so gut wie überall line-buffered. Die ganzen std::endl sind sowas für die Katz' - ein stinknormales Newline tuts auch. Das return EXIT_SUCCESS ist sowas von unnötig. Dann schreibst Du noch explizit C++ und machst dann

    @EinNutzer0 sagte in Bubblesort mit Funktion (C++):

        size_t i, j;
    

    wozu?? Lass das!

    Wenn Du sowieso schon ein Template schreibst, dann lass std::function sein. Und in neuem Code für Noobs West-side-const zu verwenden ist auch ...

    </rant>


  • Gesperrt

    @Swordfish sagte in Bubblesort mit Funktion (C++):

    Wenn Du sowieso schon ein Template schreibst, dann lass std::function sein

    Da tritt leider ein Problem auf...

    Ich kann zwar template <class T, typename Comparator> schreiben, aber dann wäre die Typsicherheit nicht mehr gegeben.

    Bleib doch mal sachlich mit deiner Kritik...



  • @EinNutzer0 sagte in Bubblesort mit Funktion (C++):

    Typsicherheit

    ist in diesem Kontext eine eher unkonventionelle Aussage.

    @EinNutzer0 sagte in Bubblesort mit Funktion (C++):

    Bleib doch mal sachlich mit deiner Kritik...

    Wo war ich unsachlitsch?