Funktion qsort .. Struktur nach Eingabe sortieren



  • root2k schrieb:

    brauche Hilfe von erfahrenen Programmierern.

    Nicht gleich übertreiben! 😉

    Scheint als hättest du die Verwendung von qsort noch nicht richtig verstanden.

    qsort(user->Nachname, UserAnzahl, sizeof(TAdressen), vergleich);

    1. Der erste Parameter ist ein Zeiger auf das erste zu sortierenden Element. In deinem Fall z.B. ein Zeiger auf das erste Element eines TAdressen-Arrays.

    2. Die Funktion vergleich muss bestimmen welches der Elemente größer, kleiner oder gleich ist. In deinem Fall sollte die Funktion einen lexikalischen Vergleich zwischen den Nachnamen zweier TAdressen-Objekte durchführen. Du hingegen vergleichst nur die Speicheradressen der Objekte.

    3. Bereite dich darauf vor Kritik abzubekommen, weil das C und nicht C++ ist. 😃



  • Hmm... Was ist denn daran nicht C++?
    Würde mich mal interessieren... Fände ich ziemlich krass, denn auf meinem Berufskolleg wird angegeben, dass ich C++ lerne und nicht C... sollte das tatsächlich der Fall sein, sprech ich morgen mal meinen Programmierlehrer drauf an.

    Wie schaffe ich es, einen lexikalischen Vergleich durchzuführen?

    Übrigens, das mit den erfahrenen Programmierern, soll heißen, dass ich nicht erfahren bin 🙂



  • root2k schrieb:

    Hmm... Was ist denn daran nicht C++?
    Würde mich mal interessieren...

    In C++ gibt es eine bessere Alternativen als qsort() , nämlich den STL-Algorithmus std::sort() (Header <algorithm> ).

    Zudem wären Referenzen hier besser geeignet als Zeiger. Und Zeiger auf void ? Lieber nicht. Wieso brauchst du die überhaupt, wenn du sie sowieso gleich wieder castest? Du kannst ja direkt Zeiger auf TAdressen übergeben (oder eben Referenzen).

    root2k schrieb:

    Wie schaffe ich es, einen lexikalischen Vergleich durchzuführen?

    Wenn du mit std::string arbeitest (was ich dir rate), hast du die Methode compare() zur Verfügung.

    Schau sonst auch mal bei www.cplusplus.com nach...



  • Vielen Dank erstmal, ich setz mich da mal ran.

    Übrigens: ich hab jetzt schon öfter diese Präfix gesehen: "std::"

    Auf dem Kolleg haben wir davon nie etwas beigebracht bekommen... Hast du da eine nette Seite für mich, außer der englischen Reference?

    Sollte man vor Ausdrücken wie cout, cin, etc. immer std:: setzen, oder ist das mit der passenden Bibliothek überflüssig?



  • Grundsätzlich ist alles aus der C++-Standardbibliothek im Namensraum std . Das heisst, eigentlich müsste man vor jede Funktion, jeden Typ und jedes Objekt std:: schreiben. Mit der Anweisung using namespace std; macht man den Namensraum aber bekannt und kann sich so die Präfixe sparen.

    Und die englische Referenz ist recht gut, vor allem wenn du dich eingehender mit C++ beschäftigst. Ansonsten gibt es für den Moment gerade noch ein zu empfehlendes Tutorial.

    Oder du kaufst dir Bücher wie C++-Primer oder Thinking in C++, wobei letzteres auch gratis als Online-PDF erhältlich ist.



  • Wow... vielen Dank, damit hast du mir echt geholfen.
    Ich arbeite mich da mal durch ...

    MFG root



  • Nexus schrieb:

    Wieso brauchst du die überhaupt, wenn du sie sowieso gleich wieder castest? Du kannst ja direkt Zeiger auf TAdressen übergeben (oder eben Referenzen).

    Weil das qsort so verlangt 😉



  • Ich weiß, ich hab jetzt nicht allzu lang geschaut, aber ich komm einfach nicht weiter und muss das morgen in der Klausur zeigen können.

    über std::sort weiß ich jetzt:

    #include <algorithm>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      int array[4] = {4, 2, 3, 1};
    
      sort(array, array + 4);
    
      for(int i = 0; i < (sizeof(array)/sizeof(int)); i++)
      {
        cout << array[i] << "  ";
      }
    
      cin.get();
    }
    

    So würde ein Array von 4 Feldern nach Größe sortiert werden.

    Aber wie setze ich das mit meiner Struktur um? Ich will ja bloß nach Nachnamen sortieren, meinetwegen nach dem Anfangsbuchstaben des Nachnamens (also user.Nachname[0])

    Wenn einer weiß wie das geht... ich bitte drum, sagts mir 😛



  • #include <iostream>
    #include <string>
    #include "Struktur.h"
    #include "Funktionen.h"
    
    using namespace std;
    
    int vergleich(const void * a, const void * b)
    {
    	const TAdressen * pa;
    	const TAdressen * pb;
    
    	pa = (const TAdressen *) a;
    	pb = (const TAdressen *) b;
    
    	if(strcmp(pa->Nachname, pb->Nachname) == -1)
    		return -1;
    	if(strcmp(pa->Nachname, pb->Nachname) == 1)
    		return 1;
    	if(strcmp(pa->Nachname, pb->Nachname) == 0)
    		return 0;
    
    	return 0;
    }
    
    TAdressen * adressen_sortieren(TAdressen * user, int UserAnzahl)
    {
    	qsort(user, 100, sizeof(TAdressen), vergleich);
    
    	return user;
    }
    

    Damit funktionierts... Trotzdem danke für eure Hilfen.



  • Falls dich das jetzt nach der Klausur noch interessiert :):

    struct Adresse {
        std::string Vorname;
        std::string Nachname;
        std::string Strasse;
        std::string Hausnummer;
        std::string Postleitzahl;
        std::string Stadt;
    };
    
    ..
    bool cmpVorname( const Adresse& a, const Adresse& b )
    {
        return a.Vorname < b.Vorname;
    }
    ..
    
    // Anlegen und irgendwie füllen
    Adresse addr[20];
    
    // Sortieren
    std::sort( &addr[0], &addr[20], cmpVorname );
    

Anmelden zum Antworten