Aide C++: Gestion de chaine

bifaka -  
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   -
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

3 réponses

lirey83 Messages postés 75 Date d'inscription   Statut Membre Dernière intervention   13
 
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
0
lirey83 Messages postés 75 Date d'inscription   Statut Membre Dernière intervention   13
 
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 ...
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Bon j'ai pas de compilateur sous la main mais en gros tu peux faire ça :
#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
0