Bubblesort



  • so.. soll für die schule ein bubble sort programmieren..

    habs das jetzt soweit:

    #include <stdio.h>
    #include <stdbool.h>
    #include <conio.h>
    #include <ctype.h>
    
    int main() {
        bool x=false;
        int c=1, k=c+1, zahl[6]={0};
    
        system("color 0a");
        system("cls");
    
        printf("Setze 5 Beliebige Zahlen ein (nach Jeder Zahl -> Enter): \n\n");
    
        for(c=1; c<=5; c++) scanf("%i",&zahl[c]);                                   // Eingabe der zahlen
    
        system("cls");
        printf("Zahlen unsortiert: %i %i %i %i %i\n", zahl[1],zahl[2],zahl[3],zahl[4],zahl[5]);
        system("pause");
    
        do {                                                                        //bubblesort
            c=1;
            k=c+1;
            x=false;
    
            while (c<5) if( zahl[c]>zahl[k] ) {                                     //
    
                      zahl[0]=zahl[c];
                      zahl[c]=zahl[k];
                      zahl[k]=zahl[0];
                      x=true;
                      c++;
                      k=c+1;
    
            }          
    
        } while(x=true);
    
        system("cls");
        printf("\nZahlen sortiert: %i %i %i %i %i",zahl[1], zahl[2], zahl[3], zahl[4], zahl[5]);
    
        getch();
    }
    

    Problem ist: bei der do while schleife gibts ein problem. mein compiler (devcpp) sagt da auch nix zu.. der sagt nichts mehr nach "Drücken sie Enter um fortzufahren.
    hab nach k=c+1 in zeile 34 auch mal einen testcounter eingebaut also testcount++; printf("%i",testcount); sowas halt.. der hat dann 1234 ausgegeben.. also mit adneren worten macht der die while(...)if(...) schleife einmal druch..

    kann mir wer helfen?



  • Wegen

    while(x=true);
    

    Du setzt x auf true und schaust dann nach, ob x ungleich Null ist. Es muss

    while(x==true);
    

    heißen.



  • sowas billiges.. danke schön ^^



  • habs geändert.. aber funktionieren tut es immernoch nicht x_x...
    anderen fehler erkannt?



  • yami schrieb:

    habs geändert.. aber funktionieren tut es immernoch nicht x_x...
    anderen fehler erkannt?

    Was tut es nicht? Sei mal genauer...

    P.S.: Warum meldest du dich nicht im Forum an.



  • Benutze einen Debugger oder printf() und lass dir die Werte ausgeben in jedem Schritt. Dann wirst du sehen, wann wo was falsch läuft.



  • bin angemeldet. war nur zu faul zum einloggen xD.

    also.. das problem ist das gleiche

    die ausgabe ist:
    Deine Zahlen: zahl zahl zahl zahl zahl
    Drücken sie etwas zum fortfahren (also system("pause"); )

    dannach schließt er das Fenster nicht aber macht auch nichts mehr...

    also... ich hab kp worans liegt.. ich probier das mal mit der zwischenausgabe

    edit:

    #include <stdio.h>
    #include <stdbool.h>
    #include <conio.h>
    #include <ctype.h>
    
    int main() {
        bool x=false;
        int c=1, k=0, zahl[6]={0};
    
        system("color 0a");
        system("cls");
    
        printf("Setze 5 Beliebige Zahlen ein (nach Jeder Zahl -> Enter): \n\n");
    
        for(c=1; c<=5; c++) scanf("%i",&zahl[c]);                                   // Eingabe der zahlen
    
        system("cls");
        printf("Zahlen unsortiert: %i %i %i %i %i\n", zahl[1],zahl[2],zahl[3],zahl[4],zahl[5]);
        system("pause");
    
        do {                                                                        //bubblesort
            c=1;
            k=c+1;
            x=false;
    
            while (c<5) if( zahl[c]>zahl[k] ) {                                     //vergleichen und neusetzen der zahl arrays
    
                      zahl[0]=zahl[c];                                              //zahl
                      zahl[c]=zahl[k];
                      zahl[k]=zahl[0];
                      printf("zahl[c]: %i, zahl[k]: %i\n",zahl[c],zahl[k]);
                      x=true;
                      c++;
                      k=c+1;
    
            }          
    
        } while(x==true);                                                            //ende bubblesort
    
        system("cls");
        printf("\nZahlen sortiert: %i %i %i %i %i",zahl[1], zahl[2], zahl[3], zahl[4], zahl[5]);
    
        getch();
    }
    

    so siehts mitlerweile aus.. aber die probe in zeile 32 geht garnicht auf...
    mein compiler ist devcpp.. mit TurboC hab ichs auch schon probiert... (aber der kennt stdbool.h schon garnicht)



  • Wenn die if-Bedingung in Zeile 20 nicht erfüllt ist, wird c nicht mehr erhöht. Das Programm hängt sich auf.



  • omg.. jetzt gehts.. aber ordnen tut der immernoch nicht richtig.. naja ich probiers mal weiter.. gegebenen falls schreib ich hier wieder rein ^^ danke



  • habs problem immernoch...

    ich wüsste wie ichs behebe aber hab ne frage obs einen Not ausdruck gibt

    also dass ers programm nur macht wenn zahl[1]<=zahl[2]<=zahl[3]<=zahl[4]<=zahl[5]
    nicht zutrifft..

    Edit:

    do {
            c=1;
            k=c+1;                                                                        //bubblesort
            x=false;
    
            while (c<5) {
    
                  if ( zahl[c]>zahl[k] ) {                                       //vergleichen und neusetzen der zahl arrays
    
                      zahl[0]=zahl[c];                                              //zahl[c] wird als zahl[0] zwischengespeichert
                      zahl[c]=zahl[k];                                              //zahl[k] also zahl[c+1] wird auf zahl[c] gesetzt
                      zahl[k]=zahl[0];                                              //zwischenspeicher wird dann wieder auf zahl[k] gesetzt > tausch beendet
                      x=true;
                      c++;
                      k=c+1;
                      printf("Zwischenspeicher: %i %i %i %i %i\n",zahl[1], zahl[2], zahl[3], zahl[4], zahl[5]);
                   }
    
                   else (c=6);  
    
            }
    
        } while(x==true);
    

    das ist halt die schleife... aber der macht das halt nur durch wenn die erste zahl größer die 2te ist.. wenn nicht dann hört der auf..
    weiss jemand ne gute lösung?



  • Statt dem

    else (c=6);
    

    würd ich mal

    else {c += 1 };
    

    versuchen. Schau dir nochmal den Bubble-Sort Algorithmus genau an...



  • den algorithmus kenn ich nicht direkt..

    ich weiss nur wie dieses tauschprinzip funktioniert.. unser lehrer is so einer der einem nix beibringt und einfach sagt "so zu montag macht ihr ein bubblesort programm. ihr habt internet. schaut nach was das ist.. tschüss"

    bzw: was bringt +=?



  • Das c wird um eins erhöht.

    Für den Algorithmus siehe [1]

    Dummerweise gibt es solche Lehrer...

    [1] http://de.wikipedia.org/wiki/Bubblesort#Formaler_Algorithmus



  • also ich habs nochmal umgeschrieben:

    do {
    
                  if  ( zahl[0]>zahl[1] || zahl[1]>zahl[2] || zahl[2]>zahl[3] || zahl[3]>zahl[4] || zahl[4]>zahl[5]  )  {   //vergleichen und neusetzen der zahl-arrays
    
                      for(c=1; c<5; c++) {
                               k=c+1;
                               if (zahl[c]>zahl[k]) {
    
                                                    zahl[0]=zahl[c];                                           //zahl[c] wird als zahl[0] zwischengespeichert
                                                    zahl[c]=zahl[k];                                           //zahl[k] also zahl[c+1] wird auf zahl[c] gesetzt
                                                    zahl[k]=zahl[0];                                           //zwischenspeicher wird dann wieder auf zahl[k] gesetzt > tausch beendet
                                                    printf("\nZwischenspeicher: %i %i %i %i %i",zahl[1], zahl[2], zahl[3], zahl[4], zahl[5]);
                               }
    
                      }
    
                  }
                  else x=false;
    
        } while(x==true);
    
        printf("\n\nZahlen sortiert: %i %i %i %i %i",zahl[1], zahl[2], zahl[3], zahl[4], zahl[5]);
        getch();
    

    das sind jez nur die schleifen. rest ist nur formelles zeug..

    aber der hängt sich wie am anfang auf.. Der letzte Zwischenspeicher ist dann halt = der endausgabe.. aber bis zu der Letzten ausgabe (Zahlen sortiert: ...)
    kommt der garnicht.. nach dem letzten zwischenspeicher hängt der sich auf x_x woran liegts?



  • So sollte es gehen

    #include <stdio.h>
    
    int main(int argc, char* argv[]) {
        int zahl[6] = {0, 3, 1, 99, 4, 2};
        int k;
        int tmp;
    
        int vertauscht = false;
        do {    
            vertauscht = false;
            for(int c=1; c<5; c++) {
    
                k=c+1;
                if (zahl[c]>zahl[k]) {
    
                    tmp=zahl[c];                                           //zahl[c] wird als zahl[0] zwischengespeichert
                    zahl[c]=zahl[k];                                           //zahl[k] also zahl[c+1] wird auf zahl[c] gesetzt
                    zahl[k]=tmp;                                           //zwischenspeicher wird dann wieder auf zahl[k] gesetzt > tausch beendet
    
                    vertauscht = true;
                }
    
            }
    
        } while(vertauscht == true);
    
        printf("\nZahlen sortiert: %i %i %i %i %i\n",zahl[1], zahl[2], zahl[3], zahl[4], zahl[5]); 
    
    }
    

    Vielleicht schaust du dir nochmal den Algorithmus auf Wikipedia an.

    Diese Abbruchbedingung hier

    if  ( zahl[0]>zahl[1] || zahl[1]>zahl[2] || zahl[2]>zahl[3] || zahl[3]>zahl[4] || zahl[4]>zahl[5]  )  {   //vergleichen und neusetzen der zahl-arrays
    

    Ist nicht korrekt. Das ist nämlich nicht die Bedinung, die gegeben sein muss, damit weiter sortiert wird.



  • wieder so ein fehler wo man sich hinter her denkt dass er banal ist..

    naja sorry dass ich soviele dumme fehler gemacht haeb xD danke!



  • YamiSparrow schrieb:

    wieder so ein fehler wo man sich hinter her denkt dass er banal ist..

    Versuch einfach draus zu lernen.

    YamiSparrow schrieb:

    naja sorry dass ich soviele dumme fehler gemacht haeb xD danke!

    Dafür musst du dich nicht entschuldigen. Wie gesagt, lern draus.

    Schönen Abend!


Anmelden zum Antworten