Probléme de copie de tableau et d'affichage

Probléme de copie de tableau et d'affichage - C++ - Programmation

Marsh Posté le 08-03-2008 à 15:24:27    

Bonjour,  
 
Voila mon probléme, je crée un programme qui gére un file d'attente de personne.
J'ai crée une classe personne qui prend son nom et le nombre de place qu'elle reserve.
Ma file est gérer par un tableaux "en rouleau", cad, j'ai deux variable D et F qui sont les indices de la perssonne et derniére personne de la file.
Je travaille sur modulo n(taille du tableau) pour effectué le rouleau.
 
Quand ma file est pleine, je veux doubler le tableaux. Pour cele, j'en créer un nouveau, je copie les elements en place 0 du nouveau tableau. Mon probléme est là, j'ai met deux tableaux, je voudrai que le nouveaux tableau prenne le nom de l'ancien.
J'ai fais un truc, mais ca fonctionne pas.
 
 
voila mon code:
 
        { Personne *file2;                        //création d'un tbaleau de type Personne
          file2=new Personne[2*n];
          for(int i=0;i<n;i++)                    //boucle qui me permet de copier les element de file dans file2
            { file2[i]=file[(i+D)%n];}
          D=0; F=n-1;                           //reinitialisation des variables
          delete [] file;                          //J'efface file
          Personne *file;                       // je le recéer
          file=file2;                              // je fais pointé file vers fille 2
          delete[] file2;                        // j'efface file2
        }
 
 
 
Autre probléme appart, c pour l'affichage de la liste. Mon Probléme, c comment afficher en rouleaux, comment par exemple, sur un tableau de taille 10, si la première personne est a la place 5 et la derniére en place 2, comment faire rouler i?
 
voici mon code:
 
    {int nb=nombPers();
     cout<<"voici la liste d'attente: "<<endl;
 
     for (int i=D; i!=(F+1); i=(i+1)%n)
        {file[i].affiche();                        //fonction affiche ds la classe Personne qui affiche son nom et le nb de place reservé
         cout<<endl;
        }
    }
 
 
Merci d'avance pour votre aide...

Reply

Marsh Posté le 08-03-2008 à 15:24:27   

Reply

Marsh Posté le 08-03-2008 à 16:40:39    

c'est une épidémie ici ou bien ?
std::vector punaise au lieu de vous casser les burnes avec new quoi :fou:

 

et sinon, je parie 50$ que ta classe Personne ne respecte pas la forme de Coplien - à savoir constructeur par défaut, constructeur de copie, destructeur et opérateur d'affectation - sans laquelle elle ne peut fonctionner proprement


Message édité par Joel F le 08-03-2008 à 16:41:33
Reply

Marsh Posté le 08-03-2008 à 16:47:56    

Je debute en C++ desolé.
Je peux me mettre ma classe Personne si tu veux.
 
Personne .h:
 
class Personne
 
{private:  
 string nom;
 int nbplace;
 
 public:  
 Personne ();
 Personne (string, int);
 
 ~Personne();
 
 string getNom()const;
 int getNbplace()const;
 
 void saisie();
 void affiche()const;
 
};
 
Personne.cc
 
Personne::Personne()
{nom="inconnu"; nbplace=0;}
 
Personne::Personne (string n,int nb)
{nom=n; nbplace=nb;}
 
Personne::~Personne(){}
 
string Personne::getNom()const {return nom;}
int Personne :: getNbplace()const {return nbplace;}
 
void Personne::saisie()
{cout<<"Entrez le nom de la personne et le nombre de place."<<endl;
  cin>>nom>>nbplace;}
 
void Personne::affiche()const
{cout<<"Nom: "<<nom<<"  Nombre de place reserves: "<<nbplace<<endl;}
 
Merci

Reply

Marsh Posté le 08-03-2008 à 17:13:04    

C'est pas le pb que tu débutes, c'es que tu débutes du mauvais pied.
T'apprends le C++ seul ou dans une ecole/fac ?
 
bon, t'as de la chance dans ton malheur, les membres de Personne ont le bon comportement pour l'opérateur d'affectation par défaut.
Par contre, ton problème initial de recopie est un faux probleme.
Stocke tes Personne dans un std::vector<> et ca suffira, vector se debrouillera tt seul pr agrandir sa taille qd le besoin s'en fera sortir.

Reply

Marsh Posté le 08-03-2008 à 17:21:53    

J'apprend le C++ a la fac, et on a pas encore appris avec les vector. L'énoncé oblige l'utilisation d'un tableau.
 
Pour problème pour l'affichage, c bon, j'ai prouver comment faire.  
Mais reste mon problème de copie de tableau. Peux tu m'aider a la faire avec le tableau, malheureusement, j'ai pas le choix, c l'énoncé?

Reply

Marsh Posté le 08-03-2008 à 17:23:09    

au faite, j'ai gagné 50$?? :p

Reply

Marsh Posté le 08-03-2008 à 17:23:29    

donne le code complet de ta fonction de copie stp avec le prototype.
 
quelle nom la fac que je puisse la rajouter à la liste des facs de merde.

Reply

Marsh Posté le 08-03-2008 à 17:32:09    

FileAtt.h
 
class FileAtt
{ private:
  Personne file[10];
  int D;
  int F;
  int n;
 
  public:
   FileAtt();
 
  ~FileAtt();
 
