Namen und Alter einlesen



  • Mache eine Übung die sagt es soll eine Klasse Name_pairs geben. Es soll eine Eingabeoperation geben die die string einliest das ist read_names() und eine Operation die den Nutzer auffordert die Alter zum jedem Namen einzugeben das ist read_ages(). Das Problem ist wie kann man read_ages() sagen wenn man 5 Namen eingeben hat das man auch so viel Alter braucht und nicht mehr.

    class Name_pairs{
    public:
    	void read_names();
    	void read_ages();
    	void print();
    	void sort();
    private:
    	string n;
    	double a;
    	vector <string> name;
    	vector <double> age;
    };
    
    void Name_pairs::read_names()
    {
    	while(cin>>n) {
    		if(n == "quit" || n == "Quit" || n == "exit" || n == "Exit") {break;}
    		else
    			name.push_back(n);
    	}
    }
    
    void Name_pairs::read_ages()    
    {
    	while(cin>>a){
            age.push_back(a);
    	}
    }
    
    void f()
    {
    	cout << "Write Names:" << endl;
    	Name_pairs New;
    	New.read_names();
    	cout << "Write to the Names the Ages:" << endl;
    	New.read_ages();
    
    }
    
    int main()
    {
        f();
    
        keep_window_open();
        return 0;
    }
    


  • öhm wenn die ages methode immer nach der names kommt, kannste doch einfach die grösse des vektors auslesen?!

    btw find ich das design nicht sonderlich...


  • Mod

    Mach eine Schleife die so oft läuft wie name lang ist.

    edit: Zu langsam...



  • winux schrieb:

    Mache eine Übung die sagt es soll eine Klasse Name_pairs geben. Es soll eine Eingabeoperation geben die die string einliest das ist read_names() und eine Operation die den Nutzer auffordert die Alter zum jedem Namen einzugeben das ist read_ages(). Das Problem ist wie kann man read_ages() sagen wenn man 5 Namen eingeben hat das man auch so viel Alter braucht und nicht mehr.

    Es ist doch augenscheinlich so, dass es sich um Name und Alter einer Person oder Sache handelt. Also eine klassische 1:1-Beziehung. Folglich ist es doch sinnvoll, Name und Alter jeweils gemeinsam einzulesen und auch zu deklarieren - Ich meine statt:

    vector <string> name;
        vector <double> age;
    

    doch besser

    struct Person {
        std::string name;
        int age;
    };
    std::vector< Person > persons;
    

    .. oder?



  • Ja schon aber dir Übung verlangt erst die Namen und dann das Alter wenn ich es richtig verstanden habe, aber hier ist der Text:
    "Stellen Sie eine Eingabeoperation read_names() zur Verfügung, mit der eine Folge von Namen eingelesen werden kann, und eine Operation read_ages(), die den Benutzer auffordert , zu jedem Namen ein Alter einzugeben."



  • Nun gut - aber bleibe ruhig, bei der 'struct Person', dann könnte read_ages() z.B. so aussehen:

    void Name_pairs::read_ages()    
    {
        using namespace std;
        vector< Person >::iterator p = persons.begin();
        for( int a; p != persons.end() && (cout << "Age from " << p->name << ": ", cin >> a); ++p )
            p->age = a;
    }
    


  • Da es mit dem struct Person Vorschlag nicht so klappte, wurde es mit einen vector vergleich gemacht und das geht, aber es ist immer noch ein Problem. Wenn ich exit oder quit schreibe wird dann das als string erkennt und wenn man 5 Namen eingibt wird auch exit oder quit mitgerechnet, und dann muss man genau so viel Alter eingeben. Und genau das ist das Problem, wie könnte man exit oder quit ausnehmen das es nicht als Name gewertet wird.

    void Name_pairs::read_ages()
    {
    	while(cin>>a){
            if(age.size() == name.size()) {
    	    break;}
    	else
    	    age.push_back(a);
    }
    


  • Wenn ich mich bei deinem Programm weder mit meinem Vor- noch mit meinem Nachnamem registrieren könnte, würde mir das echt schwer zu schaffen machen 😞 .

    Also tu mir bitte einen Gefallen, bleib bei der struct von Werner für eine Person, definiere eine Klasse, die einen vector<Person> bereit stellt und füge ihr eine Methode AddPerson(const string& name) hinzu.

    Nutze für das Einlesen getline und breche ab, wenn der Benutzer keine Eingabe vorgenommen hat (der string also leer ist).

    Anschließend kann read_ages() aufgerufen werden und alle wären glücklich.



  • Quit Exit schrieb:

    Wenn ich mich bei deinem Programm weder mit meinem Vor- noch mit meinem Nachnamem registrieren könnte, würde mir das echt schwer zu schaffen machen 😞 .

    Also tu mir bitte einen Gefallen, bleib bei der struct von Werner für eine Person, definiere eine Klasse, die einen vector<Person> bereit stellt und füge ihr eine Methode AddPerson(const string& name) hinzu.

    Nutze für das Einlesen getline und breche ab, wenn der Benutzer keine Eingabe vorgenommen hat (der string also leer ist).

    Anschließend kann read_ages() aufgerufen werden und alle wären glücklich.

    Ja würde ich machen doch die Übung verlangt das anders. Aber jetzt etwas anderes warum Frist print() einen string und eine double auf, wenn man drei Namen und dann drei alter eingibt gibt print() nur zwei aus. Wieso?

    class Name_pairs{
    public:
    	void read_names();
    	void read_ages();
    	void print();
    	void sort();
    private:
    	string n;
    	double a;
    	vector <string> name;
    	vector <double> age;
    };
    
    void Name_pairs::read_names()
    {
    	while(cin>>n) {
    		if(n == "quit" || n == "Quit" || n== "exit" || n== "Exit") {
    			name.pop_back();     
    		    break;}
    		else { 
    			name.push_back(n);}
    	}
    }
    
    void Name_pairs::read_ages()
    {
    	while(cin>>a){
            if(age.size() == name.size()) {
    			break;}
    		else {
    			age.push_back(a);}
        }
    }
    
    void Name_pairs::print()           
    {
    	for (int i=0; i<name.size(); ++i)
        cout << '(' << name[i] << ',' << age[i] << ")\n";
    }
    
    void f()
    {
    	cout << "Write Names to exit the Program write \"quit,Quit,exit,Exit\":" << endl;
    	Name_pairs New;
    	New.read_names();
    	cout << "Write the names the ages:" << endl;
    	New.read_ages();
    	cout << "Hers the name and the age:" << endl;
    	New.print();
    
    }
    
    int main()
    try{
        f();
    
        keep_window_open();
        return 0;
    }
    catch (runtime_error e) {	
    	cout << e.what() << '\n';
    	keep_window_open("~");	
    }
    catch (...) {	
    	cout << "exiting\n";
    	keep_window_open("~");	
    }
    


  • In Zeile 18 ist das pop_back() zuviel - lösche diese Zeile. Das pop_back löschte immer den letzten Namen.

    und ersetze die Methode read_ages() durch:

    void Name_pairs::read_ages()
    {
        while(age.size() < name.size() && cin>>a){
            age.push_back(a);
        }
    }
    

    vorher hast Du immer ein Alter mehr gelesen als names.size().



  • Danke für deine Hilfe, jetzt Funktioniert alles. Jetzt kann ich mich um sort() kümmern.



  • Eine Frage, demnach löscht pop_back den letzten Namen und nicht exit oder quit?



  • Möchte das die Namen alphabetisch sortiert ausgeben werden und das der age- Vektor auch entsprechend umgeordnet wird. Das wurde gemacht aber der Compiler sagt in Zeile 51 das i ein nichtdeklarierter Bezeichner ist aber warum?

    class Name_pairs{
    public:
    	void read_names();
    	void read_ages();
    	void print();
    	void sort_out();
    	int find_index(const vector<string>& a,const string& n);
    private:
    	string n;
    	double a;
    	vector <string> name;
    	vector <double> age;
    };
    
    void Name_pairs::read_names()
    {
    	while(cin>>n) {
    		if(n == "quit" || n == "Quit" || n== "exit" || n== "Exit") {     
    		    break;}
    		else { 
    			name.push_back(n);}
    	}
    }
    
    void Name_pairs::read_ages()
    {
    	while(age.size() < name.size() && cin>>a){ 
            age.push_back(a); 
        } 
    }
    
    void Name_pairs::print()           
    {
    	for (int i=0; i<name.size(); ++i)
        cout << '(' << name[i] << ',' << age[i] << ")\n";
    }
    
    int Name_pairs::find_index(const vector<string>& a,const string& n)
    {
    	for (int i=0; i<n.size(); ++i)
    			if (n==a[i]) return i;
    }
    
    void Name_pairs::sort_out()
    {
    	vector <string> original_name = name;
    	vector <double> original_age = age;
    	sort(name.begin(),name.end());
    	for (int i=0; i<name.size(); ++i)
                 age[i] = original_age[find_index(original_name,name[i])];   
    	cout << "(" << name[i] << "," << age[i] << ")" << endl;
    }
    
    void f()
    {
    	cout << "Write Names to exit the Program write \"quit,Quit,exit,Exit\":" << endl;
    	Name_pairs New;
    	New.read_names();
    	cout << "Write the names the ages:" << endl;
    	New.read_ages();
    	cout << "Heres the Name and the Age:" << endl;
    	New.print();
    	cout << "Heres the Name and Age sorted!" << endl;
    	New.sort_out();
    }
    
    int main()
    try{
        f();
    
        keep_window_open();
        return 0;
    }
    catch (runtime_error e) {	
    	cout << e.what() << '\n';
    	keep_window_open("~");	
    }
    catch (...) {	
    	cout << "exiting\n";
    	keep_window_open("~");	
    }
    


  • Die Anweisung befindet sich außerhalb der Schleife => i ist nicht mehr gültig. Hast du die Klammern {} vergessen?



  • Ja die Klammern wurden vergessen.


Anmelden zum Antworten