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

  FORUM HardWare.fr
  Programmation
  C++

  trie tableau vector... (very debutant) help me please

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

trie tableau vector... (very debutant) help me please

n°1021410
boby61
Posté le 22-03-2005 à 19:24:59  profilanswer
 

hello all
 
j'ai un gros probléme que je n'arrive pas a résoudre pouvez vous m'aidez svp ?
 
voila mon probleme:
 
je doit trier un tableau de vector en respectant l'ordre alphabetique
 
voila mes structure:

Code :
  1. struct Identite
  2. {
  3.        string nomCli;
  4.        string prenomCli;
  5.        int age;
  6.        char statut;
  7. };
  8. struct DateEmp
  9. {
  10.        int jour;
  11.        int mois;
  12.        int annee;
  13. };
  14. struct Client
  15. {
  16.        DateEmp dateE;
  17.        Identite id;
  18.        int montantEmp;
  19.        int tauxInteret;
  20.        int duree;
  21.        int montantInteret;
  22. };


le trie doit se faire par le nom exemple:
Client tableau;
 
tableau[0].id.nom;
 
trop besoin d'aide svp


Message édité par boby61 le 23-03-2005 à 17:08:39
mood
Publicité
Posté le 22-03-2005 à 19:24:59  profilanswer
 

n°1021639
haazheel
Posté le 23-03-2005 à 00:19:19  profilanswer
 

Pour commencer je stockerai tout ça dans un vector.
 

Code :
  1. std::vector<Client> liste_clients;
  2. Client c;
  3. c.id.nomCli = "Dupont";
  4. c.id.prenomCli = "Albert";
  5. ....
  6. liste_clients.push_back(c);


 
Pour trier, il te faut un operator< dans ta classe Client. Je te conseille de faire comme ceci:
 

Code :
  1. struct Identite
  2. {
  3.        string nomCli;
  4.        string prenomCli;
  5.        int age;
  6.        char statut;
  7.        bool operator<(const Identite & compar) const
  8.        { return nomCli < compar.nomCli; }
  9. };
  10. struct DateEmp
  11. {
  12.        int jour;
  13.        int mois;
  14.        int annee;
  15. };
  16. struct Client
  17. {
  18.        DateEmp dateE;
  19.        Identite id;
  20.        int montantEmp;
  21.        int tauxInteret;
  22.        int duree;
  23.        int montantInteret;
  24.        bool operator<(const Client & compar) const
  25.        { return id < compar.id; }
  26. };


 
J'ai défini deux operator<, mais tu aurais pu en ajouter un uniquement pour la classe Client:
 

Code :
  1. struct Client
  2. {
  3.        DateEmp dateE;
  4.        Identite id;
  5.        int montantEmp;
  6.        int tauxInteret;
  7.        int duree;
  8.        int montantInteret;
  9.        bool operator<(const Client & compar) const
  10.        { return id.nomCli < compar.id.nomCli; }
  11. };


 
Une fois que tous tes clients ont été ajoutés, tu utilises la fonction std::sort dans l'entête <algorithms>
 

Code :
  1. std::sort(liste_clients.begin(),liste_clients.end());


 
Elle va automatiquement utiliser l'operator< pour trier tes clients en fonction de leur nom.
 
Si après tu veux trier ta liste en fonction d'autres paramètres, il faudra que tu donnes un 3ème paramètre à la fonction sort, qui s'appelle un foncteur.
 
Si tu veux retourner une structure, deux solutions:
 

Code :
  1. Client ma_fonction()
  2. {
  3. Client c;
  4. c.*** = "Durand";
  5. c.*** = "Philippe";
  6. .....
  7. return c;
  8. }
  9. Client c1 = ma_fonction();


 
ou bien en utilisant une référence:
 

Code :
  1. void ma_fonction(Client & c)
  2. {
  3. c.*** = "Durand";
  4. c.*** = "Philippe";
  5. .....
  6. }
  7. Client c1;
  8. ma_fonction(c1);

n°1021651
haazheel
Posté le 23-03-2005 à 00:44:57  profilanswer
 

Je viens de penser à ça, si jamais tu as deux clients avec le même nom, tu peux modifier ton operator< comme ceci:
 

Code :
  1. bool operator<(const Identite & compar) const
  2. {
  3. if (nomCli < compar.nomCli) return true;
  4. if (nomCli > compar.nomCli) return false;
  5. return prenomCli < compar.prenomCli; // seulement si nomCli == compar.nomCli
  6. }

n°1021674
boby61
Posté le 23-03-2005 à 07:25:07  profilanswer
 

salut merci beaucoup pour ton aide, mais le probleme c'est que ca compile nickel mais quand j'execute et que j'affiche ca ne change pas...
 

Code :
  1. struct Identite
  2. {
  3.        string nom;
  4.        string prenom;
  5.        int age;
  6.        char statut;
  7.      
  8.        bool operator<(const Identite & compar) const
  9.        { return nom < compar.nom; }
  10. };
  11. struct Date
  12. {
  13.    int jour;
  14.    int mois;
  15.    int annee;
  16. };
  17. struct Client
  18. {
  19.        Date date;
  20.        Identite id;
  21.        int montantEmprunt;
  22.        int tauxInteret;
  23.        int duree;
  24.        int montantInteret;
  25.      
  26.         bool operator<(const Client & compar) const
  27.         { return id < compar.id; }
  28. };
  29. ...
  30. vector<Client> TrierClients(vector<Client> listeClient);
  31. void Affiche(vector<Client> listeClient, const string cli);
  32. int main()
  33. {
  34. ...
  35. cout << "Entrez le nom du client recerhce: ";
  36. cin >> nomClient;           
  37. Affiche(listeClients, nomClient);
  38. listeClients = TrierClients(listeClients);
  39. cout << "Entrez le nom du client recerhce: ";
  40. cin >> nomClient;           
  41. Affiche(listeClients, nomClient);
  42. return 0;
  43. }
  44. vector<Client> TrierClients(vector<Client> listeClient)
  45.      sort(listeClient.begin(),listeClient.end());
  46.    
  47.      return listeClient;
  48. }
  49. void Affiche(vector<Client> listeClient,const string cli)
  50. {       
  51.      cout <<endl <<endl;
  52. for (int i = 0; i < listeClient.size(); i++)
  53.      {
  54.           if(cli == listeClient[i].id.nom)
  55.           {
  56.           cout << listeClient[i] << endl;
  57.           }
  58.      }   
  59. }


 
voila mon code donc le probléme c'est que quand j'affiche mon tableau il n'y a rien qui a changé

n°1021976
haazheel
Posté le 23-03-2005 à 12:35:00  profilanswer
 

Déjà je pense qu'il est préférable de ne pas utiliser la directive

Code :
  1. using namespace std

, et préfixer tes vector, tes string... avec std::
 
Sinon pour la fonction std::sort, je pense que c'est parce que tu dois transmettre une référence du vector à la fonction TrierClients. Là la fonction travaille sur une copie.
 
Tu devrais faire comme ça je pense:
 

Code :
  1. void TrierClients(std::vector<Client> & listeClient)
  2. std::sort(listeClient.begin(),listeClient.end());
  3. }


 
Et donc du coup tu as ceci:
 

Code :
  1. int main()
  2. {
  3. ...
  4. cout << "Entrez le nom du client recherche: ";
  5. cin >> nomClient;           
  6. Affiche(listeClients, nomClient);
  7. TrierClients(listeClients);
  8. cout << "Entrez le nom du client recherche: ";
  9. cin >> nomClient;           
  10. Affiche(listeClients, nomClient);
  11. return 0;
  12. }


 
Pourquoi trier ta liste entre deux appels à Affiche?
Une fois que tous tes clients ont été enregistrés dans le vecteur, tu tries ton vecteur une seule fois, et ensuite tu cherches dans ton vecteur...
 
Sinon pour ta fonction Affiche, je pense qu'il serait préférable une fois encore d'utiliser un operateur et une fonction de la STL, ainsi que les iterateurs...
 
Tout d'abord la classes, avec l'operator==
 

Code :
  1. struct Client
  2. {
  3.        Date date;
  4.        Identite id;
  5.        int montantEmprunt;
  6.        int tauxInteret;
  7.        int duree;
  8.        int montantInteret;
  9.      
  10.        bool operator==(const std::string & nomCli) const
  11.        { return id.nom == nomCli; }
  12.        bool operator<(const Client & compar) const
  13.        { return id < compar.id; }
  14. };


 
Et ta fonction Affiche:
 

Code :
  1. void Affiche(std::vector<Client> listeClient, const std::string & cli) //On passe de préférence les string par référence constante
  2. {       
  3. cout <<endl <<endl;
  4. std::vector<Client>::const_iterator ite = std::find(listeClient.begin(),listeClient.end(),cli);
  5. if (ite != listeCli.end())
  6.         cout << *ite << endl;
  7. }


 
Là tu as défini l'operator== en fonction d'un std::string, et qui te renvoie true si le nom est identique. Problème, si tu veux faire une recherche sur le prénom, qui est aussi un std::string, tu ne peux pas surcharger operator==. Ce pourquoi je te conseille de te tourner vers des foncteurs qui te permettront tous les tris et toutes les recherches que tu veux...
 
Bon courage
 
 :bounce: Edit:
 
Si tu veux afficher tous tes clients d'un coup et vérifier qu'ils sont bien dans l'ordre alphabétique:
 

