rechercher et dénombrer string + maps?

rechercher et dénombrer string + maps? - C++ - Programmation

Marsh Posté le 26-06-2004 à 14:47:03    

Bonjour,
 
Je vous explique mon problème :
 
J’ai un fichier texte de 60000 lignes.
 
Chaque ligne correspond à un élément.
 
Chaque élément appartient à une famille.
 
Il y a environ 60 familles.  
 
Chaque élément peut prendre un des 4 paramètres suivants : parametre1, parametre2, parametre3, parametre4.  
 
Il faut que le programme en C++ permette de dénombrer le nombre de parametre1, parametre2, parametre3, parametre4 pour chaque famille.  
 
Dans le fichier texte, le nom de la famille est le 2ème champ de chaque ligne.  
 
Le type de parametre (1,2,3,4) est le dernier champ.  
 
Chaque champ est séparé par une tabulation.  
 
Il peut y avoir des espaces entre les mots d’un meme champ.
 
 
 
Exemple d’une partie du fichier :
 
000124 famille1 inutile inuti le inutile parametre1
000125 famille1 inutile inu  tile inutile parametre2
000126 famille1 inutile inutile inutile parametre2
000130 famille2 inutile inutile inutile parametre3
000134 famille2 i n utile inutile inutile parametre1
000138 famille3 inutile in utile inutile parametre4
000160 famille3 inutile inut ile inutile parametre2
000181 famille3 inutile inut  ile inutile parametre3
 
 
voici mon code :
 

Code :
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5. using namespace std;
  6. class maclasse
  7. {
  8. public:
  9. vector<string> identifiant;
  10. vector<int> p1;
  11. vector<int> p2;
  12. vector<int> p3;
  13. vector<int> p4;
  14. int indice;
  15. enum type {error=-1, P1=0, P2, P3, P4};
  16. maclasse ();
  17. ~maclasse();
  18. void ajouter (string& nom, int type);
  19. int determinertype (string& chaine);
  20. void analysedufichier (ifstream& lefichier, maclasse classe, string& buffer);
  21. void print ();
  22. };
  23. maclasse::maclasse()
  24. {
  25.    indice=0;
  26.    identifiant.resize(255);
  27.    p1.resize(255);
  28.    p2.resize(255);
  29.    p3.resize(255);
  30.    p4.resize(255);
  31. }
  32. maclasse::~maclasse(){}
  33. void maclasse::ajouter (string& nom, int type)
  34. {
  35.    if (identifiant[indice]!=nom)
  36.    {
  37.        indice ++;
  38.        identifiant [indice] = nom;
  39.    }
  40.    switch (type)
  41.   {
  42.    case P1:
  43.         p1 [indice]++;
  44.         break;
  45.    case P2:
  46.         p2 [indice]++;
  47.         break;
  48.    case P3:
  49.         p3 [indice]++;
  50.         break;
  51.    case P4:
  52.         p4 [indice]++;
  53.         break;
  54.    }
  55. }
  56. void maclasse::print()
  57. { cout<<”la boucle for ne fonctionne pas”<<endl;
  58.    for (int i=0; i <indice; i++)
  59.    {
  60.       cout << "nom : "<< identifiant [indice] << endl;
  61.       cout << "nombre de p1: " << p1 [indice] << endl;
  62.       cout << "nombre de p2: " << p2 [indice] << endl;
  63.       cout << "nombre de p3: " << p3 [indice] << endl;
  64.       cout << "nombre de p4: " << p4 [indice] << endl;
  65.    }
  66. }
  67. int maclasse::determinertype (string& chaine)
  68. {
  69.    if (chaine=="parametre1" ) return P1;
  70.    else if (chaine=="parametre2" ) return P2;
  71.    else if (chaine=="parametre3" ) return P3;
  72.    else if (chaine=="parametre4" ) return P4;
  73.    else return -1;
  74. }
  75. void maclasse::analysedufichier (ifstream& lefichier, maclasse classe, string& buffer)
  76. {
  77. lefichier>>buffer;
  78. }       
  79. int main ()
  80. {
  81.     ifstream lefichier ("fichier.txt" );
  82.     if (!lefichier) {
  83.         cerr << "Ne peut ouvrir le fichier..." << endl;
  84.         return EXIT_FAILURE;
  85.     }
  86.     maclasse classe;
  87.     string buffer;
  88.     string nom;
  89.     int type;
  90.     while (lefichier)
  91.     {classe. analysedufichier (lefichier,classe,buffer);
  92.       classe. determinertype (buffer) ;
  93.       classe.ajouter (nom, type) ;
  94.      }
  95.    
  96. classe.print();   
  97.     return EXIT_SUCCESS;
  98. }


 
a la compilation , il n’y a pas d’erreur. Mais je n’obtiens pas ce que je veux à l’execution. Le programme ne rentre pas dans la boucle for.
Par ailleurs, dans un autre essai pour ce meme programme, sans la boucle for,  en n’utilisant pas la fonction ajouter, ni enum, et en mettant directement   if (chaine=="parametre1" ) p1 ++;  alors j’obtiens bien à l’execution :
 
nom :
nombre de p1 : 2
nombre de p2 : 3
nombre de p3 : 3
nombre de p4 : 1
 
donc le nom de la famille ne s’affiche jamais, le programme fait la somme de chaque parametre, toutes familles confondues. Et pour le dernier parametre du fichier (que ce soit 1,2,3 ou 4), son nombre est toujours augmenté de 1 par rapport à la réalité dans le fichier. (dans l'exemple, parametre3 est le dernier du fichier. le programme en compte 3 alors qu'il n'y en a que 2.)
 
Voilà, ça fait beaucoup de problemes, je sais. Je débute en C++, je n’ai jamais fait de C. On m’a parlé des maps qui seraient utiles pour identifier le nom de la famille mais je ne sais pas comment ça marche.
Donc si vous pouviez m’aider à faire fonctionner correctement ce programme, je vous remercie par avance.
 
 

Reply

Marsh Posté le 26-06-2004 à 14:47:03   

Reply

Marsh Posté le 26-06-2004 à 15:13:49    

manque des const
tu as une enume : utilise là, et pas des int
je comprends pas trop à quoi sert indice, ça gache vachement de place
 
j'ai rien bité à ton truc, ça m'a l'air assez foireux au niveau algorithme, peut être tu ferait bien de jeter un oeil au std::map

Reply

Marsh Posté le 26-06-2004 à 19:18:58    

tu pourrais m'expliquer ce que c'est les maps et comment on les utilise? ou me diriger sur un cours ou c'est bien expliqué et ou c'est compréhensible pour les débutants.
merci

Reply

Marsh Posté le 26-06-2004 à 19:24:08    

std::map, voir la documentation et les bibliolinks

Reply

Marsh Posté le 29-06-2004 à 18:58:25    

j'ai changé mon code. pouvez vous me dire comment afficher une map de vecteur de int (le vecteur contient 4 int)?

Code :
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5. #include <map>
  6. using namespace std;
  7. class mc
  8. {
  9. public:
  10. vector <int> v;
  11. int parametre1;
  12. int parametre2;
  13. int parametre3;
  14. int parametre4;
  15. string nom;
  16. map <string,vector<int> > m;
  17. mc();
  18. ~mc();
  19. string det_nom (ifstream& in, string& nom);
  20. string det_type (ifstream& in, string& chaine);
  21. };
  22. mc::mc(){}
  23. mc::~mc(){}
  24. string mc::det_type (ifstream& in, string& chaine)
  25. {
  26. in>>chaine;
  27. if (chaine=="parametre1" ) parametre1 ++;
  28. else if (chaine=="parametre2" ) parametre2 ++;
  29. else if (chaine=="parametre3" ) parametre3 ++;
  30. else if (chaine=="parametre4" ) parametre4 ++;
  31. }
  32. int changerligne (string& chaine)
  33. {
  34. if (chaine=="parametre1" || chaine=="parametre2" || chaine=="parametre3" || chaine=="parametre4" )
  35. int i=0;
  36. int j=0;
  37. }
  38. string mc::det_nom (ifstream& in, string& nom)
  39. {
  40. int i=0;
  41. int j=0;
  42. if (j!=1)
  43. {i++;
  44.   if (i==2)
  45.   {
  46.   in>>nom;
  47.   cout<<nom<<endl;
  48.   i=0;
  49.   j=1;
  50.   }
  51. }
  52. }
  53. int main ()
  54. {
  55. ifstream in ("fichier.txt" );
  56. mc c;
  57. string nom;
  58. string chaine;
  59. map <string,vector <int> > m;
  60. vector <int> v;
  61. if (!in)
  62. {
  63. cerr<<"erreur d'ouverture du fichier"<<endl;
  64. return EXIT_FAILURE;
  65. }
  66. while (!in.eof())
  67. {
  68. c.det_nom (in, nom);
  69. c.det_type (in, chaine);
  70. changerligne(chaine);
  71. }
  72. //je ne sais pas comment afficher le résulat final
  73. for (vector<int>::iterator it=v.begin();it!=v.end();it++)
  74. cout<<*it<<endl;
  75. return 0;
  76. }


 
merci de votre aide

Reply

Marsh Posté le 29-06-2004 à 19:01:22    

tu la parcour avec un itérateur. RTFM
 
 while (!in.eof())
     {
       c.det_nom (in, nom);
       c.det_type (in, chaine);
       changerligne(chaine);
     }  
 
si y a une erreur, tu verras que dal
 
utilise
 
while(in)
{
  // action  
}
 
et c'est tout

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed