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 base 10 vers base 16 (et inversement)


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Conversion base 10 vers base 16 (et inversement)
    Bonjour à la communauté developpez.net

    Alors voilà, je fais des études en classe préparatoire mathématiques supplémentaires, je débute depuis moins d'une semaine en programmation sur c++ et j'essaie de faire un exercice de cours que j'ai bien avancé mais sur lequel je bloque par manque d'expérience.

    Je dois produire un algorithme et le coder en c++. Cet exercice a pour objectif de convertir un entier en base 10 vers la base 16 et inversement à travers un petit menu. A noter qu'il faut que je mémorise les digits acceptés en base 16 dans un vecteur de type caractère et que ce vecteur servira pour les deux sens de conversion.

    Algorithme:

    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
    programme conversion
    	choix : caractere
    	hexadecimal : chaîne
    	entiernaturel, k : entier
    debut
    	// boucle sur le menu
    	choix <- "Z"
    	tantque choix <> "Q" et choix <> "q"
     
    		// afficher le menu
    		afficher "conversion base 10 en base 16.....1"
    		afficher "conversion base 16 en base 10.....2"
    		afficher "quitter l'application.............Q"
    		saisir choix
     
    		// conversion de base 10 en base 16
    		si choix = "1" alors
    			hexadecimal <- ""
    			afficher "entrer un entier naturel = "
    			saisir entiernaturel
    			tantque entiernaturel <> 0
    				hexadecimal <- str(entiernaturel mod 16) + hexadecimal
    				entiernaturel <- entiernaturel div 16
    			fintantque
    			afficher "conversion en hexadecimal = " + hexadecimal
    		sinon
     
    			// conversion de base 16 en base 10
    			si choix = "2" alors
    				entiernaturel <- 0
    				k <- 0
    				afficher "entrer un nombre hexadecimal = "
    				saisir hexadecimal
     
    				tantque taille(hexadecimal) > 0
    					entiernaturel <- entiernaturel + val(droite(hexadecimal, 1)) * 16^k
    					hexadecimal <- gauche(hexadecimal, taille(hexadecimal)-1)
    					k <- k + 1
    				fintantque
    				afficher "conversion en base 10 = " + entiernaturel
    			finsi
    		finsi
     
    	fintantque
    fin
    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
    /* programme conversion
    *  but : convertir un entier naturel en hexadecimal et inversement
    *  auteur : td
    *  date : 03/01/2017
    */
     
    #include <iostream>
    #include <math.h>
    #include <string>
    #include <sstream>
     
    using namespace std;
     
    int main()
    {
        char choix ;
        string hexadecimal ;
        int entiernaturel ;
     
        // boucle sur le menu
        choix = 'Z' ;
        while (choix != 'Q' && choix != 'q')
        {
     
            // afficher le menu
            cout << endl << "conversion base 10 en base 16 .......... 1" ;
            cout << endl << "conversion base 16 en base 10 .......... 2" ;
            cout << endl << "quitter l'application................... Q" ;
            cout << endl << "votre choix ........................... " ;
            cin >> choix ;
     
            // conversion base 10 en base 16
            if (choix == '1')
            {
                hexadecimal = "" ;
                cout << "entrer un entier naturel = " ;
                cin >> entiernaturel ;
                while (entiernaturel != 0)
                {
                    // récupération du reste et conversion en caractère
                    char c = (entiernaturel%16) + '0' ;
                    // concaténation du caractère
                    hexadecimal = c + hexadecimal ;
                    entiernaturel = entiernaturel / 16 ;
                }
                cout << "conversion en hexadecimal = " + hexadecimal ;
            }
            else
            {
     
                // conversion base 16 en base 10
                if (choix == '2')
                {
                    entiernaturel = 0 ;
                    int k = 0 ;
                    cout << "entrer un nombre hexadecimal = " ;
                    cin >> hexadecimal ;
                    while (hexadecimal.size() > 0)
                    {
                        // extration du dernier caractère du nombre hexadecimal
                        string s = hexadecimal.substr(hexadecimal.size()-1, 1) ;
                        istringstream myStream(s);
                        int result ;
                        // conversion du caractère en entier naturel
                        myStream>>result ;
                        // ajout dans entiernaturel multiplié par la puissance de 16
                        entiernaturel += result * pow(16, k) ;
                        // on enlève le dernier caractère
                        hexadecimal = hexadecimal.substr(0, hexadecimal.size()-1) ;
                        k++ ;
                    }
                    cout << "conversion en base 10 = " << entiernaturel ;
                }
     
            }
     
         }
     
     
        return 0;
    }
    Merci d'avance!

    debprog01

  2. #2
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut motivations
    Bonjour,

    Le but du forum est de partager l'expérience et de s'ouvrir aux autres, pas de
    faire du message privé. Sinon il y a des cours privés pour cela, et dans ce cas tu dois monnayé le savoir du sachant.
    Si tu exposes ton code (partage) des personnes bien attentionnées
    partageront aussi leur savoir et t'aideront.

    Olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Bonjour,

    J'allais le dire.
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Désolé!

    Message initial modifié avec insertion de l'algorithme et du code c++

  5. #5
    Membre expérimenté Avatar de SkyZoThreaD
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2013
    Messages
    583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 583
    Points : 1 615
    Points
    1 615
    Par défaut
    TU pourrais aussi nous dire quels problèmes tu rencontres.
    Enfin, en voilà un qui me saute aux yeux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char c = (entiernaturel%16) + '0' ;
    C'est sympas d'utiliser la table ascii mais encore faut-il la connaître. De 0 à 9 ça peut fonctionner mais ensuite il y a ':' ';' '<' ... et non 'A' 'B' 'C' ...
    La liberté est à la sociologie ce que l'instant présent est à la physique relativiste.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci de votre message!
    Je ne parviens pas à insérer le vecteur caractère destiné à mémoriser les digits acceptés en base 16 pour les deux sens de conversion.
    Aussi, lorsque je convertis 650 en base 16, cela m'affiche 28: au lieu de 28A.

    Cordialement,

  7. #7
    Membre expérimenté Avatar de SkyZoThreaD
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2013
    Messages
    583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 583
    Points : 1 615
    Points
    1 615
    Par défaut
    Citation Envoyé par debprog01 Voir le message
    Aussi, lorsque je convertis 650 en base 16, cela m'affiche 28: au lieu de 28A.
    C'est ce qu'il me semblait. L'algorithme pour convertir le modulo en caractères doit être plus compliqué que ça. Il faut gérer les restes entre 0 et 9 comme tu l'as fait et ceux de A à F avec un autre offset (+'A' au lieu de +'0').
    La liberté est à la sociologie ce que l'instant présent est à la physique relativiste.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Du coup, si on se penche sur l'algorithme sans trop de rigueur, il faudrait que j'insère:
    Si entiernaturel<10 alors hexadecimal = '0' + entiernaturel + hexadecimal
    Si entiernaturel<36 alors hexadecimal = 'A' + (entiernaturel-10) + hexadecimal
    Par contre, je ne vois pas comment le traduire en algorithme et l'insérer dans l'algorithme.
    De plus, il faut que j'utilise un vecteur caractère. Ce n'est pas le cas non?
    Comment est-ce que je peux faire pour qu'à 0,1,...2 il affecte la valeur respective et à 10,11,...,15 il affecte A,B,...,F tout en utilisant un vecteur caractère valable dans les 2 sens?

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Il faut distinguer le stockage de l'affichage.
    Tu peux stocker un chiffre par unsigned char (qui est un type d'entier), et choisir le char à afficher au moment opportun.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par ternel Voir le message
    Il faut distinguer le stockage de l'affichage.
    Tu peux stocker un chiffre par unsigned char (qui est un type d'entier), et choisir le char à afficher au moment opportun.
    Bonjour,

    Merci pour votre message! J'ai compris ce vous voulez dire mais je ne vois pas comment cela peut débloquer mon problème à savoir l'insertion d'un vecteur caractère pour mémoriser les digits de la base 16 de manière à ce que ce vecteur puisse servir dans les deux sens lors de la conversion.

    Bien cordialement,

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 6
    Points : 1
    Points
    1
    Par défaut RESOLU
    Sujet RESOLU, merci quand même à ceux qui ont participé par leurs remarques!

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/09/2010, 09h13
  2. [débutant] besoin d'aide pour un programme
    Par acdchornet dans le forum C++
    Réponses: 12
    Dernier message: 26/10/2006, 22h32
  3. [Free Pascal] Besoin d'aide pour un programme
    Par ricomix dans le forum Free Pascal
    Réponses: 3
    Dernier message: 04/06/2006, 17h01
  4. aide pour un programme a compiler
    Par letombeur dans le forum C++
    Réponses: 8
    Dernier message: 11/01/2006, 21h53

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