Arrays alphabetisch sortieren...



  • Hi Leutz!

    Also hab mal a question... und zwar möcht ich in meiner Konsolen anwendung (die mit den Namen, ihr wisst schon!) Den Inhalt eines String Arrays alphabetisch sortieren...

    #include <iostream.h>
    #include <string.h>
    
    int main ()
    
    {
    
    string str_name[6][2];
    char cback;
    int izahlen;
    int loop = 0;
    int izahl;
    string str_suchbegriff;
    bool bgefunden;
    
    do
    {
    //Menue------------------------------------------
         int menue;
    
         cout<<"Was wollen sie tun?"<<endl;
         cout<<"\nNamen Eingeben <1>";
         cout<<"\nNamen auslesen <2>"<<endl;
         cout<<"loeschen <3>"<<endl;
         cout<<"suchen <4>"<<endl;
         cout<<"Programm beenden <5>"<<endl;
         cin>>menue,str_name[loop][1];
    
             switch(menue)
    
                {
    
                  case 1: cback = ' ';
                          for (loop = 0 ;loop <=5; loop++)
                           {
                          if (str_name[loop][0] == "")
                                {
                                 cout<<"Bitte geben sie hier ihren Vornamen ein:\n";
                                 cin>>str_name[loop][0];
                                 cout<<"Bitte geben sie hier ihren Nachnamen ein:\n";
                                 cin>>str_name[loop][1];
                                 cout<<endl;
                                 cout<<"Wollen sie zurueck ins Hauptmenue? <J/N>"<<endl;
                                 cin>>cback;
                                 if (cback == 'j' || cback == 'J')
                             break;
                                }
                            }
                          if (cback == 'j' || cback == 'J')
                             break;
    
                          cout<<"es wurden schon zu viele namen eingegeben"<<endl;
                          cback = 'j';
                        break;
    
                  case 2: cout<<"Folgende Namen wurden schon eingelesen: "<<endl;
                          loop = 0;
    
                          if (str_name[loop][0] != "" || str_name[loop][1] != "")
                          {
                           for (loop = 0; loop <= 5; loop++)
                           {
                              if (str_name[loop][0]  != "")
                              {
                               cout<<str_name[loop][0] + ' ' + str_name[loop][1];
                               cout<<endl;
                              }
    
                           }
                          }
    
                          else if (str_name[loop][1] == "" || str_name[loop][1] == "2")
                          {
    
                           cout<<endl;
                           cout<<"es wurden noch keine Namen eingegeben";
                           cout<<endl;
                           cback = 'j';
                          }
                          cout<<endl;
                          break;
    
                  case 3:
                       loop = 0;
                       if (str_name[loop][0] != "")
                          {
                           for (loop = 0; loop <= 5; loop++)
                           {
                              if (str_name[loop][0]  != "")
                              {
                               cout<<str_name[loop][0] + ' ' + str_name[loop][1];
                               cout<<endl;
                              }
    
                           }
                          }
                          else if (str_name[loop][1] == "" || str_name[loop][1] == "2")
                          {
                           cout<<endl;
                           cout<<"es wurden noch keine Namen eingegeben";
                           cout<<endl;
                           cback = 'j';
                           break;
                          }
                          cout<<endl;
    
                            cin>>izahl;
                            izahl--;
                            str_name[izahl][0]="";
                            str_name[izahl][1]="";
                            cback = 'j';
                          break;
    
                  case 4:
                       bgefunden = false;
                       cout<<"Bitte geben sie hier den Vor- oder Nachnamen ein nachdem sie suchen wollen:"<<endl;
                       cin>>str_suchbegriff;
                       for (loop = 0 ;loop <=5; loop++)
                       {
                        if (str_suchbegriff == str_name[loop][0] || str_suchbegriff == str_name[loop][1])
                           {
                           cout<<"Vollstaendiger Name ist:"<<str_name[loop][0] + " " + str_name[loop][1];
                           cout<<endl;
                           bgefunden = true;
                           }
                       }
                       if (bgefunden != true)
                         {
                          cout<<"Leider wurde der Name nicht gefunden! "<<endl;
                         }
    
                  break;
    
                  case 5:
                  return 0;
    
                }
    
    }
    
    while (cback == 'J' || cback == 'j');
    
    getchar ();
    
    return 0;
    
    }
    

    Er soll mir quasi das Ergebnis in alphabetischer reihenfolge ausgeben...

    Gibts da ne Funktion oder muss ich das per Hand Programmieren?

    wär super wenn ihr mir heöfen könntet!



  • hai,
    habe auch mal damit rumgezackert und einen Thread im Ansi C- forum gestartet, der ein prima Ergebnis gebracht hat. Schau mal unter der URL:
    http://www.c-plusplus.net/forum/viewtopic.php?t=50282&highlight=
    oder suche nach dem Titel dieses Beitrags im Forum.
    Oder schau dir mal

    strcoll
    

    an.(string.h, C-Standardbibliothek.
    hoffe, das hilft dir, das Array musst du ja nur Stück für Stück durchrennen,
    und wenn der folgende Eintrag kleiner ist, mit dem vorhergehenden tauschen.
    machst du mit einer Temporären variablen in Schleifen. Das Verfahren nennt sich Bubblesort, weil die kleineren (oder größeren, wie du willst)wie Blasen im Wasser bei jeder Schleife höher steigen. Wenn du soviele Schleifen machst wie du Eintraege im Array hast, ist es garantiert gut sortiert. Gibt da aber ach noch Verfeinerungen und ganz andere Sortierverfahren,m die teilweise noch schneller sind. Bei einer Suche hier im forum findest du garantiert noch was.
    mfg
    arni
    😃 Oooops, habe wohl irgendwie verpeilt, dass dies das C++-Forum ist und nicht ANSI-C, ähä ... 🕶



  • Hallo,

    hab mir deinen Code jetzt nicht angesehen, aber wenn du C++ benutzt, kannst du bereits sehr viele vordefinierte Funktionen und Klassen benutzen:

    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
            string test = "bjkvbhdkjfhek";
    
            sort(test.begin(), test.end());
    
            cout << test << endl;
    
    }
    


  • 👍



  • #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <conio.h>
    using namespace std;
    
    int main()
    {
        const int N = 10;
        string s;
        vector<string> v;
        for(int i=0; i<N; ++i)
        {
            cout << "Please enter string: ";
            cin >> s;
            v.push_back(s);
        }    
    
        sort(v.begin(), v.end());
    
        cout << endl;
        for(vector<string>::iterator it = v.begin(); it!=v.end(); ++it)
            cout << *it << endl;
    
        getch();
    }
    


  • Erstmal danke für die Antworten!

    Mit den Codestücken kann ich aber leider insofern nix anfangen, da ich nicht weiß was einzelne Befehle auslösen. Vorallem bei CarstenJ bringt er mir Fehlermeldungen wenn ich statt einem einzelnen String ein Array verwende, und zwar in der Zeile:

    sort(test.begin(), test.end());
    

    und verweißt da auf die klammern... Was muss da drin stehen, bzw was lösen Zahlen oder Zeichen in den Klammern hinter "beginn" und "end" aus?

    Ich hoff ihr könnt mir helfen!

    Grüße aus Nürnberg



  • Nimm kein array, sondern std::vector (#include <vector>)



  • Ergänzung: Es ist fast generell eine schlechte Idee, C-Arrays zu benutzen. C-Arrays kommen, wie der Name schon sagt, aus C und was aus C kommt, ist meistens nicht so toll.
    Bei vectoren hast du Iteratoren, Wachstungsfähigkeit, du hast ein venünftiges Objekt und die Fähigkeit, dir ne Indexprüfung einzubauen.
    Wenn Performance wichtig ist und vector sich als langsam herausstellen sollte, kann man im Notfall noch boost::array nehmen.
    Aber für C-Arrays spricht IMHO fast gar nichts.



  • Ok, danke für die schnellen Antworten! Ich werd mich in Sachen Vectoren jetz mal schlau machen weil das war mir wie gesagt neu!

    Meld mich dann wieder!

    Edit: Kann mir jemand ne Seite empfehlen oder vielleicht sogar erklären was std::vector genau is, bzw wie es funktioniert? Noch finde ich nicht wirklich eindeutige Erklärungen dazu!



  • Also ich soll es ohne Vectoren machen... nur mit stinknormalen arrays... gibts da überhaupt ne möglichkeit oder will der mich ver*rschen?



  • Oliabt schrieb:

    Also ich soll es ohne Vectoren machen... nur mit stinknormalen arrays... gibts da überhaupt ne möglichkeit oder will der mich ver*rschen?

    Auch damit ist das moeglich:

    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    int main() {
            char test[] = "bjkvbhdkjfhek";
    
            sort(test, test+strlen(test));
    
            cout << test << endl;
    
    }
    

    mfg
    v R



  • Auch das funktioniert nicht wenn ich Strings statt chars verwenden möchte... und dafür brauch ich dir funktion eben ja 😞

    er gibt mir sofort Fehlermeldungen wenn ich statt den chars strings verwenden will...


Anmelden zum Antworten