2009-12-26 3 views
1

Je suis relativement expérimenté en codage Java mais je suis nouveau en C++. J'ai écrit le code C++ suivant comme solution au problème de formation USACO que j'ai reproduit à this urlhash_map plante en C++ stl

Ce code me semble bien. Cependant, il se bloque sur l'exemple de test donné. En isolant l'erreur, j'ai trouvé que si la seconde boucle for n'est pas exécutée pour la dernière itération (je veux dire dans le cas de test de l'échantillon, n = 5, donc je lance la boucle jusqu'à i = 3 au lieu de i = 4), alors il ne plante pas (et produit la sortie attendue). Peut-être que l'erreur est ailleurs, je ne peux pas le détecter.

Toutes les idées sont les bienvenues. Merci d'avance. Veuillez m'excuser pour le formatage un peu compliqué du code (ceci est mon premier article sur le forum). Les fichiers inclus sont stdlib.h, stdio.h et hash_map.h `

#include <stdlib.h> 
#include <stdio.h> 
#include <hash_map.h> 

struct eqstr 
{ 
    bool operator()(const char* s1, const char* s2) const 
    { 
    return strcmp(s1, s2) == 0; 
    } 
}; 


int main(int argc, char** argv) { 

    FILE *fin = fopen("gift1.in", "r"); 
    FILE *fout = fopen("gift1.out", "w"); 


    hash_map<const char*, int, hash<const char*>, eqstr> table; 

    int n; 
    fscanf(fin,"%d",&n); 
    char name[15]; 
    char people[10][15]; 

    for(int i = 0; i < n; i++){ 
     fscanf(fin,"%s",name); 
     strcpy(people[i],name); 
     table[people[i]] = 0; 
    }//ifor 

    for(int i = 0; i < n; i++){ 
     fscanf(fin,"%s",name); 
     int money; 
     fscanf(fin,"%d",&money); 
     int friends; 
     fscanf(fin,"%d",&friends); 
     char fname[15]; 
     int amt = money/friends; 
     for(int j = 0; j < friends; j++){ 
      fscanf(fin,"%s",fname); 
      table[fname] = table[fname] + amt; 
     }//jfor 
     table[name] = table[name] - friends*amt; 
    }//ifor 

    for(int i = 0; i < n; i++) 
     fprintf(fout,"%s %d\n",people[i],table[people[i]]); 

    return (EXIT_SUCCESS); 
} 

`

+2

Pour référence future: Lors de la publication d'échantillons de code, vous devez les mettre en retrait de quatre espaces pour qu'il soit correctement formaté. Vous pouvez le faire en utilisant le bouton 1010 dans la barre d'outils de formatage. – sepp2k

+3

hash_map ne fait pas partie de stl. Utilisez std :: tr1 :: unordered_set à la place ou, en cas d'indisponibilité, utilisez boost :: unordered_set. Utilisez également iostreams au lieu de scanf. Utilisez std :: string au lieu de C Strings. Il y a tellement de problèmes avec ce code pour commencer. –

+0

std :: tr1 :: unordered_map est l'équivalent standard de hash_map, pas unordered_set –

Répondre

4

La raison pour laquelle il se bloque est que vick donne 0 amis argent qui provoque une division par zéro exception de la ligne suivante de code: int amt = money/friends;

Vous devriez mettre dans une logique spéciale pour gérer le cas lorsque la personne a 0 amis alors donne $ 0 loin.

Comme indiqué dans les autres commentaires, vous devriez utiliser des classes stl (string, iostream, etc) pour aider à nettoyer le code.

Edit: Ajout des données d'entrée de sorte que la question et la réponse ferait un peu plus de sens

5 
dave 
laura 
owen 
vick 
amr 
dave 
200 3 
laura 
owen 
vick 
owen 
500 1 
dave 
amr 
150 2 
vick 
owen 
laura 
0 2 
amr 
vick 
vick 
0 0 
+1

Pas directement lié à la question mais devrait utiliser des floats ou doubles pour la division car vous obtiendrez quelques erreurs d'arrondi en utilisant int. –

+0

@Jesse: Si vous voulez juste donner des dollars entiers, alors int est bien. –

0

Je suggère d'utiliser GDB pour trouver ces erreurs. Cela m'est aussi arrivé.

Compilez avec l'option -g, puis utilisez gdb a.out (exécutable). Tapez maintenant run pour exécuter le programme. Une fois que le programme se bloque, vous pouvez utiliser backtrace pour identifier la ligne exacte où son écrasement et les valeurs des variables à ce point.