Code :
  1. listeCli.push_back(cli1);
  2. listeCli.push_back(cli2);
  3. listeCli.push_back(cli3);
  4. ...
  5. std::sort(listeCli.begin(),listeCli.end());
  6. for (std::vector<Client>::const_iterator ite = listeCli.begin(); ite != listeCli.end(); ++ite)
  7. {
  8.         cout <<endl <<endl;
  9.         cout << *ite << endl;
  10. }


Message édité par haazheel le 23-03-2005 à 12:39:52
n°1022106
boby61
Posté le 23-03-2005 à 13:44:55  profilanswer
 

aaaaaaaaaaarrrrrggg j'en ai trop marre !!!
maintenant mon compilo me marque plei d'erreur...
 
le log:

Code :
  1. main.cpp: In member function `bool Client::operator<(const Client& ) const':
  2. main.cpp:48: error: no match for 'operator<' in '((const Client*)this)->Client::id < compar->Client::id'
  3. main.cpp: In function `void Affiche(std::vector<Client, std::allocator<Client> >, const std::string& )':
  4. main.cpp:320: error: no match for 'operator<<' in 'std::cout << (&ite)->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = const Client*, _Container = std::vector<Client, std::allocator<Client> >]()'
  5. C:/Dev-Cpp/include/c++/3.4.2/bits/ostream.tcc:63: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>&(*)(std::basic_ostream<_CharT, _Traits>& )) [with _CharT = char, _Traits = std::char_traits<char>]
  6. ...


 
il me renvoi toujours a la ligne suivante:
   

Code :
  1. { return id < compar.id; }


Message édité par boby61 le 23-03-2005 à 14:05:47
n°1022150
boby61
Posté le 23-03-2005 à 14:00:03  profilanswer
 

si je vire la fonction affiche j'ai deja beaucoup moin d'erreur mais il me ramene toujours a la meme ligne:
 
log compilo:

Code :
  1. ...\ProjetClient2\Makefile.win" all
  2. g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include" 
  3. main.cpp: In member function `bool Client::operator<(const Client& ) const':
  4. main.cpp:48: error: no match for 'operator<' in '((const Client*)this)->Client::id < compar->Client::id'
  5. make.exe: *** [main.o] Error 1
  6. Exécution terminée

n°1022227
Taz
bisounours-codeur
Posté le 23-03-2005 à 14:20:20  profilanswer
 

((const Client*)this)->Client::id
 
euh t'essaies de faire quoi là ?

n°1022292
boby61
Posté le 23-03-2005 à 14:59:49  profilanswer
 

c'est ce que mon compilateur m'ecrit comme erreur alors que je n'est pas du tout écrit ça

n°1022477
boby61
Posté le 23-03-2005 à 17:06:15  profilanswer
 

c'est encore moi désolé de faire chier mais je suis perdu...
 
Alors pour l'instant je vais laissé tommber ma fonction de trie car là c'est vraimment la merde...
 
Et maintenant j'ai un autre probléme avec une autre fonction.
en fait je doit rechercher un client (le nom et passé en paramétre) et la fonction doit retourné son indice dans le tableau sinon -1 (si le client n'existe pas)
 
alors voila ce que j'ai fais cela compile bien mais lors de l'execution j'ai un bug lorsque j'entre le nom recherché et que j'execute quelqu'un peut-il me dire pourquoi svp ?
 
prototype de ma fonction:

Code :
  1. int RechClient(vector<Client> listeClient,const string nomCli);


 
dans le main:

Code :
  1. incClient = RechClient(tabClients, nomClient);
  2.          
  3. AfficherClient(tabClients, incClient); //permet d'afficher le client


 
definition de la fonction:

Code :
  1. int RechClient(vector<Client> listeClient,const string nomCli)
  2. {
  3.     int indice;
  4.    
  5.       for (int i = 0; i < listeClient.size(); i++)
  6.      {
  7.           if(listeClient[i].id.nom == nomCli)
  8.           {
  9.           indice = i;
  10.           }
  11.           else
  12.           {
  13.               indice = -1;
  14.           }
  15.      }
  16.      return indice;
  17. }


 
pour info la fonction affiche:

Code :
  1. void AfficherClient(vector<Client> listeClient,const int indic)
  2. {
  3.      cout << listeClient[indic] << endl;
  4. }


 
voila, je ne vois vraiment pas pourquoi cela bug  :??:

mood
Publicité
Posté le 23-03-2005 à 17:06:15  profilanswer
 

n°1022485
boby61
Posté le 23-03-2005 à 17:18:05  profilanswer
 

c'est bon pour la fonction de recherhce !
j'ai simplement raouté un break; juste apres indice = i;
 
par contre si quelqu'un peut m'aider pour ma fonction de trie ce serai vachement cool car là ça fais 2 semaine que je n'arrive pas a faire cette fonction.
 
Pourtant elle doit simplement rangé le tableau dans l'ordre alphabétique rien de plus...
 
en tout cas merci beaucoup a ceux qui mon déja aidé

n°1022542
Taz
bisounours-codeur
Posté le 23-03-2005 à 18:02:45  profilanswer
 

sort(v.begin(), v.end());

n°1022619
boby61
Posté le 23-03-2005 à 19:37:42  profilanswer
 

J'ai les surcharge d'operateur suivant:
 

Code :
  1. ostream& operator << (ostream& flux, Date & D)
  2. {
  3.    flux << D.jour << " " << D.mois << " " << D.annee;
  4.    return flux;
  5. }
  6. istream& operator >> (istream& flux, Date & D)
  7. {
  8.    flux >> D.jour >> D.mois >> D.annee;
  9.    return flux;
  10. }
  11. ostream& operator << (ostream& flux, Identite & I)
  12. {
  13.    flux << I.nom << " " << I.prenom << " " << I.age << " " << I.statut;
  14.    return flux;
  15. }
  16. istream& operator >> (istream& flux, Identite & I)
  17. {
  18.    flux >> I.nom >> I.prenom >> I.age >> I.statut;
  19.    return flux;
  20. }
  21. ostream& operator << (ostream& flux, Client & C)
  22. {
  23.    flux << C.id << " " << C.date << " " << C.montantEmprunt << " ";
  24.    flux << C.tauxInteret << " " << C.duree << " " << C.montantInteret;
  25.    return flux;
  26. }
  27. istream& operator >> (istream& flux, Client & C)
  28. {
  29.    flux >> C.id >> C.date >> C.montantEmprunt >> C.tauxInteret >> C.duree >> C.montantInteret;
  30.    return flux;
  31. }


 
j'ai donc ecrit une fonction pour telecharger le fichier et copier son contenu dans un tableau:
Code:

Code :
  1. vector<Client> Telecharger_Fichier(string filename)
  2. {
  3.    ifstream file(filename.c_str());
  4.    Client client;
  5.    vector<Client> listeClient;
  6.    if (file)
  7.       while (file >> client)
  8.          listeClient.push_back(client);
  9.    cout << "Nombre de clients : " << listeClient.size() << endl <<endl;
  10.        
  11.    return listeClient;
  12. }


 
 
 
et là il me faut une fonction pour enregistrer les donnés du tableau dans le fichier comment puis je faire svp ?
 
voila ce que j'ai fais mais ça ne fonctionne pas:
Code:

Code :
  1. vector<Client> Enregistrer(string filename)
  2. {
  3.    ofstream file(filename.c_str());
  4.    Client client;
  5.    vector<Client> listeClient;
  6.    if (file)
  7.       while (file << client)
  8.          listeClient.push_back(client);
  9.        
  10.    return listeClient;
  11. }


Message édité par boby61 le 23-03-2005 à 19:40:01
n°1022629
boby61
Posté le 23-03-2005 à 19:54:30  profilanswer
 

Taz a écrit :

sort(v.begin(), v.end());


 
j'ai deja essayé mais cela me mais une erreur dans le fichier d'en-tete stl_algo.h

n°1022640
boby61
Posté le 23-03-2005 à 20:23:38  profilanswer
 

la fonction enregistrer c'est bon je viens de resoudre le probleme.
Il me reste plus qu'a revenir sur cette satané fonction de trie, je comprend vraimment pas pourquoi elle ne fonctionne pas...

n°1022651
Taz
bisounours-codeur
Posté le 23-03-2005 à 20:53:56  profilanswer
 

ostream& operator << (ostream& flux, Date & D)
 
 
est incorrect

n°1022669
boby61
Posté le 23-03-2005 à 21:08:36  profilanswer
 

oui c'est bon j'ai meme reussi a finir la fonction trie
 
merci a tous pour votre aide

n°1022675
Taz
bisounours-codeur
Posté le 23-03-2005 à 21:11:13  profilanswer
 

montre le résultat final complet

n°1022985
tigrou lib​re
Posté le 24-03-2005 à 08:42:21  profilanswer
 

moi aussi ça m'interresse on peu avoir le code en entier??
merci :jap:


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

  trie tableau vector... (very debutant) help me please

 

Sujets relatifs
Manipulation tableau de données de type stringMasterMind - Probleme de Rafraichissement.. Please Help!
faire passer un tableau d'une form à une autreGestion des sessions en php[Need help!!]
PHP ne peut charger l'extension mysql ! Why and Help pliz![Debutant] Problème pour les évènements wxWidget
debutant Opengl glrecti et glColor3ftrier un tableau à 2 dimension
le tableau $_SESSION avec des frames 
Plus de sujets relatifs à : trie tableau vector... (very debutant) help me please


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