2010-05-17 10 views
0

Je travaille sur mon devoir C++ sur le football et j'ai rencontré un problème avec map. Mon problème que j'ai rencontré est que quand j'ai stocké 2 ou plus "milieux de terrain" comme la clé, même les données de cout montre différent, mais quand je fais une multiplication sur la 2ème -> deuxième valeur, il "additionne" la première -> deuxième valeur et multiplier avec elle.C++ Carte Question

E.g.

John midfielder 1 
Steven midfielder 3 

J'ai un programme qui lit déjà dans playerPosition. Donc, la carte va comme ceci:

John 1 (Key, Value) 
Steven 3 (Key, Value) 

if(playerName == a->first && playerPosition == "midfielder") 
{ 
    cout << a->second*2000 << endl; //number of goals * $2000 
} 

Ainsi, en droit, le programme devrait sortie:

2000 
6000 

Mais au lieu, je reçois

2000 
8000 

Alors, je suppose il ajoute le 1 à 3 (résultant en 4) et en multipliant par 2000, ce qui est totalement faux ...

J'ai essayé cout a-> premier et un-> deuxième dans le programme et je reçois:

John 1 
Steven 3 

Mais après la multiplication, c'est totalement différent. Des idées?

Merci.


Editer: Ok, j'essaie. Je calcule réellement le bonus pour chaque champ de position. J'ai déjà inséré les données de terrain dans la carte et voici les codes réels.

multiset<string, less<string> >::iterator q, p = myset.begin(); 
q = myset.begin()++; 

while (p != myset.end()) 
{   
     if(*p == *q) 
     { 
      currentScore = (int) myset.count(*p); 
      mymap.insert(pair<string, int>(*p, currentScore)); 
     } 
     else if(*p != *q && topScore == 0) 
     { 
      topScore = (int) myset.count(*q); 
      topScorer = *q; 
      mymap.insert(pair<string, int>(*q, topScore)); 
     } 
     else if(*p != *q) 
     { 
      currentScore = (int) myset.count(*p); 
      mymap.insert(pair<string, int>(*p, currentScore)); 

      if(currentScore > topScore) 
      { 
       topScore = currentScore; 
       topScorer = *p; 
       mymap.insert(pair<string, int>(*p, topScore)); 
      } 
     } 
     p++; 
} 



map<string, int>::iterator a = mymap.begin(); 
while(a != mymap.end()) 
{ 
if(playerName == a->first && playerPosition == "goalkeeper") 
{ 
    goalkeepers++; 
    goalkeeperBonus+=(a->second*5000); 
    sumBonus+=goalkeeperBonus; 
} 
else if(playerName == a->first && playerPosition == "midfielder") 
{ 
    midfielders++; 
    midfielderBonus+=(a->second*2000); 
    sumBonus+=midfielderBonus; 
} 
a++; 
} 

Les données de test:

Score: 3-1 
Ben 
Steven 
Ben 
Score: 2-0 
John 
Steven 
Score: 1-0 
Ben 
Score: 0-0 
Score: 1-1 
Cole 
Score: 1-2 
Ben 
Score: 3-0 
Cole 
Steven 
Ben 

J'ai essayé de cout pendant la boucle while et je me suis sortie comme:

Ben 5 
Cole 2 
John 1 
Steven 3 

Cela devrait être la sortie correcte avec Steven ayant 3 buts Mais je reçois 4, ajouté avec John. Est-il possible d'attribuer le bonus à l'a-> premier qui est le nom du joueur?

+0

Avez-vous essayé d'autres entrées comme 7 et 5? – kennytm

+0

J'ai juste essayé d'assigner John à 7 et Steven à 5. Mais il ajoute toujours la première valeur à la seconde et multiplie. J'ai essayé de mettre le 3ème "milieu de terrain" et lui assigner une valeur. Il ajoute la première et la deuxième valeur à cela aussi ... – Wallace

+0

Publiez le code minimal qui illustre le problème. Plusieurs fois, les gens trouvent le problème en utilisant cette technique avant de poster. :-) –

Répondre

2

midfielderBonus+=(a->second*2000);

Alors que + = signifie qu'il accumule les données. Je suppose que vous oubliez un midfielderBonus=0 à un moment donné lorsque vous passez au joueur suivant. Genre de difficile à dire car l'extrait de code que vous avez inclus ne montre pas l'initialisation des variables de bonus.

+0

Je vais résoudre le problème. Le problème réside dans le + =, comme l'ont dit beaucoup d'autres. J'ai attribué ce bonus particulier à une autre variable et calculez le bonus global en ajoutant tous les autres bonus ensemble. Merci pour l'aide. Vous êtes super :) – Wallace

+0

Si le problème est résolu, vous pouvez fermer la question. Ou vous pouvez continuer à obtenir des réponses. – Lorenz03Tx

+0

Désolé, mais comment puis-je fermer cette question? Je viens de commencer à utiliser cette communauté. – Wallace

0

Je ne vois rien dans votre code inclus qui causerait ce que vous obtenez. Évidemment, il y a beaucoup d'autres choses qui pourraient expliquer cela, d'autant plus que votre «si» ne devrait apparemment s'appliquer qu'à un seul joueur.

+0

Mes codes sont plutôt longs, donc je ne suis pas sûr de pouvoir les coller tous ici. Ou peut-être que je pourrais télécharger mon script afin que toutes les âmes utiles puissent voir ce qui ne va pas? Je voulais juste demander si quelqu'un a rencontré un problème similaire et des solutions. – Wallace

+0

Voici mes codes compressés avec les données de test et les résultats attendus. http://www.mediafire.com/?kzyuizlgi4y Je suis déjà à plus de la moitié de ma mission et je suis bloqué dans cette partie que je n'arrive pas à comprendre. Si le téléchargement de fichiers n'est pas approprié, faites le moi savoir et je l'enlèverai. – Wallace

+0

Vous n'avez pas besoin de fournir tout le code, juste les bits importants. Définissez clairement votre définition de carte et le code qui génère votre itérateur 'a'. Passer la carte de la population pour l'instant. –