Kann Suchalgorithmus nicht ganz nachvollziehen:



  • Hallo zusammen,

    ich habe hier ein Programm, in dem mehrere Arrays statisch mit Städtenamen gefüllt werden. (durcheinander). Die Reihenfolge wird dann einmal mit showarray(); angezeigt und dann in sortarray(); AUFSTEIGEND sortiert und danach wieder ausgebenen. Habe Probleme mit dem Verständnis der Funktion Sortarray(); Ich kommentiere mal das, was ich vertstanden habe und stelle meine Frage unter dem Code!

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    
    void fillarray();
    void showarray();
    void sortarray();
    int exchange(int i, int j);
    
    char a[5][15];
    
    main()
    {
    fillarray();
    showarray();
    sortarray();
    showarray();
    getch();
    }
    
    void fillarray()
    {
    strcpy(a[0],"Muenchen");
    strcpy(a[1],"Wismar");
    strcpy(a[2],"Luebeck");
    strcpy(a[3],"Wien");
    strcpy(a[4],"Daytona");
    
    }
    
    void showarray()
    {
    int i;
    for(i=0; i<=4; i++) printf("%s\n",a[i]);
    printf("\n");
    }
    
    void sortarray()
    {
    int i,ex;  
    
    do
    for (ex=1,i=0; i<=3; i++) //wieso ex=1? Das i ist für die Anzahl der Vergleichg, ok//
        if (strcmp(a[i],a[i+1])>0)  //Das i-te Element wird mit dem i+1' Element verglichen, wenn strcmp
        > 0 liefert, muss das Element vertauscht werden//
        ex=exchange(i,i+1); //die aktuell zu vergleichende Elemente werden der Funktion Exchange übergeben//
    while (ex==0);
    }
    
    int exchange(int i,int j) 
    {
    char k[15];  //  Variable bzw. array zum zwischenspeichern vom Element i)
    strcpy(k,a[i]); strcpy(a[i],a[j]); strcpy(a[j],k); //Hier werden die Inhalte der Elemente letztendlich vertauscht//
    return(0);
    }
    

    Wozu dient das ex=1 in der For-Schleife in der Zuweisung und wozu das Return 0. Den Mechanismus hab ich noch nicht ganz begriffen. Also wie kommt es zur Abbruchbedingung bei (while=0)??

    Würde mich über Hilfe freuen.



  • Auf den ersten Blick sieht das nach einem klassischen BubbleSort aus (damit du etwas zu suchen hast für das genaue Vorgehen).

    ex wird am Anfang der Schleife auf 1 gesetzt und beim ersten Vertauschen in der Schleife zurückgesetzt auf 0. Wenn ex am Ende der for()-Schleife immer noch auf 1 steht, mußtest du nichts vertauschen, d.h. alle Werte stehen in der richtigen Reihenfolge - und an dieser Stelle schlägt die Abbruchbedingung der while()-Schleife zu und beendet das Sortieren.

    (PS: Zu deiner Ehrenrettung - der Aufbau geht schon stark in die Richtung "wie produtiere ich möglichst unverständlichen Code" :D)



  • Hi

    ex=1
    

    wird gesetzt, damit die while-Schleife abgebrochen werden kann. Sobald das
    Array komplett sortiert ist, das ist dann der Fall, wenn einmal komplett über
    das Array gelaufen wurde und kein exchange aufgerufen wurde, bricht die do
    while Schleife ab. Bei jedem Durchlauf des Arrays wird diese Variable neu
    initialisiert und beim Aufruf von exchange auf 0 gesetzt.

    Ich hoffe, das beantwortet dir deine Fragen.

    Gruß mcr



  • OK sorry, das der Code vielleicht nicht optimal dargestellt ist. Das es ein Bubble Sort ist, war mir schon bewusst und weiss ja auch wie der in Theorie funktioniert. Hier halt in C umgesetzt.
    Etwas klarer ist es mir schon. Daher die Schleife wird solange durchlaufen bis ex=0??? Das Return(0) wird also an "ex"? Woraus ist das denn ersichtlich? Das ist mir noch nicht so ganz klar. Als Rückgabewert wurde ja ein int deklariert. Aber woher weiß der Computer das dieser Rückgabewert der variablen "ex" zugewiesen wird?



  • Das weiß er aus der Tatsache, daß in der for()-Schleife ein "ex=exchange(i,i+1);" steht - auf Deutsch: In die Variable ex wird der Wert eingetragen, den die Funktion exchange() (über "return") ausgespuckt hat.



  • OK sorry, das der Code vielleicht nicht optimal dargestellt ist. Das es ein Bubble Sort ist, war mir schon bewusst und weiss ja auch wie der in Theorie funktioniert. Hier halt in C umgesetzt.
    Etwas klarer ist es mir schon. Daher die Schleife wird solange durchlaufen bis ex=0??? Das Return(0) wird also an "ex"? Woraus ist das denn ersichtlich? Das ist mir noch nicht so ganz klar. Als Rückgabewert wurde ja ein int deklariert. Aber woher weiß der Computer das dieser Rückgabewert der variablen "ex" zugewiesen wird?



  • ragnar79 schrieb:

    Aber woher weiß der Computer das dieser Rückgabewert der variablen "ex" zugewiesen wird?

    Aus der Zeile 47.
    Aber das ist so ziemlich die gruseligste Bubblesort 😮 , die ich je gesehen habe.



  • Ok jetzt hab ich alles verstanden. Der Code ist von meinem Prof :=)

    Danke danke, ihr seid super vorallem superschnell 🙂


Log in to reply