Construire une ligne en C++ [Résolu]

Messages postés
15
Date d'inscription
samedi 22 janvier 2011
Statut
Membre
Dernière intervention
7 octobre 2013
- - Dernière réponse : 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
Afficher la suite 

17 réponses

Meilleure réponse
Messages postés
14636
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 octobre 2019
90
3
Merci
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...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 193 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BunoCS
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
86
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 193 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
86
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 193 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
15
Date d'inscription
samedi 22 janvier 2011
Statut
Membre
Dernière intervention
7 octobre 2013
0
Merci
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
Commenter la réponse de zora700
Messages postés
15
Date d'inscription
samedi 22 janvier 2011
Statut
Membre
Dernière intervention
7 octobre 2013
0
Merci
je vous remercie tous pour votre aide
Commenter la réponse de zora700
Messages postés
15
Date d'inscription
samedi 22 janvier 2011
Statut
Membre
Dernière intervention
7 octobre 2013
0
Merci
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
Commenter la réponse de zora700
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
86
0
Merci
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
Commenter la réponse de cptpingu
Messages postés
15
Date d'inscription
samedi 22 janvier 2011
Statut
Membre
Dernière intervention
7 octobre 2013
0
Merci
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();
}
}
Commenter la réponse de zora700
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
86
0
Merci
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
Commenter la réponse de cptpingu
Messages postés
15
Date d'inscription
samedi 22 janvier 2011
Statut
Membre
Dernière intervention
7 octobre 2013
0
Merci
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++
Commenter la réponse de zora700
Messages postés
15
Date d'inscription
samedi 22 janvier 2011
Statut
Membre
Dernière intervention
7 octobre 2013
0
Merci
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??
Commenter la réponse de zora700
Messages postés
15
Date d'inscription
samedi 22 janvier 2011
Statut
Membre
Dernière intervention
7 octobre 2013
0
Merci
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);


};
Commenter la réponse de zora700
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
86
0
Merci
(*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
Commenter la réponse de cptpingu
Messages postés
15
Date d'inscription
samedi 22 janvier 2011
Statut
Membre
Dernière intervention
7 octobre 2013
0
Merci
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
Commenter la réponse de zora700
Messages postés
15
Date d'inscription
samedi 22 janvier 2011
Statut
Membre
Dernière intervention
7 octobre 2013
0
Merci
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
Commenter la réponse de zora700
Messages postés
15
Date d'inscription
samedi 22 janvier 2011
Statut
Membre
Dernière intervention
7 octobre 2013
0
Merci
je vous remercie pour votre aide CptPingu et pour toutes ces explications :)
Commenter la réponse de zora700
Messages postés
15
Date d'inscription
samedi 22 janvier 2011
Statut
Membre
Dernière intervention
7 octobre 2013
0
Merci
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
Commenter la réponse de zora700