Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
853 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Probléme de copie de tableau et d'affichage

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probléme de copie de tableau et d'affichage

n°1699273
ophelie88
Posté le 08-03-2008 à 15:24:27  profilanswer
 

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

mood
Publicité
Posté le 08-03-2008 à 15:24:27  profilanswer
 

n°1699294
Joel F
Real men use unique_ptr
Posté le 08-03-2008 à 16:40:39  profilanswer
 

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
n°1699296
ophelie88
Posté le 08-03-2008 à 16:47:56  profilanswer
 

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

n°1699308
Joel F
Real men use unique_ptr
Posté le 08-03-2008 à 17:13:04  profilanswer
 

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.

n°1699310
ophelie88
Posté le 08-03-2008 à 17:21:53  profilanswer
 

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

n°1699312
ophelie88
Posté le 08-03-2008 à 17:23:09  profilanswer
 

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

n°1699313
Joel F
Real men use unique_ptr
Posté le 08-03-2008 à 17:23:29  profilanswer
 

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.

n°1699317
ophelie88
Posté le 08-03-2008 à 17:32:09  profilanswer
 

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

n°1699323
Joel F
Real men use unique_ptr
Posté le 08-03-2008 à 17:42:15  profilanswer
 

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.
 

n°1699326
ophelie88
Posté le 08-03-2008 à 17:46:47  profilanswer
 

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

mood
Publicité
Posté le 08-03-2008 à 17:46:47  profilanswer
 

n°1699328
Joel F
Real men use unique_ptr
Posté le 08-03-2008 à 17:58:05  profilanswer
 

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 ?

n°1699330
ophelie88
Posté le 08-03-2008 à 18:15:55  profilanswer
 

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.

n°1699332
Joel F
Real men use unique_ptr
Posté le 08-03-2008 à 18:23:13  profilanswer
 

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

n°1699335
ophelie88
Posté le 08-03-2008 à 18:29:45  profilanswer
 

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

n°1699339
ophelie88
Posté le 08-03-2008 à 18:44:19  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Probléme de copie de tableau et d'affichage

 

Sujets relatifs
[PHP] fonction: probleme de debutantproblème wmode ou z-index avec firefox
Problème de connection Oracle depuis ASPProblème d'accent avec Net::FTP
rafraichissement affichagejavascript: problème avec des chaines qui contiennent du php
Formulaire et affichage de donnée venant de la base (php/mysql)Problème lecture flux output process
C# -- Problème d'éxécution de requête sur la base SQL server[SQLServer] Probleme avec un type de données utilisateur
Plus de sujets relatifs à : Probléme de copie de tableau et d'affichage


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR