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 :

conversion : les nombres naturels en binaire et creation d'un suite de nombres


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut conversion : les nombres naturels en binaire et creation d'un suite de nombres

    C’est un exercice dans le cadre d’apprentissage du c++

    voici le problème à résoudre, j'ai trouver la solution , ne vous inquiétez pas ^^ mais je vais vous expliquer ce qui ne vas pas après




    et voici le code que j'ai écrit,

    - 1 )je voulais savoir si vous pouvez m'aider à simplifier ce code,

    - 2 ) trouver un moyen de mettre un return dans la fonction main () et supprimer la premier return.

    - 3 ) une fois compiler j'ai l'impression que le pc lag bizar,,,
    Merci d'avance


    j'ai peut être un peut compliquer la chose mais voila , on peut pas tout savoir !


    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
     
    #include <iostream>
    using namespace std;
     
    int binaire(int valeur)
    {
        int reste,nombre_un=0,nombre_zero=0,resulta_soustaction;
     
     
        if (valeur==0)
            resulta_soustaction=0;
        else
        {
            while (valeur>0)
            {
                reste=valeur%2;
                valeur/=2;
                if (reste==1)
                    nombre_un++;
                else
                    nombre_zero++;
            }
            resulta_soustaction=nombre_un-nombre_zero;
            if (resulta_soustaction==0)
                resulta_soustaction=3;
            else if (resulta_soustaction<0)
                resulta_soustaction=0;
            else if (resulta_soustaction>0)
                resulta_soustaction=1;
        }
        return resulta_soustaction;
    }
    int main()
    {
        int entree,r,un=0,zero=0,signe=0,save,suite_de_nombre=0,q,b=0;
        cout<<"Nombre d'elements de la suite?";
        cin>>entree;
     
        for (int i=0; b<entree ;i++)
        {
            if (signe!=3)
                save=signe;
            signe= binaire (i);
     
            if (save==signe || save==3 || signe==3)
                suite_de_nombre++;
            else
            {
                cout<<suite_de_nombre<<" ";
                b++;
                suite_de_nombre=1;
            }
        }
        cout<<endl;
     
    }

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Pour améliorer la lisibilité et la compréhension, je transformerai le retour de la fonction et je te propose une petite modif dans la division afin de travailler sur les bits et plus sur les modulo.
    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
     
    typedef enum
    { SignePositif,
       SigneNegatif,
       SigneNull,
    } Signe_t;
     
    Signe_t binaire(int valeur)
    {
       int nombre_un=0,nombre_zero=0,signe = 0;
    Signe_t resulta_soustaction;
     
     
        if (valeur==0)
            resulta_soustaction=SigneNull;
        else
        {
            while (valeur>0)
            {
                if( (valeur & 1) == 1)
                    nombre_un++;
                else
                    nombre_zero++;
                valeur >>= 1;
            }
            signe=nombre_un-nombre_zero;
            if (signe==0)
                resulta_soustaction=SigneNull;
            else if (signe<0)
                resulta_soustaction=SigneNegatif;
            else if (signe>0)   /* ce test est inutile car c'est obligatoire vrai car il n'est ni nul ni positif */
                resulta_soustaction=SignePositif;
        }
        return resulta_soustaction;
    }

    PS : la balise de code c'est [code][/code] et pas [quote][/quote], jai rectifié
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    ça beug un peut avec ton code mais c'est pas grave
    merci

    mais ça ne résous toujours pas mon problème ,,

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par scorpion60 Voir le message
    ça beug un peut avec ton code mais c'est pas grave
    Ca bug où cela ? Mais, c'est possible, j'avoue, je n'ai pas testé.

    Citation Envoyé par scorpion60 Voir le message

    - 1 )je voulais savoir si vous pouvez m'aider à simplifier ce code,

    - 2 ) trouver un moyen de mettre un return dans la fonction main () et supprimer la premier return.

    - 3 ) une fois compiler j'ai l'impression que le pc lag bizar,,,
    Merci d'avance
    1/ Je le trouve relativement simple et aisé à comprendre ton code. Perso, il n'y a pas grand chose à changer.

    2/ Je ne comprend pas ce que tu veux faire

    3/ C'est quoi un PC qui lag ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut oui ca beug
    oui ça beug quand on tap 25
    on doit avoir une suite de

    1 3 1 3 3 5 3 1 1 3 1 7 7 1 3 5 3 13 7 1 3 1 1 3 3

    et on a pas avec ce que tu ma donner :s ,,,

    je doit pas utiliser typedef enum :s

    je doit absolument faire avec ce que j'ai , comme ce que j'ai écrit dans ma code..

    oui le je ressent un leger lag , sur tout, avec la console , peut être que c'est normal,

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut oki
    1-) ben si tu trouve que il na pas grand choses a changer c'est super !

    2 -) comme je ne peut pas utliliser

    system("PAUSE");
    return EXIT_SUCCESS;

    et comme je ne doit pas avoir 2 return , alors int mai () reste sans returne .

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par scorpion60 Voir le message
    2 -) comme je ne peut pas utliliser

    system("PAUSE");
    return EXIT_SUCCESS;
    Pourquoi, c'est pas interdit par le C
    Citation Envoyé par scorpion60 Voir le message
    et comme je ne doit pas avoir 2 return , alors int mai () reste sans returne .
    effectivement, ton main ne retourne pas de valeur explicite (j'avais pas vu) et c'est pas terrible. Par contre je ne comprend pas ton histoire des 2 return.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    effectivement , mais dans la consigne on as pas le droit de l'utiliser ,
    system("PAUSE"); .....

    et pour ce projet on a droit qu'un return, on peut utilisée le void,

    et comme j'ai déjà utiliser return plus haut ,:s je ne peut l'utiliser
    pour int main () .

    mais tu crois que y a moyen de changer le code pour avoir le return dans int main () ?




    un grand merci ,,, en plus super rapide les réponses, en plus par un modérateur .
    désoler si je fais des faut en français , la langue français n'est que ma 4 ème langue.

  9. #9
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Remplace system("PAUSE") par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cin.get(); // ou cin.ignore() il me semble ausi
    Et ça ira tout aussi bien sauf que t'auras pas le texte à la noix.

  10. #10
    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, et bienvenue sur le forum.

    Déjà, pour ce qu'il en est du retour de main:

    Cette fonction doit renvoyer un entier, qui sera utilisé par le système pour déterminer si l'application s'est terminée correctement.

    Les valeurs utilisées sont:
    • 0 (EXIT_SUCCESS) si l'application se termine correctement
    • 1 (EXIT_FAILURE) si l'application se termine sur une erreur
    • (uniquement sous unixoïdes) 2 si l'application se termine avec des avertissements.

    EXIT_SUCCESS et EXIT_FAILURE ne sont que des valeurs définies par directives préprocesseur correspondantes, et je ne vois donc aucune raison de ne pas les utiliser (évidemment, si ca t'es interdit, tu peux faire un return 0 quand tu arrive à la fin de l'exécution normale de ton application, et un return 1 dans les autres cas )

    Il ne faut donc pas confondre le but des différentes valeurs de retour:

    Si tu indique une valeur de retour à une fonction, c'est pour pouvoir l'utiliser ailleurs (par exemple: si une fonction dois faire un calcul, mais ne doit pas afficher le résultat et que c'est à la fonction appelante d'effectuer l'affichage), mais, il est finalement très rare que la fonction main() doive renvoyer une valeur récupérée sur l'appel d'une fonction... Le plus souvent, elle effectuera un test sur la valeur récupérée pour déterminer si elle doit sortir sur erreur ou non, et le seul return 0 que l'on verra dedans se trouvera juste avant l'accolade fermante

    Pour ce qui est de créer une pause portable, car, effectivement, system("PAUSE") n'est pas portable, et, de plus, rend la main au système d'exploitation, pour la reprendre par la suite, bref, cela fait partie des "fausses bonnes idées", il existe ==>un entrée dans la FAQ<== qui indique comment s'y prendre.

    @ram-0000>> je sais que tu es plutot Ciste et non C++iste, mais, en C++, toute déclaration de type défini par l'utilisateur (enum, struct, class, union, typedef) vaut déclaration du type en question... Il n'est donc pas nécessaire de rajouter un typedef : un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    enum Signe_t
    {
        SignePositif,
        SigneNegatif,
        SigneNull
    };
    suffit amplement

    Enfin, si l'idée de la fonctin binaire est bel et bien d'obtenir une équivalence en binaire, le plus facile reste encore... d'utiliser la classe bitset (si ton prof refuse le system("PAUSE"), il sera sans doute favorablement surpris de voir que tu as pensé à l'utiliser

    Comme toutes les classes de la STL, la classe bitset se trouve dans l'espace de noms std, et elle est disponible par la simple inclusion du fichier d'en-tête <bitset>

    Son utilisation est, finalement, relativement aisée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
        int valeur;
        std::cout<<"introduisez une valeur entiere :";
        std::cin >> valeur;
        std::bitset<CHAR_BIT*sizeof(int)> bs(valeur);
        std::cout<<bs<<std::endl;
        return 0;
    }
    te montre comment convertir un entier en sa représentation binaire.

    Il mérite quelque précisions toutefois:

    CHAR_BIT est une valeur préprocesseur qui définit... le nombre de bit utilisés dans un caractère, et sizeof est une valeur constante représentant... le nombre de caractères utilisés pour représenter le type mis entre parenthèse.

    Le fait de multiplier ces deux valeurs nous assure que le bitset que nous déclarons aura la taille correcte pour représenter les différentes valeurs que l'utilisateur pourrait introduire

    Tu trouvera enfin un max d'infos sur la classe bitset, ==>ici<==
    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

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    koala01 Merci pour les info ...


    je vais essayer de simplifier ce code, ou la rendre plus lisible.
    et contourner la premier return, si possible.

    je doit le terminer pour ce soir ^^

  12. #12
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par koala01 Voir le message
    @ram-0000>> je sais que tu es plutot Ciste et non C++iste,
    Mince cela se voit tant que cela
    Citation Envoyé par koala01 Voir le message
    mais, en C++, toute déclaration de type défini par l'utilisateur (enum, struct, class, union, typedef) vaut déclaration du type en question... Il n'est donc pas nécessaire de rajouter un typedef : un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    enum Signe_t
    {
        SignePositif,
        SigneNegatif,
        SigneNull
    };
    suffit amplement
    C'est noté, typedef n'est plus utile dans ce cas
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  13. #13
    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
    Citation Envoyé par scorpion60 Voir le message
    effectivement , mais dans la consigne on as pas le droit de l'utiliser ,
    system("PAUSE"); .....

    et pour ce projet on a droit qu'un return, on peut utilisée le void,

    et comme j'ai déjà utiliser return plus haut ,:s je ne peut l'utiliser
    pour int main () .

    mais tu crois que y a moyen de changer le code pour avoir le return dans int main () ?
    A vrai dire, je ne comprend pas trop...
    Si je t'ai bien compris, tu ne peux écrire qu'une seule fois le mot clé dans ton programme

    Cela m'a l'air bien farfelu...

    A moins que l'idée du prof soit que, étant donné qu'il faut au minimum renvoyer 0 en fin de fonction main(), de vous inciter à passer un paramètre en référence, histoire de vous apprendre à les utiliser...

    Si c'est là le but de l'exercice, il faut avouer que le prof aurait du envisager que le résultat soit fourni par autre chose qu'un entier (tiens, à la limite, pourquoi pas un bitset ) car le but des références est de servir d'alias d'une variable, en évitant les copies inutiles, mais il faut avouer que, en ce qui concerne les types primitifs (bool, char, short, int, long, (long long), float et double, ainsi que leurs homologues signed et unsigned quand ils existent) le problème ne se pose pas.

    Enfin, si c'est bien ce que veut le prof, tu peux toujours modifier le prototype de ta fonction binaire en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void binaire(int transforme, int& resultat)
    {
        /* transformer la valeur transforme en binaire, et l'assigner à resultat ici */
    }
    et modifier la fonction main en
    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
    int main()
    {
        /* tout ce qui peut etre fait avant l'appel de la fonction, dont la 
         * déclaration d'une variable résultat, et de la valeur à transformer
         */
        int res;
        int trans;
        /* appel de la fonction */
        binaire(trans, res);
        /* ce qui doit être fait apres l'appel de la fonction */
        /* ce retour-ci, on ne peut y couper, pour que le système sache que
         * l'application s'est bien terminée
         */
        return 0;
    }
    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

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    merci encore

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/01/2014, 22h36
  2. Conversion d'un nombre décimal en binaire.
    Par ariuss dans le forum Débuter
    Réponses: 6
    Dernier message: 17/10/2009, 11h38
  3. [TPW] Conversion d'un nombre décimal en binaire
    Par thimo2 dans le forum Turbo Pascal
    Réponses: 14
    Dernier message: 10/04/2009, 00h24
  4. Conversion dans les 3 bases & heure binaire
    Par Mic** dans le forum Contribuez
    Réponses: 1
    Dernier message: 30/11/2008, 17h17
  5. [ABAP] Convertir nombre decimal en binaire
    Par danael dans le forum SAP
    Réponses: 3
    Dernier message: 04/04/2005, 12h17

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