Daten einlesen struct array



  • Hi,

    ich bräucht einmal Eure Hilfe beim Daten einlesen bei einem Schulklassenprogramm.
    Den Vornmane und Nachnamen kann ich einlesen.
    Mit dem Geschlecht und Geburtsdatum habe ich allerdings Probleme.

    #include "stdafx.h"
    #include <conio.h>
    #include <iostream>
    #include <string>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    enum Monat 
    {                 
            Jan,Feb,Mrz,Apr,Mai,Jun,   
            Jul,Aug,Sep,Okt,Nov,Dez    
    };      
    
    struct Datum 
    {               
            short tag;                
            enum Monat mon;            
            unsigned int jahr;         
    };
    enum Art {m,w};
    struct Person 
    {
            string vorname, name;
            enum Art geschlecht;
            struct Datum geburtsdatum;
    };
    const int max = 40;
    struct Person klasse[max];
    
    //input();
    
    for (int i=0;i<1;i++)
    {
    	cout <<"Vorname: ";
    	cin >> klasse[i].vorname;
    	cout <<"Nachname; ";
    	cin >> klasse[i].name;
    	cout << "Geschlecht (m=0 oder w=1): ";
    	cin >> klasse[i].geschlecht;
    	cout << "Geburtstag: ( ";
    	cin >> klasse[i].geburtsdatum;
    } 
    
    cout << klasse[0].vorname<<endl;
    cout << klasse[0].name <<endl;
    cout << klasse[0].geschlecht <<endl;
    cout << klasse[0].geburtsdatum <<endl;
    
    getch();	
    return 0;
    }
    


  • erst mal evtl so:
    dann musst du bei geburtsdatum und geschlecht halt den eingabestring selbst parsen...

    #include "stdafx.h" //wozu?
    #include <conio.h> //wozu?
    #include <iostream>
    #include <string>
    using namespace std;
    
    enum Monat 
    {                 
            Jan,Feb,Mrz,Apr,Mai,Jun,   
            Jul,Aug,Sep,Okt,Nov,Dez    
    };      
    
    struct Datum 
    {               
            short tag;                
            Monat mon;            
            size_t jahr;         
    };
    enum Art
    {
            m,
            w
    };
    
    struct Person 
    {
            string vorname, name;
            Art geschlecht;
            Datum geburtsdatum;
    };
    const size_t max = 40;
    
    int _tmain()
    {
    Person klasse[max];
    
    //input();
    
    for (int i=0;i != max; ++i)
    {
    	cout <<"Vorname: ";
    	cin >> klasse[i].vorname;
    	cout <<"Nachname; ";
    	cin >> klasse[i].name;
    	cout << "Geschlecht (m=0 oder w=1): ";
    	cin >> klasse[i].geschlecht;
    	cout << "Geburtstag: ( ";
    	cin >> klasse[i].geburtsdatum;
    } 
    
    cout << klasse[0].vorname<<endl;
    cout << klasse[0].name <<endl;
    cout << klasse[0].geschlecht <<endl;
    cout << klasse[0].geburtsdatum <<endl;
    
    getch(); //ach dafür conio.h ^^ guck mal im consolen-sub-forum - da stehen paar elegantere möglichkeiten ^^
    return 0; //nicht nötig
    }
    

    [/quote]



  • unskilled schrieb:

    #include "stdafx.h" //wozu?
    

    Precompiled header.



  • drakon schrieb:

    unskilled schrieb:

    #include "stdafx.h" //wozu?
    

    Precompiled header.

    o rly? tzz...
    mir würde nichts einfallen, was man dort für den quellcode includen sollte - überhaupt lohnt sich precompiled header in so winzigen projekten nicht. aber die diskussion gabs ja schon paar mal..
    also sollte er einfach auf die idee kommen, die option von wegen precompiled header zu deaktivieren oder ihn anständig nutzen (iostream, string, conio.h, ...)

    bb



  • unskilled schrieb:

    drakon schrieb:

    unskilled schrieb:

    #include "stdafx.h" //wozu?
    

    Precompiled header.

    o rly? tzz...
    mir würde nichts einfallen, was man dort für den quellcode includen sollte - überhaupt lohnt sich precompiled header in so winzigen projekten nicht. aber die diskussion gabs ja schon paar mal..
    also sollte er einfach auf die idee kommen, die option von wegen precompiled header zu deaktivieren oder ihn anständig nutzen (iostream, string, conio.h, ...)

    bb

    Standardheader lohnen sich immer in einen PCH zu stopfen. Auf meinem T40 lohnt sich das selbst für kleine Konsolenanwendungen. Ich weiss nicht, warum ich ein paar Sekunden auf die Standardheader warten soll, wenn ich das ganze < 1 Sekunde haben kann..



  • hmm... wir reden hier schon gerade von ner kleinen hausaufgabe - inwiefern man das dann merkt kann ich nicht beurteilen weil ich gerad nix zum testen habe...

    allerdings war in meiner aussage auch ein oder - und die andere möglichkeit war den pch ordentlich zu nutzen ^^

    bb



  • unskilled schrieb:

    hmm... wir reden hier schon gerade von ner kleinen hausaufgabe - inwiefern man das dann merkt kann ich nicht beurteilen weil ich gerad nix zum testen habe...

    allerdings war in meiner aussage auch ein oder - und die andere möglichkeit war den pch ordentlich zu nutzen ^^

    bb

    Warum nichts zum testen?
    Kannst ja mal ein Konsolenprojekt öffnen und dann einmal ein paar Standardheader includen und dann mal die Buildzeiten mit denen vergleichen, welche PCH nutzen.



  • Erstmal Danke für die Antworten.
    Aber einmal zurück zum eigentlichen Problem, meine Eingabe.
    Bis auf Geburtsdatum-Monat und Geschlecht, kann ich alles einlesen.
    Bei Geburtsdatum Monat und Geschlecht, weiß ich nicht genau wie das struct ansprechen muss.
    In der jetzigen Form steht in Geschlecht immer m (=0), egal was ich eingebe.
    Wenn diese Eingabe klappt, dann kann ich das analog auch für den Geburtsmonat übernehmen.

    for (int i=0;i<1;i++)
    {
    	char geschlecht;
    	cout <<"Vorname: ";
    	cin >> klasse[i].vorname;
    	cout <<"Nachname; ";
    	cin >> klasse[i].name;
    	cout << "Geschlecht (m=0 oder w=1): ";
    	cin >> geschlecht;
    	switch(geschlecht)
    	{
    		case 'w' : klasse[i].geschlecht = w;
    		case 'm' : klasse[i].geschlecht = m;
    
    	}
    	cout << "Geburtstag: ( ";
    	cin >> klasse[i].geburtsdatum.tag;
    	cout << "Geburtsmonat:";
    	//cin >> klasse[i].geburtsdatum.mon;
    	cout << "Geburtsjahr:";
    	cin >> klasse[i].geburtsdatum.jahr;
    }
    


  • Probier es mal so:

    for (int i=0;i<1;i++)
    {
        switch(geschlecht)
        {
            case 'w' : klasse[i].geschlecht = w; break; //break hinmachen, sonst gehts weiter
            case 'm' : klasse[i].geschlecht = m; break;
    
        }
    }
    

    Dann kommst du bei den Monaten auch nicht wirklich drum herum das mittels switch/case auszuwählen (oder das zumindest in irgendeiner Form umzuwandeln).
    Obwohl es bei diesem enum auch anderst geht, indem du einfach den Monat als Index einlesen kannst. Kommt halt drauf an, wie du erwartest, dass es der User eingibt. (also als text, oder Zahl).



  • Hi Dolphin,

    von mir noch abseits der eigentlichen Problematik noch ein Tipp zu:

    Dolphon schrieb:

    ...

    enum Art {m,w};
    

    ...

    Ich würde nicht so kurze enum-Namen verwenden. Einerseits sind "maennlich" und "weiblich" viel sprechender und andererseits kommt man sich nicht so schnell mit Bezeichnern in die Quere. Und da enums (wie ich finde: leider) in den umgebenenden Namensraum "gestreut" werden, ist das besonders gefährlich.
    @"Einstreuen":

    struct A {  int m; };
    // MUSS A::m bzw. als <Instanzname>.m angesprochen werden
    enum A { m };
    // wird einfach als m angesprochen
    

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Und da enums (wie ich finde: leider) in den umgebenenden Namensraum "gestreut" werden, ist das besonders gefährlich.

    Dieses Einstreuen gefällt mir auch nicht.

    Kleiner Workaround mit Namensräumen (ist zwar nicht das sauberste, aber so hat man eine Gliederung):

    namespace Geschlecht
    {
        enum // namenlos, wenn man den Typ nirgends braucht
        {
            m,
            w
        };
    }
    
    int main
    {
        Geschlecht::w; // wenn man den Namensraum vorne dran hat, kann man
                       // auch eher kurze Bezeichner wählen.
    }
    


  • Ja - Namensraum hilft
    Ja - kurze Bezeichner gehen dann
    Nein - ich sehe nicht ganz, was daran "unsauber" sei; OK, es ist schade, dass das überhaupt notwendig ist (wieder mal so eine C-Relikt-Krücke), aber "unsauber" finde ich das noch nicht...

    Aber damit sind wir schon wieer im Bereich der Ästhetik (es sei denn, ich habe etwas Grundelegendes übersehen) und da müssen wir nicht allzu intensiv weiterdiskutieren 😉 .

    Gruß,

    Simon2.


Log in to reply