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

  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.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Pourquoi utiliser des float pour les coefficients et des double pour les notes ? Pourquoi ne pas uniformiser et utiliser le même type ?
    En passant, je me demande si je n'aurais pas utilisé des entiers et multipliée/divisée la valeur par 100 pour les E/S. C'est anecdotique mais une note n'aura rarement que plus de 2 chiffres après la virgule.

    Quelque chose me turlupine dans ta classe matière : elle regroupe à la fois la description d'une matière (nom et coefficients) et les résultats d'un étudiant. Je me demande si les 2 ne devraient pas être séparés. A moins que les coefficients ne soient pas les mêmes pour chaque étudiant ?

    Depuis au moins une dizaine d'année, je ne connais plus de compilateur qui refuse les noms de variables de plus de 8 caractères, alors pourquoi donner des noms aussi courts et difficilement lisibles ? Peur d'user ton clavier

    Pourquoi définir les constructeurs des classes dans la déclaration (dans le .h) et pas dans le .cpp ? C'est imposé par le sujet ?

    Il existe std::accumulate pour sommer les valeurs d'un vecteur. Et plus globalement, vu que çà ressemble à un exercice, pourquoi ne pas utiliser plus les algorithmes de la STL ?

    Question de point de vue : mais << et >> ne sont pas symétriques. Je ne peux pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       Resultat resultat_out;
       std::ostringstream oss;
       oss<<resultat_out;
       std::istringstream iss(oss.str());
       Resultat resultat_in;
       iss>>resultat_in;
    C'est dommage je trouve.

    Il y a un problème dans >> de Resultat. Le if(r.m_mat.empty()) r.m_mat.resize(1); montre à mon avis un problème dans la façon dont tu as conçu la lecture du résultat. Soit tu as d'abord le nombre de matière, tu initialises ton vecteur avec et tu itères sur les éléments. Soit tu devrais construire ta lecture avec un itérateur de type back_inserter.


    Dernière chose (enfin pour l'instant) : cette copie mérite 0 ! Bon c'est un peu trop sévère. Mais on ne le répètera jamais assez : pas de using namespace dans les fichiers .h

    Deuxième dernière chose (:roll) : taille et modifierTaille prêtent à confusion : reserve n'ajoute pas n éléments à la liste mais alloue l'espace nécessaire pour pouvoir contenir n éléments sans nouvelle allocation. Vu que taille utilise size et modifierTaille utilise reserve, tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    resultat r;
    r.modifierTaille(10);
    r.taille()==0
    Ce qui est pour le moins surprenant ! --> Attention à ne pas confondre resize et reserve.

    Mais, je ne vois pas l'intérêt de ces deux fonctions dans resultat.

  8. #8
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 40
    Par défaut
    bonsoir 3DArchi,
    Merci pour tout vos remarques. Je corrigerai ce code mais il y a des choses je veux commenter.

    Depuis au moins une dizaine d'année, je ne connais plus de compilateur qui refuse les noms de variables de plus de 8 caractères, alors pourquoi donner des noms aussi courts et difficilement lisibles ? Peur d'user ton clavier
    Peur d'user mon clavier ,peut être
    c'est une mauvaise habitude je le reconnais .J'essaierai de la corriger.

    Quelque chose me turlupine dans ta classe matière : elle regroupe à la fois la description d'une matière (nom et coefficients) et les résultats d'un étudiant. Je me demande si les 2 ne devraient pas être séparés. A moins que les coefficients ne soient pas les mêmes pour chaque étudiant ?
    les coefficients sont les même. Je veux voire comment refaire cette classe.

    Pourquoi définir les constructeurs des classes dans la déclaration (dans le .h) et pas dans le .cpp ? C'est imposé par le sujet ?
    C'est comme ça que j'ai fait lors de l'apprentissage du c++ avec le prof
    même chose pour le STD.
    C'est imposé par le sujet ? non mais c'est une habitude.

    Il existe std::accumulate pour sommer les valeurs d'un vecteur. Et plus globalement, vu que çà ressemble à un exercice, pourquoi ne pas utiliser plus les algorithmes de la STL?
    Les vecteurs pour moi c'est quelque chose que je connais à peine voire
    donc c'est pour cela je fais des choses bizarre un peu.

    Question de point de vue : mais << et >> ne sont pas symétriques. Je ne peux pas faire :
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       Resultat resultat_out;
       std::ostringstream oss;
       oss<<resultat_out;
       std::istringstream iss(oss.str());
       Resultat resultat_in;
       iss>>resultat_in;
    C'est dommage je trouve.
    Un peu plus d'explication sera bien.

    Il y a un problème dans >> de Resultat. Le if(r.m_mat.empty()) r.m_mat.resize(1); montre à mon avis un problème dans la façon dont tu as conçu la lecture du résultat. Soit tu as d'abord le nombre de matière, tu initialises ton vecteur avec et tu itères sur les éléments. Soit tu devrais construire ta lecture avec un itérateur de type back_inserter.
    Pouvez vous m'expliquer comment l'utiliser. Merci pour le lien mais c'est en anglais.

    Dernière chose (enfin pour l'instant) : cette copie mérite 0 ! Bon c'est un peu trop sévère. Mais on ne le répètera jamais assez : pas de using namespace dans les fichiers .h
    C'est bon d'avoir un zero comme ça je peux me corriger avant la soutenance de mini projet en C++.

    Enfin comment ajouter des nouveaux éléments dans un vecteur plein.
    Merci infiniment

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    je suis désolé de rajouter une critique, mais, du seul point de vue de la lisibilité du code (qui est, à mon sens, la première chose que l'on est en droit d'attendre d'un code ), il est très largement préférable de veiller à n'avoir qu'une instruction / déclaration par ligne...

    En effet, lorsqu'on lit des lignes comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float m_cofds,m_coftp,m_cofexm,m_cof;
    double m_ds,m_tp,m_exm;
    on a trop vite fait de "zapper" le fait que m_coftp, m_cofexm ou m_tp sont déclarés...

    Cela ne prend pas beaucoup plus de temps d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    float m_cofds;
    float m_coftp;
    float m_cofexm,m_cof;
    double m_ds;
    double m_tp;
    doub em_exm;
    mais cela rend la lecture beaucoup plus simple, sans influer sur les performances

    Pourquoi s'en priver, dés lors

    Une autre remarque qui me semble intéressante à faire est que tu devrais, autant que possible, veiller à transmettre les différents arguments de types "complexe" (en gros, tout argument qui n'est pas de type primitif (char, short, int, long, long long, float, double, long double) sous la forme de référence, éventuellement constante si la fonction n'a pas vocation à modifier l'objet d'origine correspondant à l'argument passé.

    En effet, le passage d'argument par valeur provoque... la copie de l'objet passé en argument.

    Cela entraine quelques problèmes particuliers:
    1. Les modifications éventuellement apportées à l'arguement ne sont pas répercutées sur l'objet original, ce qui peut provoquer des aberrations si tu espère qu'elles le soient
    2. La copie d'un objet peut prendre énormément de ressources, en temps d'exécution et / ou en terme de mémoire utilisée... Si tu évites la copie des objets trop lourd, tu améliore à peu de frais les performances générales de ton application
    3. Il arrive régulièrement que l'on rende des types non copiables, simplement parce qu'il n'y a pas de sens d'en permettre la copie (ou parce qu'il serait trop difficile d'en assurer une copie "en profondeur")... Le passage par valeur est alors interdit pour ce type d'objet... Est-ce une raison pour ne pas pouvoir le passer en argument à une fonction
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ 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