  bool testfilevide();
  void testplein();
  int nombPers();
  void ajouter();
  void retirer();
  void affiche();
 
 
FileAtt.cc
 
FileAtt::FileAtt()
{D=-1; F=-1; n=10;
      Personne * file;
      file= new Personne[n];}
 
FileAtt::~FileAtt() {}
 
bool FileAtt::testfilevide()
    {return((D==-1)&&(F==-1));}
 
void FileAtt::testplein()
    { int nb=nombPers();
      if (nb==n)
        { Personne *file2;
          file2=new Personne[2*n];
          for(int i=0;i<n;i++)
            { file2[i]=file[(i+D)%n];}
          D=0; F=n-1;
          delete [] file;
          Personne *file;
          file=file2;
          delete[] file2;
          n=2*n;
        }
    }
 
int FileAtt::nombPers()
    {int nb=0;
     if((D<F)||(D>F))
        {nb= ((n-D+F)%n)+1;}
     if(D==F)
        {nb=1;}
     if((D==-1)&&(F==-1))
        {nb=0;}
     return nb;
    }
 
void FileAtt::ajouter()
    {testplein();
     Personne p;
     p.saisie();
     p.affiche();
     if (D==-1)
        {D=D+1;}
     F=(F+1)%n;
     file[F]=p;
    }
 
void FileAtt::retirer()
    {if(D==F)
        {F=-1; D=-1;}
     else {D=(D+1)%n;}
    }

Reply

Marsh Posté le 08-03-2008 à 17:42:15    

tu mélanges tout ...  
 
tu commences par déclarer ça :
private:
  Personne file[10];  
 
puis dans ta méthode void FileAtt::testplein()  
tu redefinie une variable local file que tu alloue dynamiquement.
Par quelle magie veut tu que ca modifie ton membre.
 
Je passe sur le découpage moisi de l'interface et le fait que dans ta tete tu mélanges objet,instacne, variable et données membres.
 
Donc, non, tu n'as pas gagné 50$ mais le droit de reprendre à 0.
Evites d'ecrire des methodes aussi lourde qui font tout, n'importequoi et leur contraire.
 

Reply

Marsh Posté le 08-03-2008 à 17:46:47    

tu me conseilles de faire comment, je suis un peu perdu là.

Reply

Marsh Posté le 08-03-2008 à 17:46:47   

Reply

Marsh Posté le 08-03-2008 à 17:58:05    

Code :
  1. class FileAtt
  2. { private:
  3.   Personne* file;
  4.   int D;
  5.   int F;
  6.   int n;
  7.   public:
  8.    // Forme canonique de coplien
  9.    // O.B.L.I.G.A.T.O.I.R.E - Sous peine de mort /!\
  10.    FileAtt();
  11.    FileAtt(const FileAtt& src);
  12.   ~FileAtt();
  13.    FileAtt& operator=( const FileAtt& src);
  14.   bool est_vide();
  15.   int taille();
  16.   void ajouter( const Personne& p );
  17.   void retirer();
  18.   void affiche();
  19.   protected:
  20.   // cette méthode n'a pas a etre exposée à l'utilisateur,on la masque
  21.   bool redimensionne();
  22.   }


 

Code :
  1. FileAtt::FileAtt() : D(-1),F(-1),n(10)
  2. {
  3.   file= new Personne[n];
  4. }
  5. FileAtt::~FileAtt()
  6. {
  7.   if(file) delete[] file;
  8. }
  9. FileAtt::FileAtt(const FileAtt& src)
  10. {
  11.   D = src.D;
  12.   F = src.F;
  13.   n = src.n;
  14.   file= new Personne[n];
  15.   std::copy(file,file+n,src.file);
  16. }
  17. FileAtt& FileAtt::operator=(const FileAtt& src)
  18. {
  19.   if(this != &src)
  20.   {
  21.    D = src.D;
  22.    F = src.F;
  23.    n = src.n;
  24.    if(file) delete[] file;
  25.    file= new Personne[n];
  26.    std::copy(file,file+n,src.file);
  27.   }
  28.   return *this;
  29. }
  30. bool FileAtt::est_vide()
  31. {
  32.   return((D==-1)&&(F==-1));
  33. }
  34. void FileAtt::redimensionne()
  35. {
  36.   int nb=taille();
  37.   if (nb==n)
  38.   {
  39.     Personne *file2;
  40.     file2=new Personne[2*n];
  41.    
  42.     for(int i=0;i<n;i++)
  43.     {
  44.       file2[i]=file[(i+D)%n];
  45.     }
  46.    
  47.     D=0;
  48.     F=n-1;
  49.          
  50.     if(file) delete[] file;
  51.     file=file2;
  52.     n=2*n;
  53.   }
  54. }
  55. int FileAtt::nombPers()
  56. {
  57. int nb=0;
  58. if((D==-1)&&(F==-1))   nb=0;
  59. else if(D==F)          nb = 1;
  60. else                   nb = ((n-D+F)%n)+1;
  61. return nb;
  62. }
  63. void FileAtt::ajouter(const Personne& p)
  64. {
  65. redimensionne();
  66. if (D==-1) D=D+1;
  67. F=(F+1)%n;
  68. file[F]=p;
  69. }
  70. void FileAtt::retirer()
  71. {
  72.   if(D==F) { F=-1; D=-1; }
  73.   else     D=(D+1)%n;
  74. }


 
En autre :
- jamais faire de saisie ne plein milieu d'un code comme ça. Tu saisis puis tu ajoutes
- retirer() il renverrait pas la Personne que tu viens de retirer ?

Reply

Marsh Posté le 08-03-2008 à 18:15:55    

je pense retirer diot juste faire avancer l'indice d'une place.
 
La fonction protected et "scr", on ne l'a pas appris, a quoi cela consiste?
 
on appris comme forme: Nomclass& operator=(const Nomclass& )
(c la partie du cours que j'ai pas trés bien capter.

Reply

Marsh Posté le 08-03-2008 à 18:23:13    

src c'est juste le nom de l'argument :|
 
si t'as pas vu protected, enleve eux c pas vital ici ...
 
Quelle FAC donc ?

Reply

Marsh Posté le 08-03-2008 à 18:29:45    

fac de science de montpellier ^^
 
et oui, les cours c de la merde^^
 
(à la place de scr, tu peux mettre se que je veux, savoir si j'ai bien compris...)

Reply

Marsh Posté le 08-03-2008 à 18:44:19    

Au faite, merci beaucoup pour ton aide. On a juste le cours sur les pointeur, ils nous ont pas pas expliquer comment réécrire la méthode de copie.
 
Merci beaucoup...

Reply

Sujets relatifs:

Leave a Replay

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