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 :

afficher en hexa


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Par défaut afficher en hexa
    bonjour tout le monde

    Voilà, je dois afficher à l'ecran un nombre entier positif passé en parametre a une procédure AfficherEnBase16 ce nombre devra donc apparaitre en hexa. Pour cela je dois m'aider d'une fonction que j'ai créée précedement qui permet de convertir un nombre en hexa seuleument voilà je ne vois vraimment pas comment afficher ce nombre en hexa j'ai bien trouvé quelques pistes seulement la conversion et a l'envers et je ne peut pas encore utiliser de tableau de chaine de caractére ou autre donc c'est un peu la merde si vous pouvez m'aidez ce serait le pied

    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
     
         #include<iostream>
     
         using namespace std;
     
         char ChiffreVersLettre(unsigned int n) //converti un nombre compris entre 0 et 15 en hexa
         {
         if(n<10 && n>0)
           return (char)(n+48);
         else
           return (char)(n+55);
         }
     
         void AfficherEnBase16(unsigned int n)  //affiche un nombre positif quelconque en hexa
        {
     
        }
     
         int main()
         {
         ...
         return 0;
         }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour afficher en base 16, c'est beaucoup plus simple qu'en base 10, puisque tu peux isoler chaque "chiffre" hexa avec un ET binaire. Ensuite, quelques décalages de bits bien placés devraient faire l'affaire:

    ex:
    chiffre1 = (nombre & 0xF0000000) >>28;
    ...
    chiffre8 = (nombre & 0x0000000F);

    à toi d'en faire une boucle...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Par défaut
    j'y est pensé mais malheureusement ùême ca je n'ai pas le droit :/

    il faut que je trouve un truc en faisant des division successive par 16 je pense mais je ne vois pas comment

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour ça, il te faut un buffer de caractères (9 devrait suffire pour des long) que tu remplis à l'envers (en commençant par la droite, c'est-à-dire au caractère 7, le caractère 8 étant réservé pour le zéro terminal).

    Ainsi, tu commences avec le premier chiffre à droite.
    * Tu prends le reste de la division par 16 (nombre % 16) ou (nombre & 0xF) pour obtenir le chiffre hexa (que tu convertis en caractères, et tu le places dans ton buffer)
    * Puis tu divises le nombre par 16, pour que le chiffre hexa suivant se retourve en dernier (nombre /= 16) ou (nombre >>= 4).
    * Et hop, tu répètes la séquence jusqu'à ce que le nombre soit nul.

    (Note: le nombre doit être unsigned pour une conversion en hexa)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Par défaut
    je ne peux pas non plus utiliser de tableau :/

  6. #6
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Salut,

    fais des division successive par 16.

    exemple : 572

    572 / 16 = 35 reste 12
    35 / 16 = 2 reste 3

    ton nombre hexa sera : 2 - 3 - ChiffreVersLettre(12)

    si tu verifies 2*16^2 + 3*16 + 12 = 572

    donc ton algo sera une boucle jusqu'a ce que tu ne puisses plus diviser par 16.

    XXiemeciel

  7. #7
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Par défaut
    oui mais pour le traduire en c++ O_O

    je bloque,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while(n>0)
    {
    int reste;
     
    reste= n%16;
    n= n/16;
     
    cout << //là je bloque :/
    }

  8. #8
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    bonsoir,

    Tu n'as pas le droit d'utiliser cout << hex << LEntier ; ???

  9. #9
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Par défaut
    non c'est trop facile sinon

    (c'est ce que mon prof m'a dit)

  10. #10
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Salut,

    scuze je me suis cru dans le forum algorithme quand je t'ai repondu

    en C++ ca donnerais ca:

    dans mon exemple chiffreEnLettre retourne un string.

    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
     
     
    N = nombre a transformer en hexa
    R = 0 //reste
    std::string S = "" //ce sera le resultat en string dans ton cas fais en ce que tu veux
     
    while(N >= 16)
    {
          int tmp = (int)(N/16);
          R = N - tmp*16;
          S = S +  chiffreEnLettre(R);
          N = tmp;
    }
     
    S =  S + chiffreEnLettre(N);
    S = inverse(S);
    XXiemeciel

  11. #11
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Par défaut
    c'est bien làle problème, je n'ai pas le droit d'utiliser un type string non plus :s

    ca fais au moins la troisieme proposition que j'ai faites à mon prof et il ne me les accepte jamais :s

    je viens de trouver encore un autre truc, mais là encore je ne sais pas si il va accepter car ca utilise la récurcivitée et comme nous avons jamais vu d'exemple sur la récurrence je sais pas si il va me le prendre :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void AfficherEnBase16(unsigned int n)
    {
    if(n)
    {
    AfficherEnBase16(n/16);
    }
    cout <<ChiffreVersLettre(n%16);
    }

  12. #12
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    ta recurrence a l'air bonne, ca devrait fonctionner

    XXiemeciel

  13. #13
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Inverser les chiffres sans tableau ni chaine... super.
    Hum ... Il y a toujours moyen de gruger à partir de la représentation interne non portable du nombre, ou plus simplement en profitant qu'un octet s'écrit toujours sur 2 caractères en hexa:

    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
    // non testé
    void affiche16(unsigned char) {
        .... // même idée que la surcharge suivante, 
       // mais quartet par quartet
    }
     
    void affiche16(unsigned int N) {
        const int nb_octets = sizeof(N);
        for (int n=nb_octets-1 ; n>= 0 ; --n)
        // attention à ne pas utiliser >=0 avec des unsigned 
        {
            const unsigned char o = (N >> (8*n)) & 0xff;
            affiche16(o);
        }
    }
    Faut-il qu'il vous aie parler de masquages et bidouilles sur les bits. Avant les std::string, ça craind un peu.

    EDIT: après avoir lu ce qu'avait dit médinoc. Ici, le décalage est une division par le nombre qui va bien, le ET-binaire, un modulo. La convertion se fait très bien. C'est laid, mais possible.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    (Au fait: ce n'est pas une récurrence, mais une fonction récursive.)

    Le problème majeur est qu'avec des divisions pas 16, on obtient beaucoup plus facilement le dernier chiffre que le premier. Aussi, oui, soit on remplit un tableau à l'envers (ce qui revient à s'en servir comme d'une pile) soit on fait une fonction récursive, ce qui revient à se servir de la pile existante.

    Sinon, il y a peut-être des solutions (bien lentes) pour obtenir les chiffres dans le bon ordre sans utiliser de pile, mais c'est bien plus ch***t à coder...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Par défaut
    je ne peut pas non plus utiliser sizeof() ni le décalage de bit :/

    je vais déja présenter cette nouvelle méthode (fonction résursive) pour voir si là il l'accepte sinon ben je vois plus trop comment faire :/

    peut etre en comparant le chiffre a 1 puis si il est plus petit je multiplie par 10 et ainsi de suiste puis diviserai par 10 ce qui me donnerai par exemple (pour 567 1000 que je diviserai par 10 ce qui me donnerai 100) comme ca je pourrai isoler les chiffres des centaines, dizaine etc... mais apres je ne vois pas comment faire

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ho, on parle d'hexa ou de décimal, là ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Par défaut
    d'hexa mais regarde si j'ai un nombre decimal en parametre a convertir en hexa si j'isole tout ses chiffres ce sera peut-être plus simple pour le convertir et l'afficher en hexa non ?

  18. #18
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par blastmanu
    je ne peut pas non plus utiliser sizeof() ni le décalage de bit :/

    je vais déja présenter cette nouvelle méthode (fonction résursive) pour voir si là il l'accepte sinon ben je vois plus trop comment faire :/
    Moi a ce niveau je chercherais a faire le maximum de propositions repondant au probleme en sachant qu'il les refusera.

    Quelque chose comme ceci finira peut-etre par lui plaire.
    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
    void AfficheChiffreHexadecimal(unsigned int c)
    {
       assert(c < 16);
       std::cout << "0123456789ABCDEF"[c];
    }
     
    bool AfficheDeuxChiffresHexadecimaux(unsigned int c, bool initial, bool final)
    {
       int premier = (c /16) % 16;
       int second = c % 16;
       if (!inital || premier != 0) {
          AfficheChiffreHexadecimal(premier);
          initial = false;
       }
       if (!initial || final || second != 0) {
          AfficheChiffreHexadecimal(second);
          initial = false;
       }
       return initial;
    }
     
    bool AfficheQuatreChiffresHexadecimaux(unsigned int, bool initial, bool final)
    {
       int premier = (c/256) % 256;
       int second = c % 256;
       initial = AfficheDeuxChiffresHexadecimaux(premier, initial, false);
       initial = AfficheDeuxChiffresHexadecimaux(second, initial, final);
       return initial;
    }
     
    void AfficheHuitChiffresHexadecimaux(unsigned int, bool initial)
    {
       int premier = (c/65536) % 65536;
       int second = c % 65536;
       initial = AfficheQuatreChiffresHexadecimaux(premier, initial, false);
       initial = AfficheQuatreChiffresHexadecimaux(second, initial, true);
    }

  19. #19
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par blastmanu
    d'hexa mais regarde si j'ai un nombre decimal en parametre a convertir en hexa si j'isole tout ses chiffres ce sera peut-être plus simple pour le convertir et l'afficher en hexa non ?
    En aucun cas.
    Pour le convertir en hexa, il faut isoler tous ses chiffres hexa: Les chiffres décimaux n'ont plus rien à voir, et sont plus un handicap qu'autre chose: un ordi, basé sur le binaire, compte beaucoup mieux en hexa (2^4) qu'en décimal (2*5, c'est le 5 qui gène)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  20. #20
    Membre chevronné Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Par défaut
    Si tu as le droit de te servir d'une pile tu stoques tes elements dedans et tu depile pour les avoirs dans le bon sens.

    XXiemeciel

Discussions similaires

  1. Valeur entière affiché en hexa en debug
    Par mister3957 dans le forum Visual C++
    Réponses: 2
    Dernier message: 30/03/2009, 08h52
  2. afficher correctement une chaine hexa
    Par r0d dans le forum SL & STL
    Réponses: 3
    Dernier message: 13/08/2008, 09h58
  3. decoder des entrées en Hexa suivant le format UTF8 et afficher le resultat
    Par Septembre84 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 16/04/2008, 16h10
  4. afficher les couleurs en Hexa
    Par yorukaze dans le forum C
    Réponses: 6
    Dernier message: 06/12/2007, 17h40
  5. afficher de unsigned short en hexa?
    Par lykim1982 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2007, 17h51

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