Problem beim Eingeben von Schülern einer Klasse
-
du solltest den "typ" in deine struct aufnehmen
oder ein array du überschreibst sie immer wieder
statt eine int würde ich eine char nehmenlg
-
Siehe Kommentare:
char typ; //0=m, 1=w <= wie willst du das deinen 3 Personen zuordnen? do { cout<<"vorname eintippen: "; cin >> klasse[n].vorname; cout<<"nachname eintippen: "; cin >> klasse[n].name; cout <<"geschlecht eintippen: "; cin >> typ; // wird es jetzt automatisch meinem ersten schüler zugewiesen und beim 2ten schüler automatisch dem 2ten? n++; } while(n < max); cout<< klasse[0].vorname; // todo: in Schleife packen cout<< klasse[2].name;
-
bool ist für Typ auch möglich

Du hast aber Teile des Quelltextes im C Stil.
Wenn ich das richtig habe, kann das Ergebnis bei Schachtelungen von enum, struct und union voneinander abweichen, je nachdem ob du den C oder den C++ Stil wählst.Hier ein Zitat aus dem caravan.net:
A.11 Scope of nested types Note In C, the name of a type defined inside a struct or union is actually in same scope as the name of the enclosing struct or union. In C++, the name of the nested type is within the scope of the enclosing struct or union. Example struct S { int a; struct T { int t; } b; int c; enum E { V1, V2 } e; }; struct T x; enum E y; The declarations for x and y are valid in C, but not in C++. In C++, the names T and E are not in scope outside the definition of struct S. Guideline Do not define the name of a type as nested unless all uses of that name are also in the scope of the enclosing struct/union.Aber vielleicht schreibt ja noch jemand der sich da besser auskennt.
-
Danke für eure Mühe ich komm allerdings immernoch nicht drauf wie ich einen gültigen Schüler eingeben kann.
#include <cstdlib> #include<iostream> using namespace std; /* * */ int main(int argc, char** 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 = 3; struct Person klasse[max]; /* * do{ * cout<<"vorname eintippen: "; * cin >> klasse[n].vorname; * cout<<"nachname eintippen: "; * cin >> klasse[n].name; * cout <<"geschlecht eintippen: "; * cin >> klasse[n].geschlecht; Das funktioniert so nicht! * cout << "Geburtsdatum eingeben: "; * cin >> klasse[n].geburtsdatum; Das funktioniert so auch nicht! * n++; * }while(n < max); * * * for(int i=0;i<n;i++) * cout<< klasse[i]; */ return 0; }Meine frage ist jetzt wie ich es hinbekomme 3 gültige Schüler einzugeben, und ich mir diese am Ende auch ausgeben lassen kann.
ich hoffe ihr könnt mir helfen.
gruß
-
Schaust du dir an was wir dir schreiben?
Wenn du das, ohne dich zu verausgaben, passend zusammen kopierst, hast du schon mal etwas was laufen kann. Das musst du natürlich noch ein wenig modifizieren.
Also zu deinem letzten Quelltext nimm nur das Geschlecht und das Geburtsdatum heraus. Name + Vorname aktiv lassen. Und schau, wo dann noch ein Fehler auftritt. Ausgabe noch mal überdenken.
MfG f.-th.
-
Ich habe mir mal die Mühe gemacht und kurz was geschrieben, jedoch ohne gewähr. Die Eingaben werden weder vorher überprüft, noch ist das Design das Beste und die Ausgaben musste auch noch anpassen, da im Moment die Umlaute nicht korrekt dargestellt werden( siehe FAQ ). Ist also auch noch viel undefiniertes Verhalten. Jetzt werden vielleicht einige sagen, warum ich es dann poste, aber ich wollte dir nur mal eine Möglichkeit aufzeigen( bzw einen kleinen Denkanstoß geben), die du dann ja verbessern und anpassen kannst, denn ich habe jetzt keine Zeit mehr.
#include <iostream> #include <vector> using namespace std; class Person; class Datum { friend ostream& operator<<( ostream&, const Person& ); friend istream& operator>>( istream&, Person& ); private: enum Monat { Jan = 1, Feb, Mrz, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez }; unsigned int day; Monat month; unsigned int year; }; class Person { friend ostream& operator<<( ostream&, const Person& ); friend istream& operator>>( istream&, Person& ); private: string prename; string name; Datum date; bool male; }; ostream& operator<<( ostream& out, const Person& person ) { out << person.prename << " " << person.name << endl; out << person.date.day << "." << person.date.month << "." << person.date.year << endl; if( person.male ) out << "männlich" << endl; else out << "weiblich" << endl; return out; } istream& operator>>( istream& in, Person& person ) { in >> person.prename; in >> person.name; in >> person.date.day; int month; in >> month; person.date.month = static_cast<Datum::Monat>( month ); in >> person.date.year; int maleFemale; in >> maleFemale; if( maleFemale ) person.male = true; else person.male = false; return in; } int main() { vector< Person > persons; for( int i = 0; i < 3; ++i ) { cout << "Geben sie die folgende Daten, immer von einem Leerzeichen getrennt ein: " << endl; cout << "Vorname, Nachname, Tag des Geb, Monat des Geb, Jahr des Geb, für männlich eine 1 für weiblich eine 0" << endl; Person temp; cin >> temp; persons.push_back( temp ); } for( vector< Person >::const_iterator it = persons.begin(); it != persons.end(); ++it ) cout << *it << endl; }Lg freeG
-
Das ist halt C++
Es gibt sehr viele Wege die Aufgabe zu lösen.Aber, da wir deine Vorkenntnisse nicht einschätzen können, kann die Lösung für dich völlig unverständlich sein.
So wie du die Änderungen an deinem Quelltext vornimmst ergeben sich ein paar Fragen
Weisst du, was der Begriff struct() bewirkt? Habt ihr im Unterricht schon class behandelt?Und, wenn ich deinen letzten Quelltext sehe, wie funktioniert for()?
So wie du das in dem auskommentierten Quelltext nutzt, passt das nicht zur Aufgabe.Aufgabe: Namen mit zugehörigem Geschlecht und Datum erfassen und das für 3 Datensätze? Hast du schon Quelltextvorgaben oder sonstige Einschränkungen oder Hinweise zum Lösungsweg?
MfG f.-th.
-
hi,
also wir haben gerade aufzählungstypen und structs behandelt und zum abschluss von dem kapitel gab es eine übung die ich oben gepostet habe.
meine frage war jetzt ob es einen direkten zugriff für die art bzw. das datum mit der punkt notation gibt oder ich noch etwas hinzufügen muss um jeden schueler art und geb.datum zuweisen zu können.
lg
-
So die ersten Zeilen hast du.
Nun zur Art:struct Person { string vorname, name; Art geschlecht; // C++ Datum geburtsdatum; // C++ }; const int max = 3; Person klasse[max]; // C++ char geschl; int n=0; do { cout<<"vorname eintippen: "; cin >> klasse[n].vorname; cout<<"nachname eintippen: "; cin >> klasse[n].name; cout <<"geschlecht eintippen: "; cin >> geschl; // direkt zuweisen geht nicht switch(geschl) { case 0: case 'm': klasse[n].geschlecht = m; break; case 1: case 'w': klasse[n].geschlecht = w; break; default: ; } n++; } while(n < max); cout<< klasse[0].vorname; cout<< klasse[0].name; cout<< klasse[0].geschlecht; return 0; }
-
Vielen Dank für eure Mühe.
Bin jetzt soweit fertig das ich gültige Schüler eintippen kann. ich zeig euch mal meinen code vll könnt ihr mir sagen was man eventuell besser machen könnte, bzw. eleganter. weil ich glaub besonders schön ist mein code nicht
/* * File: main.cpp * Author: Michael Schmidt * * Created on 17. Mai 2011, 13:52 */ #include <cstdlib> #include<iostream> #include<string> using namespace std; /* * */ int main(int argc, char** 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 = 3; struct Person klasse[max]; char geschl; string gebMonat; int n = 0; do { cout << "vorname eintippen: "; cin >> klasse[n].vorname; cout << "nachname eintippen: "; cin >> klasse[n].name; cout << "geschlecht eintippen: "; cin >> geschl; // direkt zuweisen geht nicht if(geschl=='m')klasse[n].geschlecht = m; if(geschl=='w')klasse[n].geschlecht = w; cout << "Geburtstag eingeben: "; cin >> klasse[n].geburtsdatum.tag; cout << "Geburtsmonat eingeben: "; cin >> gebMonat; if(gebMonat=="Jan")klasse[n].geburtsdatum.mon=Jan; if(gebMonat=="Feb")klasse[n].geburtsdatum.mon=Feb; if(gebMonat=="Mrz")klasse[n].geburtsdatum.mon=Mrz; if(gebMonat=="Apr")klasse[n].geburtsdatum.mon=Apr; if(gebMonat=="Mai")klasse[n].geburtsdatum.mon=Mai; if(gebMonat=="Jun")klasse[n].geburtsdatum.mon=Jun; if(gebMonat=="Jul")klasse[n].geburtsdatum.mon=Jul; if(gebMonat=="Aug")klasse[n].geburtsdatum.mon=Aug; if(gebMonat=="Sep")klasse[n].geburtsdatum.mon=Sep; if(gebMonat=="Okt")klasse[n].geburtsdatum.mon=Okt; if(gebMonat=="Nov")klasse[n].geburtsdatum.mon=Nov; if(gebMonat=="Dez")klasse[n].geburtsdatum.mon=Dez; cout << "Geburtsjahr eingeben: "; cin >> klasse[n].geburtsdatum.jahr; n++; } while (n < max); for (int n = 0; n < max; n++) { cout << endl << "Vorname: " << klasse[n].vorname << endl; cout << "Nachname: " << klasse[n].name << endl; cout <<"Geschlecht: "; if (klasse[n].geschlecht == m)cout << "m" << endl; if (klasse[n].geschlecht == w)cout << "w" << endl; cout << "Geburtstag: " << klasse[n].geburtsdatum.tag <<" "; if(0==klasse[n].geburtsdatum.mon)cout<<"Jan "; if(1==klasse[n].geburtsdatum.mon)cout<<"Feb "; if(2==klasse[n].geburtsdatum.mon)cout<<"Mrz "; if(3==klasse[n].geburtsdatum.mon)cout<<"Apr "; if(4==klasse[n].geburtsdatum.mon)cout<<"Mai "; if(5==klasse[n].geburtsdatum.mon)cout<<"Jun "; if(6==klasse[n].geburtsdatum.mon)cout<<"Jul "; if(7==klasse[n].geburtsdatum.mon)cout<<"Aug "; if(8==klasse[n].geburtsdatum.mon)cout<<"Sep "; if(9==klasse[n].geburtsdatum.mon)cout<<"Okt "; if(10==klasse[n].geburtsdatum.mon)cout<<"Nov "; if(11==klasse[n].geburtsdatum.mon)cout<<"Dez "; cout << klasse[n].geburtsdatum.jahr << endl; } return 0; }
-
Ich hatte dir schon etwas geschrieben zu C versus C++ Stil.
In deinem Code Zeilen: 30, 40, 41, 44Weiter sieht man es nicht gern, wenn die "int main()" so viele Zeilen hat.
Dann müsstest du das Ganze neu sortieren - aber, wenn du die "int main()" in mehrere Funktionen aufteilst, wird das eventuell übersichtlicher.
Beispiel:
Datum_Einlesen
Person_Einlesen
Datum_Ausgeben
Person_Ausgeben
oder so ähnlich.Du hast in deinem Code 2x "int n" das kann in grösseren Projekten zu Verwirrungen führen.
MfG f.-th.