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

trie tableau vector... (very debutant) help me please - C++ - Programmation

Marsh Posté le 22-03-2005 à 19:24:59    

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
Reply

Marsh Posté le 22-03-2005 à 19:24:59   

Reply

Marsh Posté le 23-03-2005 à 00:19:19    

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);

Reply

Marsh Posté le 23-03-2005 à 00:44:57    

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. }

Reply

Marsh Posté le 23-03-2005 à 07:25:07    

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é

Reply

Marsh Posté le 23-03-2005 à 12:35:00    

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
Reply

Marsh Posté le 23-03-2005 à 13:44:55    

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
Reply

Marsh Posté le 23-03-2005 à 14:00:03    

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

Reply

Marsh Posté le 23-03-2005 à 14:20:20    

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

Reply

Marsh Posté le 23-03-2005 à 14:59:49    

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

Reply

Marsh Posté le 23-03-2005 à 17:06:15    

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  :??:

Reply

Marsh Posté le 23-03-2005 à 17:06:15   

Reply

Marsh Posté le 23-03-2005 à 17:18:05    

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é

Reply

Marsh Posté le 23-03-2005 à 18:02:45    

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

Reply

Marsh Posté le 23-03-2005 à 19:37:42    

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
Reply

Marsh Posté le 23-03-2005 à 19:54:30    

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

Reply

Marsh Posté le 23-03-2005 à 20:23:38    

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...

Reply

Marsh Posté le 23-03-2005 à 20:53:56    

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

Reply

Marsh Posté le 23-03-2005 à 21:08:36    

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

Reply

Marsh Posté le 23-03-2005 à 21:11:13    

montre le résultat final complet

Reply

Marsh Posté le 24-03-2005 à 08:42:21    

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

Reply

Sujets relatifs:

Leave a Replay

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