Zuordung der Werte von versch. Vectoren



  • Hey Forumler,

    ich schreibe gearde als Übung ein Programm, dass den Benutzer auffordert Namen und das dazu gehörige Alter einzugeben.
    Dann werden die Namen alpabetisch sortiert und die mit jeweils dem dazugehörigen alter ausgegeben.

    Ich habe es soweit hinbekommen aber nur wenn die Anzahl der einzugebenden Namen/Alter vorgegeben ist (Im Code 5):

    #include "../../../std_lib_facilities.h"
    
    void print(const vector<string>& names,const vector<double>& ages) //print () die Folgenglieder aus
    {   
       int i = 0;
       while(i<ages.size()){
          cout<<names[i]<<"__"<<ages[i];
    	  cout<<endl;
            ++i;
       }
       keep_window_open();
    
    }
    
    int main()
    {
    	vector<string>names;
    	vector<string>names_cop;
    	vector<double>ages;
    	vector<double>ages_cop;
    
    	double age = 0;;
    	string name = "...";
    
    	cout<<"Name.....Alter"<<endl;
    	while(cin>>name>>age){
    		ages.push_back(age);
    		names.push_back(name);
    
    	}
    	ages_cop = ages;
    	names_cop = names;
    	sort(names.begin(),names.end());
    
    	int i = 0;
    	while(i<names.size()){
    	  if(names_cop[0] == names[0+i]){
    		ages[0+i] = ages_cop[0];}
    
    	  if(names_cop[1] == names[0+i]){
    		ages[0+i] = ages_cop[1];}
    
    	  if(names_cop[2] == names[0+i]){
    		ages[0+i] = ages_cop[2];}
    
    	  if(names_cop[3] == names[0+i]){
    		ages[0+i] = ages_cop[3];}
    
    	  if(names_cop[4] == names[0+i]){
    		ages[0+i] = ages_cop[4];}
    
    	++i;}
    
    	print(names,ages);
    }
    

    Jetzt wollte ich den Code so umbauen, dass es auch für eine beliebige Anzahl an Namen-Alter Paare funktioniert.
    Dazu habe ich folgendes gemacht:

    #include "../../../std_lib_facilities.h"
    
    void print(const vector<string>& names,const vector<double>& ages) //print () die Folgenglieder aus
    {   
       int i = 0;
       while(i<ages.size()){
          cout<<names[i]<<"__"<<ages[i];
    	  cout<<endl;
            ++i;
       }
       keep_window_open();
       keep_window_open();
       keep_window_open();
    }
    
    int main()
    {
    	vector<string>names;
    	vector<string>names_cop;
    	vector<double>ages;
    	vector<double>ages_cop;
    
    	double age = 0;;
    	string name = "...";
    
    	cout<<"Name.....Alter"<<endl;
    	while(cin>>name>>age){
    		ages.push_back(age);
    		names.push_back(name);
    
    	}
    	ages_cop = ages;
    	names_cop = names;
    	sort(names.begin(),names.end());
    
    	int i = 0;
    	int n = 0;
    
    	while(n<names.size()){
    	 while(i<names.size()){
    		 if(names_cop[0+n] == names[0+i]){
    		  ages[0+i] = ages_cop[0+n];}
    		++i;}
    	++n;}
    
    	print(names,ages);
    
    }
    

    Aber da scheint etwas nicht zu stimmen.... 💡 .... Bis auf das erste Name/Alter Paar werden die anderen nicht richtig zugeordnet.
    Was läuft da schief? Bin es ein paar mal aufm Papier durchgegangen, aber steh aufm schlauch.....



  • Pack doch name und alter in ein struct, so hast du immer die zusammengehörenden auch zusammen.



  • Danke, aber es ist Teil der Übung es mit vectoren zu lösen, bzw. so wie ich es angefangen habe. Doch wie muss ich den 2ten Code ,bzw. die while schleife mit n verändern, dass der Code funzt?



  • Du deklarierst i und n außerhalb der Schleifen. Für n ist es notwendig, für i führt es zum Fehler 😉 Du willst ja eben in der inneren Schleife immer bei 0 anfangen. Wenn die äußere Schleife in die nächste Runde geht, muss i wieder 0 werden, sonst klappt der Algo nicht 😉



  • Du möchtest es einfach, effizient und mit vektoren machen, ja? Dann würde ich das echt -- wie es namealter vorgeschlagen hat -- per struct machen. Also: Name und Alter in einem struct zusammenfassen. Das könnte z.B. "person" heißen. Und dann verwendest du einen einzigen vector<person> und sortierst den nach dem Namen. Das geht über die sort-Funktion, die 3 Parameter bekommt. Der dritte ist ein Funktionsobjekt für ein "binäres Prädikat", welches zwei personen bekommt und bool zurückgibt. true bedeutet, dass die erste person vor der zweiten einsortiert werden soll (wie die kleiner-als-Beziehung).


Log in to reply