Construire une ligne en C++

Résolu
zora700 Messages postés 15 Date d'inscription samedi 22 janvier 2011 Statut Membre Dernière intervention 7 octobre 2013 - 9 mars 2012 à 13:28
zora700 Messages postés 15 Date d'inscription samedi 22 janvier 2011 Statut Membre Dernière intervention 7 octobre 2013 - 11 mars 2012 à 20:23
svp j'ai besoin de votre aide

aperçu de la classe Cellule:
class Cellule
{
  	public:
friend  ostream & operator << (ostream &os, Cellule & c);
friend  istream & operator >> (istream &is, Cellule & c);
       private:
double   		maValeur;
bool	 		maPresence;

j'ai définis la classe Ligne comme suit:
class Ligne  {
      public :

      map<string, Cellule>cel ;

      //Consruire la ligne avec ses libelles
      Ligne (const vector<string>& lib);
};

et pour construire la ligne avec ses libelles
Ligne::Ligne(const vector<string>& lib)
{
    Ligne::Ligne(const vector<string>& lib)
    for(int i(0);i<lib.size();i++)
    {
        if(find(lib[i])==end())
        {
            (*this)[lib[i]];
        }
    }
}


mais ça marche pas alors je ne sais comment construire la ligne

17 réponses

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
9 mars 2012 à 14:03
Hello,
Ligne::Ligne(const vector<string>& lib)
{
    Ligne::Ligne(const vector<string>& lib)

--> copier/coller foireux?

for(int i(0);

--> l'initialisation des variables est à revoir... Il faut plutôt faire:
for(int i=0; i<lib.size(); i++)


if(find(lib[i])==end())

ça ne compilera pas car ta classe ligne ne contient pas de méthode find(), ni end()...Je pense que tu as voulu faire ceci:
cel.find();

@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 mars 2012 à 15:32
Bonjour.

- Un attribut de classe se différencie généralement en y mettant '_' devant.
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- On évite le mot clé "friend". Bien que parfois indispensable, sa présence est souvent synonyme de mauvaise conception du code...

En propre:
class Cellule
{
public:
   std::ostream& print(std::ostream& os) const;
   std::istream& get(std::istream& is);
private:
   double _maValeur;
   bool _maPresence;
};

std::ostream& operator<<(std::ostream& os, const Cellule& c);
std::istream& operator>>(std::istream& is, Cellule& c);


std::ostream& operator<<(std::ostream& os, const Cellule& c)
{
  c.print(os);
  return os;
}

std::istream& operator>>(std::istream& is, Cellule& c)
{
  c.get(os);
  return os;
}


class Ligne
{
public:
   Ligne(const std::vector<std::string>& lib);

private:
   std::map<std::string, Cellule> _cel;
};


Ligne::Ligne(const std::vector<std::string>& lib)
{
  const size_t size = lib.size(); // Pour éviter de rappeler la fonction size() à chaque tour...
  for(size_t i = 0; i < size; ++i)
    _cel[lib[i]]; // Force la création d'une Cellule pour un label donné
// Pas besoin de find pour vérifier son existence. Passer plusieurs fois au même endroit ne le créera qu'une seul fois.


@buno: int i(0) est strictement équivalent à int i = 0; Mais je t'accorde que c'est très moche :p

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
10 mars 2012 à 16:15
Je ne vois pas où est le problème. Dire "ça ne marche pas", ça ne veut rien dire...
Est-ce un problème d'exécution ou de compilation ?

Je viens de faire un simple test et ça fonctionne très bien:
#include <map>
#include <vector>
#include 

class Ligne
{
  //code

public:
  void print(std::ostream& os) const
  {
    os << "Ligne ?";
  }
};

std::ostream& operator<<(std::ostream& os, const Ligne& ligne)
{
  ligne.print(os);
  return os;
}

class Feuille
{
public:
  typedef std::map<std::string, Ligne> feuille_type;
  typedef std::vector<std::string> ligne_type;
  typedef feuille_type::iterator iterator;
  typedef feuille_type::const_iterator const_iterator;

public:
  Feuille(const ligne_type& lib);

  void display() const;
private:
  feuille_type _lig;
  std::string _titreFeuille;
};

Feuille::Feuille(const ligne_type& lib)
{
  const size_t size = lib.size();
  for (size_t i = 0; i < size; ++i)
    _lig[lib[i]];
}

void
Feuille::display() const
{
  Feuille::const_iterator end = _lig.end();
  for (Feuille::const_iterator it = _lig.begin(); it != end; ++it)
    std::cout << it->first << " -> " << it->second << std::endl;
}

int main()
{
  Feuille::ligne_type tab;
  tab.push_back("test1");
  tab.push_back("test2");
  tab.push_back("test3");
  Feuille f(tab);

  f.display();

  return 0;
}



________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
zora700 Messages postés 15 Date d'inscription samedi 22 janvier 2011 Statut Membre Dernière intervention 7 octobre 2013
9 mars 2012 à 13:45
j'ai oublier de dire que je dois construire trois classe cellule,ligne et feuille pour gérer les note des étudiants et afficher les noms les notes et les matières et que la ligne est un dictionnaire (Matière étudiée, Cellule)
la classe Cellule fournie : l’attribut maValeur représente la note, l’attribut maPresence précise si la
note est à prendre en compte

merci pour votre aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zora700 Messages postés 15 Date d'inscription samedi 22 janvier 2011 Statut Membre Dernière intervention 7 octobre 2013
9 mars 2012 à 16:33
je vous remercie tous pour votre aide
0
zora700 Messages postés 15 Date d'inscription samedi 22 janvier 2011 Statut Membre Dernière intervention 7 octobre 2013
9 mars 2012 à 17:10
le constructeur marche correctement grâce à vous
beh je suis entrain de définir le fonction saisir
void Ligne::Saisir()
{
Ligne::iterator it;//declaration du iterator

#ifdef MAP
cout <<"affichage de la methode Ligne::Saisir()"<<endl;
#endif

for( it =_cel.begin(); it != _cel.end(); it++)
{

cout<first<<endl;
it->second.Saisir();
}
}

mais à chaque fois j'ai une erreur au niveau de la déclaration de l'iterator si qlq à une idée merci de m'éclaircir les choses
puisque moi j'ai travaillé sur tt le projet et mnt j'essaye de corriger mes erreurs
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 mars 2012 à 17:21
Dans ton header:

class Ligne
{
public:
  typedef std::map<std::string, Cellule>::iterator iterator;

// code [...]
};


Dans ton fichier de code:
void Ligne::saisir()
{
#ifdef MAP
std::cout << "affichage de la methode Ligne::saisir()" << std::endl;
#endif

iterator end = _cel.end();
for (iterator it = _cel.begin(); it != end; ++it)
{
  std::cout << it->first << endl;
  it->second.saisir();
}


Remarques:
- On définit les variables de boucle dans les boucles directement.
- Dans un for, en deuxième partie, on évite de mettres des expressions, car elles seront recaculées à chaque tour ! (D'où ma variable "end").
- On utilise ++it plutôt que it++ (++it est plus rapide, car il ne fait pas de copie, contrairement à it++)

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
zora700 Messages postés 15 Date d'inscription samedi 22 janvier 2011 Statut Membre Dernière intervention 7 octobre 2013
9 mars 2012 à 17:41
Merci pour votre réponse mais moi j'ai déjà trouvé la solution et ça marché pour moi
je l'ai définis comme suit:
void Ligne::Saisir()
{
map<std::string, Cellule>::iterator it;//declaration du iterator

#ifdef MAP
cout <<"affichage de la methode Ligne::Saisir()"<<endl;
#endif

for( it =_cel.begin(); it != _cel.end(); it++)
{

cout<first<<endl;
it->second.Saisir();
}
}
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 mars 2012 à 18:02
Merci pour votre réponse mais moi j'ai déjà trouvé la solution et ça marché pour moi

Ça ne veut pas dire que c'est la meilleur solution, ou la plus élégante.
Il y a quelques maladresses dans ta version que je t'ai expliqué dans mon posts précédent.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
zora700 Messages postés 15 Date d'inscription samedi 22 janvier 2011 Statut Membre Dernière intervention 7 octobre 2013
10 mars 2012 à 00:19
bsr tt le monde

svp j'ai besoin de définir une fonction moyenne()qui fait le calcul en se basant sur les notes de ma classe Ligne
j'ai commencer par mettre le code suivant
void Ligne::Moyenne()
{
    map<std::string, Cellule>::iterator it;
    float som=0.0;
    for(it=_cel.begin();it!=_cel.end();it++)
    {
        som+=it->second;

    }


}

je veux seulement des indications pour que je puisse terminer le code je suis débutante en C++
0
zora700 Messages postés 15 Date d'inscription samedi 22 janvier 2011 Statut Membre Dernière intervention 7 octobre 2013
10 mars 2012 à 00:23
je ne sais pas ce que je dois faire pour accéder à la note de chaque cellule est ce que je dois utiliser les get ou non??
0
zora700 Messages postés 15 Date d'inscription samedi 22 janvier 2011 Statut Membre Dernière intervention 7 octobre 2013
10 mars 2012 à 02:36
svp voilà ma dernière question pour ce soir
je sais que j'ai poser trop de question mais j'ai pas le choix

je dois construire une feuille avec les libelles verticaux et horizontaux et le nom voilà mon code mais ça me donne une erreur au niveau de :(*this)
Feuille::Feuille(const std::vector<std::string>& lib,const std::vector<std::string>& libH,const string & leNom):titreFeuille(leNom)
{
  for(unsigned  i=0;i<libH.size();i++)
  {
      if(_lig.find(lib[i])==_lig.end())
      {
          (*this)[libH[i]]=Ligne(lib);
      }
  }
}

si vous avez une idée merci de me le mentionner
j'ai déjà réaliser les deux classe cellule et ligne avec
class Feuille
{
    private:
    string titreFeuille;
    std::map<std::string, Ligne> _lig;

    public:
    Feuille(const std::vector<std::string>& lib,const std::vector<std::string>& libH,const string & leNom);


};
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
10 mars 2012 à 14:50
(*this)[libH[i]]=Ligne(lib);

Ceci est équivalent à cela:
operator[](libH[i]) = Ligne(lib);


Ma question est donc: Mais que cherches-tu à faire ? Si c'est juste mettre un élément dans _lig, autant l'écrire directement.

Enfin, tu ne suis pas les conseils que je t'ai donné (tu refais les mêmes maladresses dont je t'ai déjà parlé) + la fonction que tu essaies d'écrire t'a déjà été donné auparavant (avec explication en commentaire).
Ça ne donne pas vraiment envie de t'aider...

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
zora700 Messages postés 15 Date d'inscription samedi 22 janvier 2011 Statut Membre Dernière intervention 7 octobre 2013
10 mars 2012 à 15:26
je cherche à construire une feuille avec les libelles nom étudiants et matière
et c'est pas question que je veux pas suivre vos conseils sauf que j'ai essayer avec votre méthode ainsi celle de la prof mais j'ai toujours le même soucis çàd il me demande à chaque fois de définir l’opérateur []

et comme je vous ai dis je suis débutante en C++ nous l'avons étudier en 6 jours seulement si j'ai le temps bien sure je vais poser ce genre de question mais j'ai besoin des explication claire pour que je puisse définir ce constructeur

je vous remercie Cptpingu pour votre réponse
0
zora700 Messages postés 15 Date d'inscription samedi 22 janvier 2011 Statut Membre Dernière intervention 7 octobre 2013
10 mars 2012 à 15:53
selon vous j'ai mis le code suivant:

class Feuille{
      public :
      Feuille( const vector <string> & libH);
      private:
      std::map<std::string, Ligne> _lig;
      string titreFeuille;
      };


et la définition du constructeur et comme suit:
Feuille::Feuille(const std::vector<std::string>& libH)
{
  const size_t size = libH.size(); 
  for(size_t i = 0; i < size; ++i)
     _lig[libH[i]];}


mais ça marche pas
0
zora700 Messages postés 15 Date d'inscription samedi 22 janvier 2011 Statut Membre Dernière intervention 7 octobre 2013
11 mars 2012 à 20:19
je vous remercie pour votre aide CptPingu et pour toutes ces explications :)
0
zora700 Messages postés 15 Date d'inscription samedi 22 janvier 2011 Statut Membre Dernière intervention 7 octobre 2013
11 mars 2012 à 20:23
Bonsoir tout le monde,
j'ai besoin de votre aide ,je veux insérer labelle cellule dans ma classe feuille ça se compile mais j'ai pas de résultat
voilà mon code :
void Feuille::InsererLibelleColonne()
{
    Feuille::iterator it;
    string mat;
    cout << "Ajouter une matiere  ?" << endl;
    cin >> mat;
    for( it = begin(); it != end(); it++){
if ( it->second.find(mat) != it->second.end())
{
    cout<<"la matiere a été inséré"<<endl;
} else
{ cout<<"cette matiere existait déjà !"<<endl;
}

}}

et ma classe feuille est comme suit:
#include "Cellule.h"
#include "Ligne.h"



class Feuille : public map<string,Ligne>{
    private:
    string titreFeuille;
    public:
      Feuille(std::vector <std::string> & m, std::vector <std::string> & e );

      //Methode
      void Afficher();
      void Saisir();
      void InsererLibelleColonne();
}


si vous avez une idée merci de me le mentionner
0
Rejoignez-nous