Strukturen übergeben / String sortieren



  • Ich nehme an mit "es will nicht funktionieren" meinst du, dass das Programm nicht kompiliert. Du brauchst einen Prototypen fuer die Funktion sort_string.



  • Willst du C oder C++ schreiben? Der Code ist ein ziemlicher Mischmasch aus beidem.



  • [Rewind] schrieb:

    Nicht die Übergabe ist das Problem, sondern die Funktionsdefinition selbst. Die Funktion macht nämlich nichts, weil da der ganze rest noch fehlt.

    Ich habe den Funktionsprototypen scheinbar vergessen, und ja es fehlt noch ein Teil der Funktion.

    [Rewind] schrieb:

    Wozu hast du die Vaariablen i, j, etc.? Was soll es für eine Sortierung sein? Alphabetische? Du siehst wahrscheinlich selbst, dass du in der Funktion dein Array nicht anfasst.

    Die Variablen sollten für folgende Schleifen sein. Die Sortierung habe ich vielleicht nicht genau erklärt, sry. Ich möchte gerne Strings Lexikografisch/Alphabetisch sortieren.

    Sone schrieb:

    [...] um ein wenig mehr mit C zu schreiben.

    Man merkt's.

    Was soll ich dir antworten ...

    icarus2 schrieb:

    Ich nehme an mit "es will nicht funktionieren" meinst du, dass das Programm nicht kompiliert. Du brauchst einen Prototypen fuer die Funktion sort_string.

    Habe ich bemerkt, dank dir.

    daddy_felix schrieb:

    Willst du C oder C++ schreiben? Der Code ist ein ziemlicher Mischmasch aus beidem.

    Ich muss ehrlich gestehen, ich kenne kaum einen unterschied zwischen C und C++. Ich schreibe normal in/mit anderen Sprachen nur in der Schule machen wir nun C/C++, wir können beides nehmen und uns wurde bisher nicht viel darüber erzählt. Ich denke ich werde das noch nachholen, aber soweit ist es also egal was ich verwende.

    Schonmal vielen Dank für die Antworten, komme grad erst von der Arbeit dass ich hier rein schauen konnte und werde am Wochenende wieder am Script schreiben und mich nochmal melden wenn ich weiter bin.

    Grüße YaeroxXO



  • Ich hätte nochmal eine Frage bezüglich Structs. Ich habe nun eine Funktion zum sortieren von Strings, jedoch würde ich jetzt gerne noch ein Feature einbauen:

    void sort_strings(personaldaten *mitarbeiter, int iAnzahldermitarbeiter){
        bool aenderungGemacht;
        do {
    	    aenderungGemacht = false;
    	    for (int i=0; i<(iAnzahldermitarbeiter-1); i++){
    		    if (stricmp(mitarbeiter[i].name.c_str(), mitarbeiter[i+1].name.c_str())>0){
    			    personaldaten tmp = mitarbeiter[i];
    			    mitarbeiter[i] = mitarbeiter[i+1];
    			    mitarbeiter[i+1] = tmp;
    			    aenderungGemacht = true;
    		    }
    	    }
        } while (aenderungGemacht);
    }
    

    besteht nicht die Möglichkeit, dass ich einen 3ten Parameter übergebe und in diesem Fall statt nach Name auch nach Vorname, Personalnummer etc. sortieren kann?

    Er sagt mir jedesmal dass das Attribut kein Teil des structs ist...
    [/code]void sort_strings(personaldaten *mitarbeiter, int iAnzahldermitarbeiter, string attribut){
    bool aenderungGemacht;
    do {
    aenderungGemacht = false;
    for (int i=0; i<(iAnzahldermitarbeiter-1); i++){
    if (stricmp(mitarbeiter[i].attribut.c_str(), mitarbeiter[i+1].attribut.c_str())>0){
    personaldaten tmp = mitarbeiter[i];
    mitarbeiter[i] = mitarbeiter[i+1];
    mitarbeiter[i+1] = tmp;
    aenderungGemacht = true;
    }
    }
    } while (aenderungGemacht);
    }[/code]



  • YaeroxXO schrieb:

    Er sagt mir jedesmal dass das Attribut kein Teil des structs ist...

    Er (der Compiler) hat immer recht.
    Dein struct hat kein Attribut namens attribut. Oder siehst du irgendwo eins?



  • Weil du nicht einfach strings nach Code konvertieren kannst!
    Das geht in JavaScript aber nicht in C++.
    Entweder du nutzt Switch-Case und enums:

    enum howtosort{FIRSTNAME, LASTNAME,...)
    void sort(..., howtosort howto)
    {
        ...
        switch(howto)
        {
            case FIRSTNAME:
                if (strcmp(foo.firstname, ...))
                    ...;
            case LASTNAME:
                if (strcmp(foo.lastname, ...))
                    ...;
        }
    }
    

    Oder du übergibst einen Funktionszeiger an eine Funktion die das entscheidet:

    enum howtosort{FIRSTNAME, LASTNAME,...)
    void sort(..., howtosort howto)
    {
        ...
        switch(howto)
        {
            case FIRSTNAME:
                if (strcmp(foo.firstname, ...))
                    ...;
            case LASTNAME:
                if (strcmp(foo.lastname, ...))
                    ...;
        }
    }
    

    Was soll eigentlich dieses Mischen von C und C++?



  • YaeroxXO schrieb:

    besteht nicht die Möglichkeit, dass ich einen 3ten Parameter übergebe und in diesem Fall statt nach Name auch nach Vorname, Personalnummer etc. sortieren kann?

    Das einleuchtendste ist wahrscheinlich eine Variante, die switch ed - siehe Nathans Antwort.
    Eine weitere - etwas kompaktere - Möglichkeit wäre einen Pointer auf das Attribut zu übergeben.

    Vollständiges Beispiel (C++11!) mit hoffentlich noch ein paar Anregungen für Deine C++ Karriere:

    #include <algorithm>
    #include <iomanip>
    #include <iostream>
    #include <string>
    #include <vector>
    
    struct personaldaten {
           std::string name;
           std::string vorname;
           std::string geburtsdatum;
           char geschlecht;
           int personalnr;
    };
    
    // personaldaten ausgeben
    std::ostream& operator<<(std::ostream& os, const personaldaten& p){
      os << std::setw(5) << p.personalnr << ": " << p.name << ", " << p.vorname
         << ' ' << p.geburtsdatum << " (" << p.geschlecht << ')';
      return os;
    }
    
    // personaldaten nach Attribut sortieren
    template<typename RandomIter, typename Attr>
    void sort(RandomIter first, RandomIter last, Attr personaldaten::*a){
      std::sort(first, last, [a](const personaldaten& x, const personaldaten& y){
        return x.*a < y.*a; });
    }
    
    int main(){
      using namespace std;
      typedef vector<personaldaten> personalliste;
      personalliste l = {
        {"Mueller", "Franz", "01.01.2013", 'm', 123},
        {"Moeller", "Frank", "01.01.2012", 'm', 125},
        {"Mueller", "Maria", "01.01.2013", 'w', 124},
        {"Schmidt", "Julia", "01.01.2013", 'w', 126}
      };
      sort(begin(l), end(l), &personaldaten::personalnr);
      cout << "Nach Personalnummer:\n";
      for(auto p : l)
        cout << p << '\n';
      sort(begin(l), end(l), &personaldaten::name);
      cout << "Nach Nachname:\n";
      for(auto p : l)
        cout << p << '\n';
    }
    

    Glückauf!



  • ...



  • Nathan schrieb:

    Oder du übergibst einen Funktionszeiger an eine Funktion die das entscheidet:

    enum howtosort{FIRSTNAME, LASTNAME,...)
    void sort(..., howtosort howto)
    {
        ...
        switch(howto)
        {
            case FIRSTNAME:
                if (strcmp(foo.firstname, ...))
                    ...;
            case LASTNAME:
                if (strcmp(foo.lastname, ...))
                    ...;
        }
    }
    

    Na das wirkt doch sehr gekünstelt, wo ist hier ein Funktionszeiger?
    Besser man nutzt das enum-Element direkt aus und spart dadurch ggü. der Ausgangsvariante wirklich Code:

    struct personaldaten {
           string name[3];
           char geschlecht;
           int personalnr;
    };
    void sort(..., howtosort howto)
    {
                if (strcmp(foo.name[howto], ...))
                    ...;
    }
    


  • @Swordfish:
    Wo ist das Problem?
    Der TE kannte schon Pointer, also dachte ich, dass er das auch schon kann/nicht schwierig wird es zu verstehen.
    Oder meinst du was anderes?

    @Wutz:
    Ja, das ist simpler.
    Aber falls er nach Geschlecht oder Alter sortieren will, fällt das weg.



  • ...


Anmelden zum Antworten