Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comparaison erronée

[Ca tourne mal]

Sujet résolu
    19 septembre 2017 à 19:05:10

    Bonjour,

    J'ai écrit le programme suivant dans le but de comparer deux durées grace à des opérandes == (chapitre 4, partie 2).

    Cependant, cela me renvoie apparement un false lors de l'éxecution du programme.

    Voici mon code:

    Main.cpp

    #include <iostream>
    #include "Hmin.h"
    
    
    using std::cout;
    using std::endl;
    
    int main()
    {
    
    
        cout<<"test"<<endl;
    
        Hmin duree1(1,2,3),duree2(1,2,3);//Initialisation objets
    
        if(duree1==duree2)
        {
            cout<<"Egales"<<endl;
        }
        else
            {cout<<"nope"<<endl;}
    
    
    cout<<"test"<<endl;
    
        return 0;
    }

    Hmin.h

    class Hmin
    {
    public:
    
        Hmin(int H=0,int minu=0, int sec=0);
        bool  estEgal(Hmin const& b) const;
    
    private:
    
        int m_heures;
        int m_minutes;
        int m_secondes;
    
    
    
    };
    
     bool operator==(Hmin const& a,Hmin const& b);
    

    Hmin.cpp

    #include "Hmin.h"
    
    
    Hmin::Hmin(int H,int minu, int sec)/*:m_heures(H),m_minutes(minu),m_secondes(sec)*/
    {
    
      /*  int q(0);
        int r(0);
    if (sec<60)
    {
    
        while(sec-60*(q+1))
        {
            q++;
        }
        r=sec-60*q;//Variable stockée
    
        m_secondes=r;
    
    }
    else
    {
     m_secondes=sec;
    }
    
    int qq(0);
        int rr(0);
    if (minu<60)
    {
    
        while(sec-60*(qq+1))
        {
            qq++;
        }
        rr=sec-60*qq;//Variable stockée
    
        m_minutes=rr+q;
    
    }
    else
        {
        m_minutes=minu;
        }
    
    m_heures=H+qq;*/
    
    
    
    }
    
    
    bool Hmin::estEgal(Hmin const& b) const
    {
    
            return (m_heures==b.m_heures&&m_minutes==b.m_minutes&&m_secondes==b.m_secondes);//On utilise m_heures dde l'objet a
    
    }
    
    
    
     bool operator==(Hmin const& a,Hmin const& b)
    {
        a.estEgal(b);
    }

    Les notes du constructeur concernent une comparaison des deux objets, sans rapport avec le sujet.

    Merci pour vos réponses.





    • Partager sur Facebook
    • Partager sur Twitter
      19 septembre 2017 à 19:06:15

      Tu n'initialises pas tes variables membres dans le constructeur. Donc elles ont des valeurs indéfinies.

      • Partager sur Facebook
      • Partager sur Twitter

      Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

        20 septembre 2017 à 16:42:01

        Merci beaucoup

        Surtout pour une erreur aussi bête...

        • Partager sur Facebook
        • Partager sur Twitter
          21 septembre 2017 à 12:42:10

          PS:
          Pense à utiliser des noms de variable clair et parlant.
          q, r, qq, rr, kesako ?

          Garde bien en tête que:
          Ton code source est destiné à être lu par une autre personne que toi.

          Il y a plus simple pour calculer le nombre de secondes au format hh::mm::ss, utilise la division entiere et l'operateur modulo:

          int secondes = 4586;		// nombre au pif
          int minutes = secondes / 60;
          secondes = secondes % 60;
          • Partager sur Facebook
          • Partager sur Twitter
            21 septembre 2017 à 14:13:30

            Bonjour Deedolith,

            Je voudrais pouvoir utiliser le nombre de secondes restante pour mettre les secondes restantes dans la variable secondes, et je ne vois pas très bien comment ton opération permet de préserver les secondes restantes et les minutes.

            • Partager sur Facebook
            • Partager sur Twitter
              21 septembre 2017 à 14:26:08

              Par définition de l'opération modulo sur les entiers.

              http://en.cppreference.com/w/cpp/language/operator_arithmetic

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                21 septembre 2017 à 14:35:18

                Salut,

                BebertBeberr a écrit:

                Bonjour Deedolith,

                Je voudrais pouvoir utiliser le nombre de secondes restante pour mettre les secondes restantes dans la variable secondes, et je ne vois pas très bien comment ton opération permet de préserver les secondes restantes et les minutes.

                C'est le role de l'opérateur %. C'est ce que l'on appelle le modulo, à savoir le reste de la division (entière) entre deux entiers.

                si tu as une valeur (prenons la plus facile à évaluer) de 136.  Tu as appris à l'école primaire : 136 / 60 = 2 reste 16.  C'est exactement ce que tu vas faire avec les opérateurs / et %:

                L'opérateur te donnera une valeur entière parce qu'elle s'applique sur deux entiers, ou, pour être précis, le résultat de la division en "oubliant" purement et simplement la partie décimale.  Ainsi, si tu écrit un code poche de int minutes = 136 /60;

                minutes va prendre la valeur 2, qui correspond effectivement au nombre de minutes que l'on retrouve dans 136 secondes.

                Ensuite, l'opérateur % va calculer le reste de la division.  Ainsi, lorsque tu écriras la ligne seconde = seconde%2; (qui pourrait être simplifié sous la forme de seconde %=seconde; ), seconde prendra la valeur de 16.

                Et c'est exactement ce que tu voulais ;)

                -
                Edité par koala01 21 septembre 2017 à 15:08:06

                • Partager sur Facebook
                • Partager sur Twitter
                Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                  23 septembre 2017 à 11:56:11

                  Salut et Merciiiiiii :D

                  Par contre il me semble que la simplification exacte est secondes%=2 ou secondes%=minutes .

                  Et merci encore.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 septembre 2017 à 12:20:59

                    non, parce que seconde %= 2 ne te donnera une valeur égale qu'à 0 ou à 1 et que secondes %= ne te donnera qu'une valeur égale entre 0 et le nombre de minutes que tu as calculé -1 .  Quel que soit le nombre de minutes que tu as obtenu.

                    Si tu veux avoir le nombre de seconde qui n'entre dans aucune minute, le nombre de minutes qu'il y a dans une heure ou le nombre d'heure qu'il y a dans une journée, tu dois prendre la valeur constante de ce nombre : il y a 60 secondes dans une minute, 60 minutes dans une heure et 24 heures dans une journée ;)

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                      23 septembre 2017 à 12:30:40

                      Ah non je dis des bêtises c'est bon 

                      ;) merci

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Comparaison erronée

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown