Aide C++: Gestion de chaine
salut,
quelqu'un pourrait m'aider à corriger mon code qui ne marche pas bien? cafonctionne sans erreurs mais ca ne trie pas par nom.
donc je veux avoir un truc comme ca à la fin:
bond james 1762381017
dante bertrand 1562381017
eric fils 1632381017
marc denzel 16323810
smith henry 1632381017
thomas elliot 1632381017
et voilà le code
#include <iostream>
#include <conio.h>
#include <string.h>
class trier{
char* key;
public:
trier(char *k)
{
key=&k[0];
}
static trier* sinking_sort(trier* feld,int n)
{
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(strcmp(feld[i].key,feld[j].key)>0)
{
trier *temp=NULL;
*temp = feld[j];
feld[j] = feld[i];
feld[i] = *temp;
}
return feld;
}
};
class telefonBook : public trier{
char *Name;
char *firstName;
int telefonNumber;
public:
telefonBook(char *na,char *v,int t):trier(na)
{
Name=&na[0];
firstName=&v[0];
telefonNumber=t;
}
void telefonBook::getEntree()
{
std::cout<<this->Name<<","<<this->firstName<<","<<this->telefonNumber<<std::endl;
}
void output(telefonBook* feld,int n){
for(int i=0;i<n;i++)
std::cout<<feld[i].Name<<feld[i].firstName<<feld[i].telefonNumber;
}
};
int main()
{
telefonBook *t[6];
t [0]=new telefonBook("thomas","elliot",1632381017);
t [1]=new telefonBook("dante","bertrand",1562381017);
t [2]=new telefonBook("bond","james",1762381017);
t [3]=new telefonBook("smith","henry",1632381017);
t [4]=new telefonBook("marc","denzel",1632381017);
t [5]=new telefonBook("eric","fils",1632381017);
for(int i=0;i<6;i++ )
{
t[i]->getEntree();
}
t[0]->trier::sinking_sort((trier*)t,6);
for(int i=0;i<6;i++ )
{
t[i]->getEntree();
}
getch();
return 0;
} //END
merci
quelqu'un pourrait m'aider à corriger mon code qui ne marche pas bien? cafonctionne sans erreurs mais ca ne trie pas par nom.
donc je veux avoir un truc comme ca à la fin:
bond james 1762381017
dante bertrand 1562381017
eric fils 1632381017
marc denzel 16323810
smith henry 1632381017
thomas elliot 1632381017
et voilà le code
#include <iostream>
#include <conio.h>
#include <string.h>
class trier{
char* key;
public:
trier(char *k)
{
key=&k[0];
}
static trier* sinking_sort(trier* feld,int n)
{
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(strcmp(feld[i].key,feld[j].key)>0)
{
trier *temp=NULL;
*temp = feld[j];
feld[j] = feld[i];
feld[i] = *temp;
}
return feld;
}
};
class telefonBook : public trier{
char *Name;
char *firstName;
int telefonNumber;
public:
telefonBook(char *na,char *v,int t):trier(na)
{
Name=&na[0];
firstName=&v[0];
telefonNumber=t;
}
void telefonBook::getEntree()
{
std::cout<<this->Name<<","<<this->firstName<<","<<this->telefonNumber<<std::endl;
}
void output(telefonBook* feld,int n){
for(int i=0;i<n;i++)
std::cout<<feld[i].Name<<feld[i].firstName<<feld[i].telefonNumber;
}
};
int main()
{
telefonBook *t[6];
t [0]=new telefonBook("thomas","elliot",1632381017);
t [1]=new telefonBook("dante","bertrand",1562381017);
t [2]=new telefonBook("bond","james",1762381017);
t [3]=new telefonBook("smith","henry",1632381017);
t [4]=new telefonBook("marc","denzel",1632381017);
t [5]=new telefonBook("eric","fils",1632381017);
for(int i=0;i<6;i++ )
{
t[i]->getEntree();
}
t[0]->trier::sinking_sort((trier*)t,6);
for(int i=0;i<6;i++ )
{
t[i]->getEntree();
}
getch();
return 0;
} //END
merci
3 réponses
Salut,
Je pense qu'il faudrait que tu repenses l'organisation de ton code de la manière suivante :
- la classe telefonBook n'a pas à dériver de la classe trier. Elle doit simplement gérer les propriétés d'une personne (et devrait donc s'appeler simplement "contact").
- la classe trier doit devenir ce que l'on appelle une liste qui gère l'ensemble des personnes (c'est elle qui doit s'appeler telefonBook). Pour cela, elle doit donc avoir entre autre les méthodes suivantes :
- Ajout/Suppression d'un personne
- Trie des personnes
- Méthodes d'affichage des personnes
Je pense qu'il faudrait que tu repenses l'organisation de ton code de la manière suivante :
- la classe telefonBook n'a pas à dériver de la classe trier. Elle doit simplement gérer les propriétés d'une personne (et devrait donc s'appeler simplement "contact").
- la classe trier doit devenir ce que l'on appelle une liste qui gère l'ensemble des personnes (c'est elle qui doit s'appeler telefonBook). Pour cela, elle doit donc avoir entre autre les méthodes suivantes :
- Ajout/Suppression d'un personne
- Trie des personnes
- Méthodes d'affichage des personnes
Regardes l'exemple suivant :
https://codes-sources.commentcamarche.net/
Dans ce cas, il s'agit de liste chainée, mais le principe est le même (à la place du pointeur "suivant", il suffit juste d'avoir un tableau qui contient les pointeurs des élèves). Il suffit juste de rajouter la fonction de trie que tu as écrit ...
https://codes-sources.commentcamarche.net/
Dans ce cas, il s'agit de liste chainée, mais le principe est le même (à la place du pointeur "suivant", il suffit juste d'avoir un tableau qui contient les pointeurs des élèves). Il suffit juste de rajouter la fonction de trie que tu as écrit ...
Bon j'ai pas de compilateur sous la main mais en gros tu peux faire ça :
Bonne chance
#include <iostream> #include <fstream> #include <set> #include <sstream> #include <string> // La structure décrivant une ligne de fichier typedef struct _data_t{ std::string firstname; std::string name; unsigned int phone; } data_t; // Lit une ligne de fichier line et la stocke dans data bool read_line(data_t & data,const std::string & line){ std::istringstream iss (line,std::istringstream::in); iss >> data.name >> data.firstname >> data.phone; std::cout << "Ligne lue : name = " << data.name << " firstname = " << data.firstname << " phone = " << phone << std::endl; return true; } // Lit un fichier file_in et stocke toutes les infos dans data_set bool read_file(std::ifstream & file_in,std::set<data_t> & data_set){ if (fichier){ // ce test échoue si le fichier n'est pas ouvert std::string ligne; // variable contenant chaque ligne lue // cette boucle s'arrête dès qu'une erreur de lecture survient while ( std::getline( fichier, ligne ) ){ data_t data_cur; if(!read_line(data_cur,ligne)){ std::cerr << "Ligne invalide : " << ligne << std::endl; } data_set.insert(data_cur); } return true; } return false; } // Cette structure défini la relation d'ordre pour trier les élements // de type data_t (dans les std::map, std::set etc...) struct sort_by_name_firstname_phone{ bool operator()(const data_t & x,const data_t & y){ return (x.name < y.name) || ((x.name == y.name) && (x.firstname < y.firstname)) || ((x.name == y.name) && (x.firstname == y.firstname) && (x.phone < y.phone)); } }; // La fonction main int main(){ // L'ensemble des données, ordonnées par // sort_by_name_firstname_phone std::set<data_t,sort_by_name_firstname_phone> data_set; const char *filename_in = "plop.txt"; std::ifstream file_in(filename_in); if(!read_file(file_in,data_set)){ std::cerr << "Impossible d'ouvrir le fichier " << filename_in << std::endl; return 1; } // Afficher l'ensemble std::set<data_t,sort_by_name_firstname_phone>::const_iterator sit (data_set.begin()), send(data_set.end()); for(;sit!=send;++sit){ const data_t & data_cur = *sit; std::cout << "name = " << data.name << " firstname = " << data.firstname << " phone = " << phone << std::endl; } return 0; }
Bonne chance