Strukturen übergeben / String sortieren



  • Hallöchen zusammen,

    ich lerne derzeit C/C++ in der Schule und Teilweise zu Hause, normal schreibe ich in anderen Sprachen, allerdings habe ich nun ein kleines Problem:

    Ich wollte eine Schulaufgabe noch et was weiter ausschmücken um ein wenig mehr mit C zu schreiben. Es soll eine Personaldatenverwaltung werden. Die normale Ausgabe funktioniert einwandfrei, allerdings funktioniert die Übergabe bei der sort_strings() Funktion nicht 😕 Ich habe dort alles gleich gemacht, aber es will nicht funktionieren. Könnte mir das jemand vielleicht nochmal erläutern bzw. schauen ob ich einen Fehler im Script habe?

    #include <cstdlib>
    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    
    using namespace std;
    
    struct personaldaten {
           string name;
           string vorname;
           string geburtsdatum;
           char geschlecht;
           int personalnr;
    };
    
    void ausgabe(personaldaten *, int);
    
    int main(int argc, char *argv[]){
    
        int iEingabe;
        int iAnzahldermitarbeiter = 3;
        int i;
    
        struct personaldaten mitarbeiter[iAnzahldermitarbeiter];
    
        cout << "Personaldaten-Verwaltung" << endl << "------------------------" << endl;
        cout << "1. Personaldaten eingeben" << endl;
        cout << "2. Personaldaten importieren" << endl;
        cout << "0. Beenden" << endl << endl;
        cout << "Eingabe:";
        cin >> iEingabe;
    
        if (iEingabe == 1){       
           for (i = 0; i < iAnzahldermitarbeiter; i++){
               system("cls");
               cout << endl << "Namen des Mitarbeiters an:";
               cin >> mitarbeiter[i].name;
               cout << "Vornamen des Mitarbeiters an:";
               cin >> mitarbeiter[i].vorname;
               cout << "Geburtsdatum des Mitarbeiters an:";
               cin >> mitarbeiter[i].geburtsdatum;
               cout << "Geschlecht des Mitarbeiters an (Maennlich = m / Weiblich = w):";
               cin >> mitarbeiter[i].geschlecht;
               cout << "Personalnummer des Mitarbeiters an:";
               cin >> mitarbeiter[i].personalnr;
           }
        } else if (iEingabe == 2){
               // Hier werden spaeter Informationen importiert...
        } else if (iEingabe == 0){
               return 0;
        }
    
        system("cls");
        cout << "Personaldaten-Verwaltung" << endl << "------------------------" << endl;
        cout << "1. Personaldaten sortiert nach Name ausgeben" << endl;
        cout << "2. Personaldaten sortiert nach Vorname" << endl;
        cout << "3. Personaldaten sortiert nach Geburtsdatum" << endl;
        cout << "4. Personaldaten sortiert nach Geschlecht" << endl;
        cout << "5. Personaldaten sortiert nach Personalnummer" << endl;
        cout << "6. Personaldaten unsortiert ausgeben" << endl << endl;
        cout << "Eingabe:";
        cin >> iEingabe;
        system("cls");
    
        if (iEingabe == 1){
               sort_strings(mitarbeiter, iAnzahldermitarbeiter);
        } else if (iEingabe == 2){
               //FUNKTION
        } else if (iEingabe == 3){
               //FUNKTION
        } else if (iEingabe == 4){
               //FUNKTION
        } else if (iEingabe == 5){
               //FUNKTION
        } else if (iEingabe == 6){
               ausgabe(mitarbeiter, iAnzahldermitarbeiter);
        }
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
    void ausgabe(personaldaten *mitarbeiter, int iAnzahldermitarbeiter){
         int i;
    
         cout << "Name - Vorname - Geburtsdatum - Geschlecht - Personalnummer" << endl;
         for (i = 0; i < iAnzahldermitarbeiter; i++){
             cout << mitarbeiter[i].name << " - " << mitarbeiter[i].vorname << " - " << mitarbeiter[i].geburtsdatum << " - " << mitarbeiter[i].geschlecht << " - " << mitarbeiter[i].personalnr << endl;
         }
    }
    
    void sort_strings(personaldaten *mitarbeiter, int iAnzahldermitarbeiter){
    	int i,j,n;
    	char temp[iAnzahldermitarbeiter];
    
    	cout << mitarbeiter[0].name;
    
    }
    

    Ich habe mir einige Varianten bei Google angeschaut allerdings ist der Groschen leider nicht gefallen ... alle meine Versuche mit strcmp() sind gescheitert weil er wohl eine Const verlangt ...

    Grüße



  • Nicht die Übergabe ist das Problem, sondern die Funktionsdefinition selbst. Die Funktion macht nämlich nichts, weil da der ganze rest noch fehlt. 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.



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

    Man merkt's.



  • 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