Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
766 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  rechercher et dénombrer string + maps?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

rechercher et dénombrer string + maps?

n°779045
s21
Posté le 26-06-2004 à 14:47:03  profilanswer
 

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.
 
 

mood
Publicité
Posté le 26-06-2004 à 14:47:03  profilanswer
 

n°779050
Taz
bisounours-codeur
Posté le 26-06-2004 à 15:13:49  profilanswer
 

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

n°779186
s21
Posté le 26-06-2004 à 19:18:58  profilanswer
 

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

n°779191
Taz
bisounours-codeur
Posté le 26-06-2004 à 19:24:08  profilanswer
 

std::map, voir la documentation et les bibliolinks

n°781743
s21
Posté le 29-06-2004 à 18:58:25  profilanswer
 

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

n°781745
Taz
bisounours-codeur
Posté le 29-06-2004 à 19:01:22  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  rechercher et dénombrer string + maps?

 

Sujets relatifs
Rechercher dans un site avec googlesavoir si une string ne contient que des chiffres
CTreeCtrl : SetItemData d'un std::string ???un string un tableau?
Bibliothèque de conversion Unicode<->ISO8859-1 et compatibilité string[ASP] Conversion string en décimal ?
[Java] Isoler proprement un motif dans une String[C++] Pas de copie lors de l'affectation entre objets string?
[Websphere] fonction split() de la classe String non implémenté ?[Java] Création de String
Plus de sujets relatifs à : rechercher et dénombrer string + maps?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR