IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

initialisation d'un vector d'objet


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 40
    Par défaut initialisation d'un vector d'objet
    Bonjour a tous et toutes,
    Je suis entrain de réaliser un projet du gestion des notes des étudiants pour cela j'ai crée la classe matière qui contient le nom et le coefficient de la matière ainsi que les notes obtenu par un étudiant voici le code de la classe matière
    voici matiere.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #include<iostream>
    #include<string>
     
    using namespace std;
    class Matiere
    {
    	string m_nom;
    	float m_cofds,m_coftp,m_cofexm,m_cof;
    	double m_ds,m_tp,m_exm;
    public:
    	Matiere():m_nom(" "),m_cof(0),m_ds(0),m_tp(0),m_exm(0),m_cofds(0),m_coftp(0),m_cofexm(0){} ;
    	Matiere(string nom,float cof,float cofds,float coftp,float cofexm,double ds,double tp,double exm):m_nom(nom)
    	,m_cof(cof),m_cofds(cofds),m_coftp(coftp),m_cofexm(cofexm),m_ds(ds),m_tp(tp),m_exm(exm){};
    	friend istream &operator>>(istream &,Matiere &);
    	friend ostream &operator<<(ostream &,Matiere);
    	double calculMoyenMatiere();
    	double calculTotalMatiere();
    	istream & ajouterMatiere(istream &);
    	void afficherMatiere(ostream &);
    };
    voici matiere.ccp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
    #include "Matiere.h"
    istream &operator>>(istream &in,Matiere &mat)
    {
    	cout<<"donner le nom \t";
    	in>>mat.m_nom;
    	cout<<endl;
     
        cout<<"le coefficiant de la matiere\t";
    	in>>mat.m_cof;
    	cout<<endl;
     
        cout<<"cof de DS \t";
    	in>>mat.m_cofds;
    	cout<<endl;
     
    	cout<<"cof de TP \t";
    	in>>mat.m_coftp;
    	cout<<endl;
     
    	cout<<"cof exam \t";
    	in>>mat.m_cofexm;
    	cout<<endl;
     
    	cout<<"note de DS \t";
    	in>>mat.m_ds;
    	cout<<endl;
     
    	cout<<"note de TP \t";
    	in>>mat.m_tp;
    	cout<<endl;
     
    	cout<<"note exam \t"; 
    	in>>mat.m_exm;
    	cout<<endl;
     
    	return in;
    }
    ostream &operator<<(ostream &out, Matiere mat)
    {
    	out<<"nomMatiere\t";
    	out<<mat.m_nom<<endl;
    	out<<"cofMatiere\t";
    	out<<mat.m_cof<<endl;
    	out<<"noteTP\t";
        out<<mat.m_tp<<endl;
    	out<<"noteDS\t";
    	out<<mat.m_ds<<endl;
    	out<<"noteExam\t";
        out<<mat.m_exm<<endl;
    	out<<"moyMatiere\t";
    	out<<mat.calculMoyenMatiere()<<endl;
    	out<<"Total matiere\t";
    	out<<mat.calculTotalMatiere();
    	out<<endl;
    	return out;
    }
     
    double Matiere::calculMoyenMatiere()
    {
    	return (m_cofds*m_ds + m_coftp*m_tp + m_cofexm*m_exm)/(m_cofexm + m_cofds + m_coftp);
    }
     
    double Matiere::calculTotalMatiere()
    {
    	return (m_cof*calculMoyenMatiere());
    }
     
    istream &Matiere::ajouterMatiere(istream &in)
    {
    	cout<<"donner le nom \t";
    	in>>m_nom;
    	cout<<endl;
     
        cout<<"le coefficiant de la matiere\t";
    	in>>m_cof;
    	cout<<endl;
     
        cout<<"cof de DS \t";
    	in>>m_cofds;
    	cout<<endl;
     
    	cout<<"cof de TP \t";
    	in>>m_coftp;
    	cout<<endl;
     
    	cout<<"cof exam \t";
    	in>>m_cofexm;
    	cout<<endl;
     
    	cout<<"note de DS \t";
    	in>>m_ds;
    	cout<<endl;
     
    	cout<<"note de TP \t";
    	in>>m_tp;
    	cout<<endl;
     
    	cout<<"note exam \t"; 
    	in>>m_exm;
    	cout<<endl;
     
       return in;
    }
    void Matiere::afficherMatiere(ostream &out)
    {
    	out<<"nomMatiere\t";
    	out<<m_nom<<endl;
    	out<<"cofMatiere\t";
    	out<<m_cof<<endl;
    	out<<"noteTP\t";
        out<<m_tp<<endl;
    	out<<"noteDS\t";
    	out<<m_ds<<endl;
    	out<<"noteExam\t";
        out<<m_exm<<endl;
    	out<<"moyMatiere\t";
    	out<<calculMoyenMatiere()<<endl;
    	out<<"Total matiere\t";
    	out<<calculTotalMatiere();
    	out<<endl;
    }
    Ensuit, j'ai réalisé La classe résultat
    resultat.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #include <vector>
    #include "Matiere.h"
    using namespace std;
     
    class Resultat
    {
    private:
    	  vector <Matiere> m_mat;
    public:
    	Resultat(){};
    	friend istream &operator>>(istream &,Resultat &);
    	friend ostream &operator<<(ostream &,Resultat);
     
    };
    resultat.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include "Resultat.h"
    istream &operator>>(istream &in,Resultat &r)
    {
        for(int i=0;i<30;i++)
    	r.m_mat[i].ajouterMatiere(in);
     
    	return in;
    }
    ostream &operator<<(ostream &out, Resultat r)
    {
        for(int i=0;i<30;i++)
    		r.m_mat[i].afficherMatiere(out);
    	out<<endl;
    	return out;
    }
    J'ai crée une fonction main pour tester la classe résultat voici son code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "Resultat.h"
    void main()
    {
    	Resultat r;
     
    	cin>>r;
     
    	cout<<r;
    }
    mais le programme se bloque et je ne sais pas d'où provient le probléme.
    et merci d'avance pour votre aide et vos remarque.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Par défaut
    Tu n'auras pas de problèmes car ton type matiere est default-initializable.
    Juste fait une méthode dans Resultat ou tu ajoutes des matieres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Resultat
    {
     ..
     void AjouteMatiere(matiere const& m)
     {
      m_mat.push_back(m);  // copie ici, à travers matiere(matiere const&) généré par le compilateur.
     }
    };
    utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(int,char**)
    {
     Resultats r;
     r .AjouteMatiere(
         matiere("francais", 3.f, 4.f, 2.f, 1.f, 12.f, 16.f, 9.f));
      ...
    }
    EDIT: ok je vois tu avais implémenté ajouter matière dans tes operateurs de flux. Tres bizare !
    M'enfin, mettons. ton probleme est que tu ne nous a pas montré l'implementation du constructeur de Resultat (en l'etat ne compile pas car il manque {} ou un . Tu as juste a faire m_mat.resize(30); dedans.

  3. #3
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 40
    Par défaut
    merci pour ton aide

  4. #4
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 40
    Par défaut
    Mon problème maintenant est comment remplir les champs d'objet matière dans le vector m_mate de la classe résultat.

    Remarque:
    J'ai changé un peu dans le code
    classe matiere
    matiere.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #include<iostream>
    #include<string>
     
    using namespace std;
    class Matiere
    {
    	string m_nom;
    	float m_cofds,m_coftp,m_cofexm,m_cof;
    	double m_ds,m_tp,m_exm;
    public:
    	Matiere():m_nom(" "),m_cof(0),m_ds(0),m_tp(0),m_exm(0),m_cofds(0),m_coftp(0),m_cofexm(0){} ;
    	Matiere(string nom,float cof,float cofds,float coftp,float cofexm,double ds,double tp,double exm):m_nom(nom)
    	,m_cof(cof),m_cofds(cofds),m_coftp(coftp),m_cofexm(cofexm),m_ds(ds),m_tp(tp),m_exm(exm){};
    	friend istream &operator>>(istream &,Matiere &);
    	friend ostream &operator<<(ostream &,Matiere);
    	double calculMoyenMatiere();
    	double calculTotalMatiere();
     
    };
    matiere.ccp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    #include "Matiere.h"
    istream &operator>>(istream &in,Matiere &mat)
    {
    	cout<<"donner le nom \t";
    	in>>mat.m_nom;
    	cout<<endl;
     
        cout<<"le coefficiant de la matiere\t";
    	in>>mat.m_cof;
    	cout<<endl;
     
        cout<<"cof de DS \t";
    	in>>mat.m_cofds;
    	cout<<endl;
     
    	cout<<"cof de TP \t";
    	in>>mat.m_coftp;
    	cout<<endl;
     
    	cout<<"cof exam \t";
    	in>>mat.m_cofexm;
    	cout<<endl;
     
    	cout<<"note de DS \t";
    	in>>mat.m_ds;
    	cout<<endl;
     
    	cout<<"note de TP \t";
    	in>>mat.m_tp;
    	cout<<endl;
     
    	cout<<"note exam \t"; 
    	in>>mat.m_exm;
    	cout<<endl;
     
    	return in;
    }
    ostream &operator<<(ostream &out, Matiere mat)
    {
    	out<<"nomMatiere\t";
    	out<<mat.m_nom<<endl;
    	out<<"cofMatiere\t";
    	out<<mat.m_cof<<endl;
    	out<<"noteTP\t";
        out<<mat.m_tp<<endl;
    	out<<"noteDS\t";
    	out<<mat.m_ds<<endl;
    	out<<"noteExam\t";
        out<<mat.m_exm<<endl;
    	out<<"moyMatiere\t";
    	out<<mat.calculMoyenMatiere()<<endl;
    	out<<"Total matiere\t";
    	out<<mat.calculTotalMatiere();
    	out<<endl;
    	return out;
    }
     
    double Matiere::calculMoyenMatiere()
    {
    	return (m_cofds*m_ds + m_coftp*m_tp + m_cofexm*m_exm)/(m_cofexm + m_cofds + m_coftp);
    }
     
    double Matiere::calculTotalMatiere()
    {
    	return (m_cof*calculMoyenMatiere());
    }
    Pour la classe rèsultat
    resultat.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #include <vector>
    #include "Matiere.h"
    using namespace std;
     
    class Resultat
    {
    private:
    	  vector <Matiere> m_mat;
    public:
    	Resultat()
    	{
    		m_mat.resize(30);
    	};
    	friend istream &operator>>(istream &,Resultat &);
    	friend ostream &operator<<(ostream &,Resultat);
     
    };
    resultat.ccp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include "Resultat.h"
    istream &operator>>(istream &in,Resultat &r)
    {
    	for(int i=0;i<30;i++)
    	in>>r.m_mat[i];
     
    	return in;
    }
    ostream &operator<<(ostream &out, Resultat r)
    {
    	for(int i=0;i<r.m_mat.size();i++)
    		out<<r.m_mat[i];
    	out<<endl;
    	return out;
    }
    **Remarque:
    Je veux surcharge les opérateur >> et << pour que je puisse écrire lors de saisi écrire cin>>r
    et lors d'affichage cout<<r avec un objet de la classe résultat.

    ***Remarque:
    L'execution de programme mainresultat.ccp pour tester les fonction de la classe rèsultat n'affiche rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "Resultat.h"
    void main()
    {
    	Resultat r;
     
    	cin>>r;
     
    	cout<<r;
    }
    Merci

  5. #5
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 40
    Par défaut
    Bonsoir,
    Mes amis j'arrive à la fin de ce problème et je rapproche du solution.
    J'ai réussi à surcharger l'opérateur << et l'opérateur >>
    et voici le nouveau code des classes matière et résultat
    matiere.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #include<iostream>
    #include<string>
     
    using namespace std;
    class Matiere
    {
    	string m_nom;
    	float m_cofds,m_coftp,m_cofexm,m_cof;
    	double m_ds,m_tp,m_exm;
    public:
    	Matiere():m_nom(" "),m_cof(0),m_ds(0),m_tp(0),m_exm(0),m_cofds(0),m_coftp(0),m_cofexm(0){} ;
    	Matiere(string nom,float cof,float cofds,float coftp,float cofexm,double ds,double tp,double exm):m_nom(nom)
    	,m_cof(cof),m_cofds(cofds),m_coftp(coftp),m_cofexm(cofexm),m_ds(ds),m_tp(tp),m_exm(exm){};
    	friend istream &operator>>(istream &,Matiere &);
    	friend ostream &operator<<(ostream &,Matiere);
    	double calculMoyenMatiere();
    	double calculTotalMatiere();
    	float getcof();
    };
    matiere.ccp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #include "Matiere.h"
    istream &operator>>(istream &in,Matiere &mat)
    {
    	cout<<"donner le nom \t";
    	in>>mat.m_nom;
    	cout<<endl;
     
        cout<<"le coefficiant de la matiere\t";
    	in>>mat.m_cof;
    	cout<<endl;
     
        cout<<"cof de DS \t";
    	in>>mat.m_cofds;
    	cout<<endl;
     
    	cout<<"cof de TP \t";
    	in>>mat.m_coftp;
    	cout<<endl;
     
    	cout<<"cof exam \t";
    	in>>mat.m_cofexm;
    	cout<<endl;
     
    	cout<<"note de DS \t";
    	in>>mat.m_ds;
    	cout<<endl;
     
    	cout<<"note de TP \t";
    	in>>mat.m_tp;
    	cout<<endl;
     
    	cout<<"note exam \t"; 
    	in>>mat.m_exm;
    	cout<<endl;
     
    	return in;
    }
    ostream &operator<<(ostream &out, Matiere mat)
    {
    	out<<"nomMatiere\t";
    	out<<mat.m_nom<<endl;
    	out<<"cofMatiere\t";
    	out<<mat.m_cof<<endl;
    	out<<"noteTP\t";
        out<<mat.m_tp<<endl;
    	out<<"noteDS\t";
    	out<<mat.m_ds<<endl;
    	out<<"noteExam\t";
        out<<mat.m_exm<<endl;
    	out<<"moyMatiere\t";
    	out<<mat.calculMoyenMatiere()<<endl;
    	out<<"Total matiere\t";
    	out<<mat.calculTotalMatiere();
    	out<<endl;
    	return out;
    }
     
    double Matiere::calculMoyenMatiere()
    {
    	return (m_cofds*m_ds + m_coftp*m_tp + m_cofexm*m_exm)/(m_cofexm + m_cofds + m_coftp);
    }
     
    double Matiere::calculTotalMatiere()
    {
    	return (m_cof*calculMoyenMatiere());
    }
     
    float Matiere::getcof()
    {
    	return m_cof;
    }
    resultat.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include <vector>
    #include "Matiere.h"
    using namespace std;
     
    class Resultat
    {
    private:
    	  vector <Matiere> m_mat;
    public:
    	Resultat()
    	{
    		m_mat.resize(0);
    	};
    	Resultat(int n)
    	{
    		m_mat.resize(n);
    	}
    	friend istream &operator>>(istream &,Resultat &);
    	friend ostream &operator<<(ostream &,Resultat);
    	int taille();
    	void modifierTaille(int);
    	double calculerMoyGeneral();
     
    };
    resultat.ccp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    #include "Resultat.h"
    istream &operator>>(istream &in,Resultat &r)
    {
    	if(r.m_mat.empty())
    		r.m_mat.resize(1);
    	for(int i=0;i<r.m_mat.size();i++)
    	{
    		in>>r.m_mat[i];
    	}
    	return in;
    }
    ostream &operator<<(ostream &out, Resultat r)
    {
    	for(int i=0;i<r.m_mat.size();i++)
    	{
    		out<<r.m_mat[i];
    		out<<"Moyen generale: "<<r.calculerMoyGeneral();
    		out<<endl;
    	}
    	return out;
    }
     
     
    int Resultat::taille()
    {
    	return m_mat.size();
    }
     
    void Resultat::modifierTaille(int n)
    {
    	m_mat.reserve(n);
    }
    double Resultat::calculerMoyGeneral()
    {
    	double totalgen=0;
    	double totalcof=0;
    	for(int i=0;i<m_mat.size();i++)
    	{
    		 totalgen+= m_mat[i].calculTotalMatiere();
    		 totalcof+=m_mat[i].getcof();
    	}
    	return(totalgen/totalcof);
    }
    Et enfin une fonction main() dans resultatmain.cpp
    pour tester les différents fonctions de classe matière et résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "Resultat.h"
    void main()
    {
    	Resultat r;
    	cout<<r.taille()<<endl;
    	cin>>r;
     
    	cout<<r;
    }
    Il me reste maintenant quelques fonctions mais je veux savoir vos remarques sur ce code et s'il y a des choses a faire pour l'optimiser.
    Et Enfin, merci infiniment pour vos aide.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Juste comme ça en passant, tu n'as pas à initialiser les strings à ""

    Les std::string ont des constructeurs par défaut, ce ne sont pas des float ou de double.

    Et aussi tu n'as pas à définir un constructeur par copie, vu que ce que tu fais le compilateur va le générer tout seul.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 10/10/2009, 18h39
  2. Vector d'objet et map de méthode.
    Par Mr Meuble dans le forum SL & STL
    Réponses: 2
    Dernier message: 06/06/2008, 11h41
  3. [STD] Vector d'objets abstraits
    Par mister3957 dans le forum SL & STL
    Réponses: 3
    Dernier message: 20/02/2007, 10h58
  4. [Débutant]vector d'objet
    Par Clark dans le forum SL & STL
    Réponses: 6
    Dernier message: 19/05/2006, 17h56
  5. Initialisation d'un type d'objet
    Par fdraven dans le forum Oracle
    Réponses: 3
    Dernier message: 28/10/2005, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo