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

C++ Discussion :

calculer la moyenne des étudiants


Sujet :

C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Par défaut calculer la moyenne des étudiants
    svp j'ai besoin de votre aide je dois calculer les moyennes par matière et les moyennes par étudiant dans la classe Feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "Cellule.h"
    #include "Ligne.h"
    class Feuille : public map<string,Ligne>{
     
        public:
          Feuille(std::vector <std::string> & e, std::vector <std::string> & m );
     
          Feuille();
     
          float MoyenneMatiere(string mat);
          float MoyenneEtudiant(string etudiant);
    et ma classe ligne c'est bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "Cellule.h"
     
    class Ligne : public map<string,Cellule>{
          public:
     
          Ligne();
          Ligne (std::vector <std::string> & m );
     
               };
    la classe Cellule contient la note et la presence
    j'ai définit ma fonction comme suit mais ça marche pas:
    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
    float Feuille :: MoyenneEtudiant(string etudiant)
    {
          Feuille :: iterator it;
          Ligne :: iterator it2;
          int nb=0;
          double s=0;
     
          for(it=begin(); it!=end();it++){
                          it=find(etudiant);
                          if(it!=end()){
                                        for(it2=begin();it2 != end(); it2++)
                                        {
                                                            s=s+it2->second.SetValeur(double);
                                                            nb++;
                                                            return 0;}
                                                            }
                                                            }}
    si vous avez une idée merci de me guider

  2. #2
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    C'est un prof qui a cité developpez.net et qui fournit du code horrible pour un devoir, ou quoi ?

    Sinon, je conseillerais la fonction rechercher pour voir tout ce que nous avons déjà expliqué à tes camarades ...

  3. #3
    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
    Citation Envoyé par zora700 Voir le message
    si vous avez une idée merci de me guider
    Ne pas hériter de std::map. utiliser const dans tes passages de paramètres.
    Et poser l'algorithme sur papier et l'essayer à la main avant de l'implémenter.

  4. #4
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Ne pas hériter de std::map.
    Pour quelle raison conseille tu cela ?

  5. #5
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    std::map a une sémantique de valeur, l'héritage public a une sémantique d'entité.

    cf. http://cpp.developpez.com/faq/cpp/?p...s#CLASS_valeur

  6. #6
    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,
    Citation Envoyé par themadmax Voir le message
    Pour quelle raison conseille tu cela ?
    Il y a une raison "technique" et une raison "conceptuelle"...

    La raison technique est que le destructeur des différents conteneurs de la STL n'est ni virtuel, ni protégé, condition indispensable à l'héritage.

    En effet, avec l'héritage public, tu peux parfaitement avoir une classe prenant la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MyClass : public std::map<std::string, Type>
    {
        public:
            ~MyClass()
            {
                /* appels à delete ??? */
            }
        private:
            /* une foule de membres différents (gestion de mémoire dynamique ? ) */
    };
    dont tu te rends compte qu'il faut impérativement invoquer le destructeur une fois que l'objet n'est plus nécessaire (pour éviter les fuites mémoires)

    Mais, cette classe héritant de std::map<std::string, Type>, tu serait parfaitement en droit d'écrire un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
        std::string<std::string, Type> * ptr = new MyClass;
        /* utilisation de ptr, en n'utilisant que l'interface de std::string<std::string, Type> */
        delete ptr;
    }
    et là, le destructeur de std::map n'étant pas virtuel, l'appel au destructeur de MyClass ne serait jamais appelé

    Tu imagines aisément les problèmes que cela peut représenter au niveau de la mémoire, surtout si tu passes ton temps (contrairement à ce que montre le code) à créer et à détruitre des instances de MyClass

    La raison conceptuelle est que l'héritage doit respecter LSP, et donc les pré / post conditions et les invariants.

    Nous rejoignons en cela des problèmes du meme type que ceux qui font que, malgré ce que l'on apprend en math (un carré EST-UN rectangle particulier en cela que tous ses cotés sont égaux), la classe Carre ne peut pas hériter de la classe Rectangle, ou de ceux qui font que ListeTriee ne peut pas hériter de Liste :

    Dans le cas d'un tel héritage, si tu respectes les invariants de la classe de base, tu ne respectes pas ceux de la classe dérivée, et inversement

    De plus, on nous répète à satiété que l'héritage (public) est une relation EST-UN, et c'est tout à fait vrai.

    Par contre, il faut grandement se méfier de notre manière de parler, car c'est phrase n'a de sens que dans une optique de substituabilité : Un objet de la classe X EST-UN objet de type Y si (et seulement si) je peux passer en paramètre un objet de la classe X à une fonction attendant un objet de type Y et que la fonction continue à fonctionner correctement et à fournir un résultat exploitable cohérent

    Il faut donc se méfier tout particulièrement de notre manière de parler, car quand on dit "MyClass EST-UNE std::map" on pense en réalité "MyClass EST implémentée pour utiliser une std::map", ou si tu préfères "MyClass UTILISE std::map pour rendre les services que l'on attend d'elle "

    Et nous nous rendons alors compte que nous ne sommes plus dans un contexte d'héritage, mais bien dans un contexte de composition

    En outre, ce n'est pas parce que l'on veut disposer de deux ou trois fonctions issues de la classe std::map que toutes les fonctions vont nous intéresser, ni meme avoir le moindre sens pour MyClass:

    Tu vas, très certainement être intéressé par la fonction insert, mais au niveau de MyClass, elle serait bien mieux nommée sous la forme de "addResult" (par exemple).

    On peut de même envisager le fait que tu seras sans doute intéressé par les fonctions begin et end, mais, outre le fait que tu ne seras intéressé que par leurs versions constantes (une fois un résultat inséré, il n'est théoriquement plus question de le modifier ), elles seraient largement mieux nommées sous les formes respectives de "resultBegin" et "resultEnd" (par exemple).

    Enfin, toutes les fonctions de suppression d'élément (clear, remove, ...) n'ont aucun sens pour MyClass car cela permettrait de supprimer des résultats afin de... de quoi, en sommes de "tricher" sur les résultats afin de favoriser (ou pire, de bloquer) un étudiant

    On se rend donc compte que, malgré le fait que notre (mauvais) parlé nous incite à envisager l'héritage, LSP ne nous permet pas de l'utiliser parce que n'importe quelle fonction prenant une std::map<std::string, Type> en argument peut avoir des résultat désastreux sur la cohérence d'un objet de type (réel) MyClass
    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

Discussions similaires

  1. Calculer la moyenne des étudiants
    Par yawra dans le forum Requêtes
    Réponses: 6
    Dernier message: 07/04/2012, 16h20
  2. [MySQL] moyenne des étudiants
    Par yawra dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 07/04/2012, 02h39
  3. Calculer la moyenne des moyens.
    Par Invité dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/09/2011, 16h15
  4. Réponses: 4
    Dernier message: 14/12/2009, 20h31
  5. calculer la moyenne des frames d'une vidéo
    Par jad777 dans le forum C++Builder
    Réponses: 1
    Dernier message: 26/10/2008, 11h32

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