EinlesenSortierenAusgeben



  • Hallo,

    Ich wollte ein simples Programm schreiben das maximal 1000 Zahlen einliest, mit Bubble-S Algorithmus sortiert und danach wieder ausgibt.

    Leider sortiert er nicht richtig und gibt zwischen den zahlen irgendwelche großen negativen zahlen aus. Ich kann mir das nicht erklären, vielleicht könnt ihr mal kurz drüberschauen hätte das gerne endlich gelöst.

    Hab das Array verkleinert um fehler zu finden eigentlich steht 1000 drin.

    Danke schon mal im vorrauss.

    Code C++

    using namespace std;
    #include <iostream>
    
    int main () {
    
    size_t dim(5); int sort[dim];//size_t count(0);
    
    //Einlesen
    cout << "Bitte eine ganze Zahl eingeben max. 1000, ende mit STRG-D" << endl;
    size_t i(0);
    for (;i<dim && cin; ++i){
      cin >> sort[i];
      //++count;
    }
    if (!(i==dim || cin.eof())) {
      cerr << "##Fehler" << endl; return 1;
    }
    
    //Sortieren mit Bubble-S. Algorithmus
    for (size_t i(0);i<dim;++i){
      for (size_t j(i+1); i<dim; ++i){
        if (sort[j] < sort[i]){
          int temp=sort[i];
          sort[i]=sort[j];
          sort[j]=temp;
         }
      }
    }
    
    cout << endl;
    
    //Ausgeben der Sortierten Zahlen
    for(size_t i(0);i<dim;++i){
      cout << sort[i] << ", " << endl;
    }
    
    return 0;
    }
    


  • sorry kollege, das ist aus meiner total ekliger code. keine ordentlichen einrückungen, keine guten variablen namen, alles zu stark zusammen gequetscht...

    solche konstrukto wie

    for (;i<dim && cin; ++i)
    

    würde ich auch sein lassen...

    ausserdem was machst du in zeile 15?

    zu deinem problem, das ist ganz klar. dein array ist komplett uninitialisiert, d.h. es stehen zufällige werte im speicher (bei mir öfters was bei -85 millionen)
    und die werte mischen sich unter deine eingaben. initialisier das gesamte array mal und versuchs dann nochmal (wobei die beste mgölichkeit wäre, nur soviele elemente zu betrachten wie eingegeben)



  • Gast307 schrieb:

    //Sortieren mit Bubble-S. Algorithmus
        for (size_t i(0);i<dim;++i){
            for (size_t j(i+1); i<dim; ++i){
    

    korrekter wäre hier

    //Sortieren mit Bubble-S. Algorithmus
        for (size_t i(0);i<dim-1;++i){ // dim-1, da i+1 noch ein gültiges Element sein muss
            for (size_t j(i+1); j<dim; ++j){ // Copy&paste Fehler i<->j
    

    wobei der Bubblesort ein wenig anders geht, aber obiges sollte auch funktionieren.

    ansonsten empfehle ich std::vector.



  • sorry das mein quellcode so erschreckt 😃

    Ich habe es auch mit werner-logoffs korrektur übernommen es klappt trotzdem nicht.
    Ich hab den code jetzt ein wenig verändert, doch es hilft immer noch nichts jetzt gibt er nur noch nullen aus!

    Logischer wiesse müsste das, wens nach mir geht, funkt., hat jemand noch eine idee, würde gerne heute noch das thema abhaken können, danke.

    using namespace std;
    #include <iostream>
    
    int main () {
    
    size_t const dim(1000); int sort[dim] = {0}; size_t count(0);
    
    //Einlesen
    cout << "Bitte eine ganze Zahl eingeben max. 1000, ende mit STRG-D" << endl;
    
    for (size_t i(0); i < dim && cin; ++i){
      cin >> sort[i];
      ++count;
    }
    
    //Sortieren mit Bubble-S. Algorithmus
    //for (size_t i(0); i < (dim-1); ++i){
      for (size_t j(0); j < (dim-1); ++j){
        if (sort[j] > sort[j+1]){
          int temp = sort[j];
          sort[j] = sort[j+1];
          sort[j+1] = temp;
         }
      }
    }
    
    cout << endl;
    
    //Ausgeben der Sortierten Zahlen
    for (size_t i(0); i < (count-1); ++i){
      cout << sort[i] << ", ";
    }
    cout << endl;
    return 0;
    }
    


  • Gast307 schrieb:

    sorry das mein quellcode so erschreckt 😃

    Er scheint auch dich zu erschrecken. So sehr, dass du in Zeile 25 nicht gemerkt hast, dass hier eine Klammer zu viel ist. Darum "klappt es auch nicht".

    Das mit den Nullen hat damit zu tun, dass du nicht den Bereich sortierst, der eingegeben wurde, sondern schlicht alle 1000 Einträge (die auf 0 sind).

    Also: Zeile 18 dim-1 durch count-2 ersetzen.

    Zu guter Letzt hast du einen Fehler im Algorithmus. Schau dir nochmal den Wikipediaartikel o.ä. an.



  • Danke leute es hat doch noch geklappt!

    Es lag an der for schleife die ich auskommentierte weil ich mir sicher war das man sie nicht braucht, aber wegen dem j < count-2 nahm ich sie wieder rein und seitdem klappt alles, warum auch immer ?? liegt wohl an der (un)logik von C++.

    [cpp]
    using namespace std;
    #include <iostream>

    int main () {

    size_t const dim(1000); int sort[dim] = {0}; size_t count(0);

    //Einlesen
    cout << "Bitte eine ganze Zahl eingeben max. 1000, ende mit STRG-D" << endl;

    for (size_t i(0); i < dim && cin; ++i){
    cin >> sort[i];
    ++count;
    }

    //Sortieren mit Bubble-S. Algorithmus
    for (size_t i(0); i < (dim-1); ++i){
    for (size_t j(0); j < (count-2); ++j){
    if (sort[j] > sort[j+1]){
    int temp = sort[j];
    sort[j] = sort[j+1];
    sort[j+1] = temp;
    }
    }
    }

    cout << endl;

    //Ausgeben der Sortierten Zahlen
    for (size_t i(0); i < (count-1); ++i){
    cout << sort[i] << ", ";
    }
    cout << endl;
    return 0;
    }

    [/cpp]



  • Gast307 schrieb:

    Danke leute es hat doch noch geklappt!

    Es lag an der for schleife die ich auskommentierte weil ich mir sicher war das man sie nicht braucht, aber wegen dem j < count-2 nahm ich sie wieder rein und seitdem klappt alles, warum auch immer ?? liegt wohl an der (un)logik von C++.

    Die Schleife brauchst du ganz klar, die gehört mit zum BubbleSort-Algorithmus. Nur über die Start- und Endwerte der beiden Zählvariablen solltest du nochmal nachdenken.



  • Wie Werner es gesagt hat, nutze std::vector ! Dann ist es so gross wie der User will und du musst dich nicht um die Speicherverwaltung kümmern.


Anmelden zum Antworten