enum aus struct ansprechen



  • d0zer schrieb:

    wenn ich nun cout << klasse[i].geschlecht mache, kriege ich eine 0 für m, und eine 1 für w raus. wie kann ich mir den buchstaben m oder w ausgeben lassen?

    Direkt eigentlich gar nicht. Schau dir die std::map an.



  • alles klar, ich schau mir die std::map mal an

    ich habe vor ein paar tagen ein beispiel gehabt, bei dem ich ein enum gemüse hatte und dort die ausgabe des enum in text so gelöst habe. ich wüsste aber nicht, wie ich das auf mein beispiel anwenden kann 😞

    enum tier {rind, schwein, huhn, ente, seelachs, krabben, tofu};
    string tier[7] = {"Rind", "Schwein", "Huhn", "Ente", "Seelachs", "Krabben","Tofu"};
    cout << "Speise Nr 1: " << tier[rind];
    


  • Ja, das ist so etwas die "manuelle" und unsichere Lösung der std::map .



  • naja so würde ich das aber auch machen... Anstatt dass du dich jetzt mit der std::map beschäftigst.
    Oder beim Geschlecht gibts ja zur 2 da geht auch:

    if(klasse[i].geschlecht) //das wäre weiblich, da w ja 1 ist
    {
    cout << "weiblich":
    }
    else
    {
    cout << "männlich";
    }
    


  • ich versteh nicht für was du eine enum brauchst
    du willst das doch gleich ausgeben wie du es eingegeben hast?
    ich würde das so in etwa machen

    struct Klasse_
          {    
              struct P_
              {
               string Vorname;
               string Nachname;
               string Geschlecht;
                  struct Datum_ {
                         short Tag;
                         string Monat;
                         unsigned Jahr;
                         };
              Datum_ Datum;      
              }Person[10];
          };  
          Klasse_* Klasse = new Klasse_[1];
    

    zugegriffen wird dann so

    Klasse[0].Person[0].Vorname;
            Klasse[0].Person[0].Nachname;
            Klasse[0].Person[0].Geschlecht;
            Klasse[0].Person[0].Datum.Tag;
            Klasse[0].Person[0].Datum.Monat;
            Klasse[0].Person[0].Datum.Jahr;
    

    hoffe das ist dir eine hilfe 😃



  • ich nehme ma an dass der sinn dieser übung is dass er die enums checkt. Das Geschlecht als string abzuspeichern ist einfach nur dämlich. Da brauch man genauso die Prüfung ob was vernünftiges eingegeben wurde. Und selbst wenn würde bei ihm der char reichen für 'w' und 'm'. Zu deiner Datum_ struct fehlen mir die worte...



  • ob das dämlich ist kommt darauf an wie man mit dem string umgeht
    andere datentypen würden es auch genauso tun
    ich hab nichts wenn man mich verbessert
    aber dann auch bitte sinnvoll 😉

    @d0zer
    sind enums vorgegeben??



  • ich kann dir viele nennen...

    1. Vergleich von Strings dauert viel länger als der Vergleich von Zahlen.
    2. Du speicherst für jede Person nen String Objekt statt nem byte -> höhere Speicherbelastung...
    3. Unnötig verschwendete Rechenzeit durch aufrufen des Konstruktors/Destruktors von std::string

    usw.



  • Hier eine Lösung damit mit dem Männlein und dem Weiblein schon mal sortiert werden kann:

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        enum Monat
        {
            Jan = 1, Feb, Mrz, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez
        };
    
        struct Datum
        {
            short tag;
            Monat mon;
            unsigned int jahr;
        };
    
        //Geschlecht
        enum Art { m, w };
    
        //Personendaten
        struct Person
        {
            string vorname, name;
            Art geschlecht;
            Datum geburtsdatum;
        };
    
        const int max = 10; //Maximal 10 Schüler möglich
        Person klasse[max];
        int n; //Variable für die Anzahl der Schüler
    
        //Anlegen von Schülern
        cout << "Wieviele moechten sie Schueler anlegen? " << endl;
        cin >> n;
        cout << "Sie wollen " << n << " Schueler anlegen " << endl;
    
        //Schleife um Daten für jeden Schüler abzufragen
        for (int i = 0; i < n; i++)
        {
            cout << "-------------------------" << endl;
            cout << "Bitte Vornamen eingeben: " << endl;
            cin >> klasse[i].vorname;
            cout << endl;
    
            cout << "Bitte Nachnamen eingeben: " << endl;
            cin >> klasse[i].name;
            cout << endl;
    
            //So wollte ich auf das Geschlecht zugreifen aber die Eingabe von Geschlecht (enum) funktioniert nicht
            cout << "Bitte das Geschlecht angeben: " << endl;
            char art = 'm';
            cin >> art;
            if(art == 'm')
                klasse[i].geschlecht = m;
            else    // gibt es eleganteres?
                klasse[i].geschlecht = w;
    
            cout << "Bitte Geburtstdatum eingeben(Monat): " << endl;
    
            //So wollte ich auf das Geschlecht zugreifen aber die Eingabe von Datum Monat (enum) funktioniert nicht
            cout << "Bitte Geburtstdatum eingeben( Tag & Monat & Jahr): " << endl;
            //cin >> klasse[i].geburtsdatum.tag >> klasse[i].geburtsdatum.mon >> klasse[i].geburtsdatum.jahr;
            cout << endl;
    
            cout << "-------------------------" << endl;
            cout << endl;
        }
    
        //Schleife um Daten für jeden Schüler auszugeben
        for (int i = 0; i < n; i++)
        {
            cout << klasse[i].vorname << endl;
            cout << klasse[i].name << endl;
    
            //Ausgabe von Datum, wegen Monat (enum) und Geschlecht (enum) funktioniert nicht
    //        cout << klasse[i].geburtsdatum.tag << klasse[i].geburtsdatum.mon << klasse[i].geburtsdatum.jahr << endl;
            cout << klasse[i].geschlecht << endl;
        }
    }
    

    Es gibt sicher noch andere Lösungen. Ob das eine dem Aufgabensteller genehme Lösung ist weiss ich nicht 😃

    Vergleiche den Quelltext mit der ersten Fassung. In den struct ist etwas anders.

    MfG f.-th.



  • Hallo Leute

    ja enums sind vorgegeben und die structs sind ebenfalls vorgegeben und dürfen nicht verändert werden.

    Danke für die Vorschläge


Anmelden zum Antworten