Aide C++: Gestion de chaine

Fermé
bifaka - 18 janv. 2007 à 12:18
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 18 janv. 2007 à 20:28
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 mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 13
18 janv. 2007 à 16:59
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 mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 13
18 janv. 2007 à 17:24
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
18 janv. 2007 à 20:28
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