String Felder unter Visual C++ sortieren?



  • hi
    ich studiere zur zeit Maschinenbau im 1. Semester und wir haben auch Informatik 😞 und müssen da C++ lernen bzw programmieren.
    So nun soll ich ein Programm schreiben in dem der Benutzer Vornamen, Nachnamen und Matrikelnr eingeben kann und diese in String Felder gespeichert werden.
    anschließend sollen die String felder nach dem Nachnamen Sortiert werden und ausgegeben werden.

    so nun bin ich schonmal so weit, dass ich jetzt ne liste anlegen kann mit den namen und Matrikelnummern und das diese anschließen ausgegebne werden. Wobei die Anfangsbuchstaben schon so umgewandelt werden, dass sie Groß geschrieben sind und der rest dann klein 😃
    nur das mit dem sortieren bekomm ich einfach nicht hin 😕 .
    ich mein wir haben das schonmal bei Zahlen gemacht. aber da gehts ja einfach weil man ja mit größer, kleiner Zeichen arbeiten kann. Aber bei Buchstaben? ka wie das gehen soll 😮

    bitte helft mir diesbezüglich. Ach und wie ihr bestimmt schon festgestellt habt ich bin anfänger und was Informatik angeht nicht gerade die leuchte 😃

    hier mein bisheriger Programmiercode^^

    void main (void)
    { 
    	int i = 0, n, k;
    
    	cout << "Geben Sie die Anzahl der Teilnehmer ein: " << endl;	//Anzahl Teilnehmer eingabe
    	cin >> n;
    	const int c = n;
    
    	string Vorname[1000], Nachname[1000], Vorname1[1000], Nachname1[1000];		//String Felder Definieren
    	int MatrikelNR[1000];
    
    		while ( i < n)								// Teilnehmer eingeben
    		{
    			cout << endl << "Geben Sie fuer den " << i + 1 << ". Teinehmer den Vornamen ein:" << endl;
    			cin >> Vorname[i];
    			cout << endl << "Geben Sie fuer den " << i + 1 << ". Teinehmer den Nachnamen ein:" << endl;
    			cin >> Nachname[i];
    			cout << endl << "Geben Sie fuer den " << i + 1 << ". Teinehmer die Matrikelnr. ein:" << endl;
    			cin >> MatrikelNR[i];
    
    			if (cin.fail() == true)					// Eingabe auf Fehler überprüfen
    			{
    				cout << endl << "Sie muessen eine Zahl als Matrikelnummer eingeben!" << endl << endl;
    				break;
    			}
    			i = i + 1;
    		}
    
    		int Zeichen = 0;		// Erster Buchstabe Groß schreiben
    		for (int l = 0; l < n; l = l + 1)
    		{
    							//Prüfen wie viel Zeichen der Nachname hat
    
    			Zeichen = Nachname[l].size();
    													//Erster Buchstabe des  Namens Groß schreiben
    				Nachname[l][0]=toupper(Nachname[l][0]);//Alle weiteren Buchstaben klein dahinter setzen
    				Vorname[l][0]=toupper(Vorname[l][0]);
    		}
    
    		cout << endl << "Vorname\t Nachname\t MatrikelNR " << endl;			// Ausgabe der Dateien
    		for (int k = 0; k < n; k = k +1)
    		{
    			cout << Vorname[k] << "\t" << Nachname[k] << "\t" << MatrikelNR[k] << endl;
    		}
    
    }
    

    danke MfG Kevin

    PS.: ich Programmiere nur in Konsolenfenstern



  • Buchstaben kannst du genau gleich vergleichen, wie Zahlen.
    Oder du benutzt einfach die Funktion std::sort.

    Im übrigen würde ich aus dem hier:

    string Vorname[1000], Nachname[1000], Vorname1[1000], Nachname1[1000];        //String Felder Definieren
        int MatrikelNR[1000];
    

    Eine Klasse (oder zumindest ein struct) machen und dann eine Liste für die Objekte anlegen.

    struct user
    {
      std::string vorname_;
      std::string nachname_;
      std::string vorname1_;
      int matrikel_nr_;
    };
    
    std::vector<user> users;
    


  • okey danke
    ich werds mal versuchen mit dem std:sort
    hmm wir haben aber klassen und der gleichen noch nicht durchgenommen und dürfen daher nichts anderes verweden. Also nur so weit wie wirs durchgenommen haben. sonst muss ich dem auch noch genau erklären was ne klasse ist und woher ich das kenn und so
    und darauf hab ich keine lust 😃

    aber trotdem danke
    ich versuchs mal sonst meld ich mich nochmal 😉



  • Dann darfst du, wenn du konsequent bist std::sort nicht verwenden. 😉

    Aber ein einfacher Sortieralgorithmus sollte auch machbar sein. (z.B Bubblesort ist schnell implementiert).



  • hi also hab jetzt nochmal versucht und glaub ich bin zu doof für die sort funktion ^^
    dann mir nicht jemand mal nen beispiel geben wie ich die funktion anwende?



  • Da hats doch genügend Beispiele dabei:

    http://www.cplusplus.com/reference/algorithm/sort/

    Oder wo ist genau dein Problem?



  • hmm nee sorry das hilft mir nciht groß weiter 😞

    kann ich das so schreiben?

    sort(Nachname[0].begin(), Nachname[n].end);
    

    oder wie?



  • fantom schrieb:

    kann ich das so schreiben?

    Nein, du willst ja das Array und nicht die einzelnen Strings sortieren (wobei wenn schon der Index gleich sein müsste).

    Ein Array kannst du so sortieren (wobei Laenge die Anzahl Einträge sind, die sortiert werden sollen):

    std::sort(Array, Array + Laenge);
    


  • hehe habs hinbekommen 😃

    std::sort(Nachname, Nachname + n);
    

    so hab ichs programmiert

    so aber jetzt tut er dann später bei der ausgabe die zu dem Nachnamen gehöhrende Matrikelnr und Vornamen nicht dazu setzten
    kann man das jetzt auch noch irgendwie lösen?



  • fantom schrieb:

    so aber jetzt tut er dann später bei der ausgabe die zu dem Nachnamen gehöhrende Matrikelnr und Vornamen nicht dazu setzten
    kann man das jetzt auch noch irgendwie lösen?

    Hier wären eben Klassen gut. Sonst kommst du wohl nicht darum herum, eine eigene Sortierfunktion zu schreiben...



  • oh okey
    also geht das nicht anders mit dieser funktion? schade 😞 da hab ich mich schon so sehr gefreut das es funkt und nix wars 😞
    hmm
    kann man das den mit den größer kleiner gleich zeichen machen?

    also kann ich dem sagen das er prüfen soll ob der AnfangsBuchstabe von emil < anton ist und wenn nicht das er dann anton nach vorne holt?

    also konkret so schreiben

    if (Nachname[0][0] < Nachname[1][0])
    {
    
    {
    else
    {
    Nachname[0]= Nachname[1];
    {
    

    und das dann natürlich in ner schleife mit variablen

    sodass wenn Nachname[0] = emil ist und Nachname[1][0] = anton
    er das wort anton in Nachname[0] rutscht



  • Du kannst gleich ganze Strings mit dem operator< vergleichen (lexikographisch).

    P.S.: Mit deiner Anforderung, du düftest keine Klasse etc. verwenden, weil du keine Lust zum Erklären hast, kannst du froh sein, std::sort nicht verwendet zu haben. 😉



  • hehe ja denk sort hätt ich sagen können das ich das von euch hab
    aber jetzt mit ganzen klassen und so schon zu arbeiten glaub das wäre ihm dann doch zu viel ^^

    aber ich probiere es mal mit dem Größer Kleiner zeichen

    wenn ichs hab oder auch net meld ich mich nochmal 😃

    danke aber schonmal vorweg für die schnell hilfe hier



  • so aber jetzt tut er dann später bei der ausgabe die zu dem Nachnamen gehöhrende Matrikelnr und Vornamen nicht dazu setzten
    kann man das jetzt auch noch irgendwie lösen?

    Gehen tut es ja, aber es wird ein gewurstel.

    Mach eine Klasse, schreib eine Vergleichsfunktion und das ganze klappt wunderbar.
    Die Klasse muss ja nichts grossartiges sein. Ganz einfach ein struct, dass dir die Member zusammenhält.

    struct user
    {
      std::string vorname_;
      std::string nachname_;
      std::string vorname1_;
      int matrikel_nr_;
    };
    user users[1000];
    //.. füllen
    
    //sortieren
    bool my_function ( const user & a, const user & b )
    {
       return a.vorname < b.vorname;
    }
    
    std::sort ( users, users+1000, my_sort );
    

    Und wenn du eine Struktur erklären musst, dann ist das nichts anderes, als ein Objekt, dass mehrere andere Objekte enthält.

    Du kannst jetzt irgendwas rumfrickel probieren, dass am Ende nicht läuft, oder dich 5 Minuten mit dem Schlüsselwort struct beschäftigen und dann hast du eine saubere Lösung.
    http://www.google.ch/search?hl=de&client=firefox-a&rls=org.mozilla%3Ade%3Aofficial&hs=ihz&q=struct+c%2B%2B&btnG=Suche&meta=

    Da ist nichts schweres dran..

    Und wenn du noch 10 Minuten Zeit hast, dann schaust du dir std::vector an und du hast schon fast eine Lösung, wie es ein Profi nicht besser machen könnte.



  • also danke erstmal euch
    hab das jetzt soweit hinbekommen^^
    hab es mit ner for schleife und if abfragen gelöst.
    und klappt ganz gut auch wenns wahrscheinlich bisl umständlich ist.

    aber das mit den klassen und den gram kapier ich einfach nicht. ich mein wo soll ich so ne klasse den einfügen und wie rufe ich sowas dann auf und so?

    na ja aber danke euch 👍



  • Klassen werden normalerweise in Header gehalten, welche du von den Modulen, welche sie brauchen inkludiert werden.
    Im Falle von user würde das in etwa so aussehen:

    user.hpp

    #ifndef USER_HPP //Header guards
    #define USER_HPP
    
    struct user
    {
      std::string vorname_;
      std::string nachname_;
      std::string vorname1_;
      int matrikel_nr_;
    };
    
    #endif
    

    main.cpp

    #include "user.hpp"
    
    int main ()
    {
    user u;
    u.vorname_ = "ich";
    // usw.
    
    std::vector<user> users;
    }
    

    In dem Fall sicher ein wenig Overkill, aber grundsätzlich läuft das so. Benutzen kannst du das Objekt, wie alle anderen Datentypen auch. std::string ist schlussendlich auch in etwa so etwas.


Anmelden zum Antworten