BeispielProgramm-alphapetisches Sortieren-Programmierstil



  • Dev-C++ 4



  • Hallo

    das liegt einerseits an dem fehlenden namespace (hab ich schon angemerkt), anderseits weil in Standard-C++ auf diese Art keine dynamischen Arrays erstellt werden können, denn dort müssen die Dimensionen immer konstant sein.
    Es gibt aber bereits neuere C-Standards, wo sowas möglich ist, und manche Compiler unterstützen soetwas schon.

    Aber standardkonform zu C++ wäre ein dynamisches Array mit new zu erstellen oder std::vector zu verwenden.

    bis bald
    akari



  • akari schrieb:

    Es gibt aber bereits neuere C-Standards[...]

    Aber bislang keine Entsprechung im C++-Standard 😉



  • Squawking schrieb:

    ... aber wer Lust hat kann es sich trotzdem mal anschaun und Verbesserungsvorschläge zum Stil, Lesbarkeit usw. bringen.

    Unbedingt den Code formatieren, das Gehirn brauchts! Wenn bei verschachtelten Schleifen alles untereinander steht,
    ist das schon fast unlesbar, man kann dann die Kontrollstrukturen nicht mehr auf einen Blick erkennen.
    Mit while(1) in der ersten Schleife, haste 'ne Endlosschleife geschrieben. Wie beendet man Dein Programm?
    Mit VLA 's programmieren (string word[how_many]) mein VS2005 VC++ 8.0 kann das noch nicht, ganz zu Schweigen vom
    C++ Standard der das nicht kennt. Die String-Klasse der STL sollte auch einiges mehr können.
    Ich würd's so schreiben:

    #include <iostream>
    #include <string>
    #include<locale>
    using namespace std;
    
    void sortieren(string* StrPtr, int anzahl){
       bool flag = true;
       while(flag){
          flag = false;
          for (int i = 0; i < anzahl-1; ++i)
             if (StrPtr[i] > StrPtr[i+1]){
                swap(StrPtr[i], StrPtr[i+1]);
                swap(StrPtr[i+anzahl], StrPtr[i+anzahl+1]);
                flag = true;
             }
       }
    }
    int main() {
       locale loc ("German_Germany");	
       int anzahl;
       cout << "Wie viele Worte wollen Sie alphabetisch sortieren? "; 
       cin >> anzahl;
       if (!anzahl) return 0;
       string* StrPtr = new string [anzahl*2];
       cout<<"Bitte geben Sie nun die Worte ein; bestaetigen Sie jedes Wort mit Enter: "<<endl;
       for (int i = 0; i < anzahl; ++i){   
          cin >> StrPtr[i];
          StrPtr[i+anzahl] = StrPtr[i];
          for(size_t x = StrPtr[i].size(); x; --x)
             StrPtr[i][x-1] = tolower(StrPtr[i][x-1], loc);
       }
       sortieren(StrPtr, anzahl);
       for (int i = 0; i < anzahl; i++)
          cout << endl << StrPtr[i+anzahl];
       cout << endl;
       delete[] StrPtr;
       return 0;
    }
    

    mfg



  • Danke an Helmut S.
    Mit etwas Arbeit kann ich diesen code denke ich sehr gut verstehen und viel lernen.
    Vorerst werde ich mir aber erstmal einen ordentlichen Compiler besorgen. Meiner ist wohl etwas veraltet.



  • Habe mir nun eine neuere Version besorgt und bekomme darauf den code von Helmut auch zum laufen. Nur gibt es da noch ein Problem: Manche Worte werden nicht richtig geordnet. Ich habe es mit meinem Programm verglichen, dort funktioniert es. Hat wieder was mit der Gross-und Klein-Schreibung zu tun. kommt vor, wenn mehrere Buchstaben im Wort gross geschrieben sind.



  • Squawking schrieb:

    ... kommt vor, wenn mehrere Buchstaben im Wort gross geschrieben sind.

    Hab diesen Fehler behoben, siehe Programm. Wie gesagt, die String-Klasse der STL sollte mehr leisten, würde den Programmierern Arbeit sparen.
    mfg



  • Alles klar. Danke.Das Programm stürzt bei mir aber sofort nach Aufruf ab. Den Code werde ich mir trotzdem mal anschauen. Noch eine Frage:
    Dein Code ist im Vergleich zu meinem relativ kurz.
    Nun zu meiner Frage: Liegt das hauptsächlich daran, dass du die vorgefertigten Funktionen aus der STL benutzt?
    Ich habe ja die ganzen Sortier-Schleifen selber geschrieben und wüsste nicht, wie das kürzer gehen soll, wenn man alles selber schreibt.



  • Bei mir läufts. Ist vor allem die STL-Funktion swap(,) die meinen Code kürzer gemacht hat.
    mfg



  • Also wenn ich versuche, dass kompilierte Programm aus der Eingabeaufforderung zu starten bekomme ich folgenden Fehler:

    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application`s support team for more information.

    KA



  • Squawking schrieb:

    Also wenn ich versuche, dass kompilierte Programm aus der Eingabeaufforderung zu starten bekomme ich folgenden Fehler:

    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application`s support team for more information.

    KA

    Mit VS2005 VC++ 8.0 erstellt, funktioniert das Programm.
    Mit GNU GCC Compiler 3.4.6 (CodeBlocks 1.0) unter WindowsXP ersellt, kommt es auch bei mir zu der obigen Fehlermeldung.
    Hat jemand eine Erklärung dafür?



  • Nun ja. Ich vermende winXP und have es mit Dev C++ 5 kompiliert. Würde auch gerne wissen, wo da das Problem steckt. Wer helfen kann....



  • #include <iostream>
    #include <string>
    //#include<locale>
    using namespace std;
    
    void sortieren(string* StrPtr, int anzahl){
       bool flag = true;
       while(flag){
          flag = false;
          for (int i = 0; i < anzahl-1; ++i)
             if (StrPtr[i] > StrPtr[i+1]){
                swap(StrPtr[i], StrPtr[i+1]);
                swap(StrPtr[i+anzahl], StrPtr[i+anzahl+1]);
                flag = true;
             }
       }
    }
    int main() {
    //   locale loc ("German_Germany");
       int anzahl;
       cout << "Wie viele Worte wollen Sie alphabetisch sortieren? ";
       cin >> anzahl;
       if (!anzahl) return 0;
       string* StrPtr = new string [anzahl*2];
       cout<<"Bitte geben Sie nun die Worte ein; bestaetigen Sie jedes Wort mit Enter: "<<endl;
       for (int i = 0; i < anzahl; ++i){
          cin >> StrPtr[i];
          StrPtr[i+anzahl] = StrPtr[i];
          for(size_t x = StrPtr[i].size(); x; --x)
             StrPtr[i][x-1] = tolower((int)StrPtr[i][x-1]);//<----------
       }
       sortieren(StrPtr, anzahl);
       for (int i = 0; i < anzahl; i++)
          cout << endl << StrPtr[i+anzahl];
       cout << endl;
       delete[] StrPtr;
       return 0;
    }
    

    So läufts jetzt auch mit GCC-Compiler.



  • Vom feinsten. Nun funktioniert es bei mir auch. Soweit ist denke ich auch alles richtig. Jetzt kann ich mich ranmachen und mir die ganzen templates und so angucken.


Anmelden zum Antworten