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 :

Convertisseur décimal vers binaire


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 109
    Points : 93
    Points
    93
    Par défaut Convertisseur décimal vers binaire
    Bonjour j'essaye aujourd'hui de faire un convertisseur décimal binaire mais j'ai un souci :

    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
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
        char reste[256]="";
        char result[256]="";
        int ent;
        printf("Saisir un nombre: ");
        scanf("%d", &ent);
        while(ent != 0){
            ent=ent/2;
            printf("nombre entier: %d\n", ent);
            sprintf(reste, "%d", ent%2);
            strcat(result, reste);
            printf("Binaire : %s \n", result );
    }
     
     
     
     
     
     
        return (0);
    }
    J'ai essayé de faire des divisions successives par 2 tant que mon entier est différent de 0, et d'ajouter le reste de la division avec sprintf à une chaine pour ensuite concaténer en boucle mais ça ne marche pas du tout !

    pour 10 ça marche, ça me donne 1010 par contre pour 22 ça me donne 11010 alors ça devrait me donner 10110

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Bonjour,

    Ce n'est pas mauvais du tout ! Il y a juste deux défauts :

    • Tu fais ta division à la ligne 12 et mets à jour ta variable, alors que tu extrais le reste à la ligne 14. L'opérateur modulo « % » fait lui-même sa propre division, il ne récupère pas le résultat de la division précédente. La division proprement dite devrait se retrouver en fait tout en bas de ta boucle.
    • Une fois le processus terminé, il faut lire la suite de bits dans l'ordre inverse, du dernier jusqu'au premier.


    Si tu lances ton programme avec un nombre suffisant de valeurs, tu t'apercevras que tu obtiens bien les bonnes valeurs mais à l'envers et décalées d'un bit (un bit en trop d'un côté et un bit manquant de l'autre).

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 109
    Points : 93
    Points
    93
    Par défaut suite
    Re-bonjour,

    J'ai changé mon code tout à l'heure mais ce n'était qu'une partie de mon exercice !

    L'exercice en question, demande à l'utilisateur de saisir un nombre, mon algo est censé calculer l'équivalent binaire pour chaque nombre entre 1 et ce nombre, puis de déterminer pour chaque conversion binaire si celle-ci est un palindrome : 1001 est un palindrome et pour chaque binaire déterminé comme palindrome, faire la somme de chaque nombre(non binaire donc).
    ex : ou ent est égal à 5 :
    1=1
    3=11
    5=101
    1+3+5=9

    Voilà pour que ce soit clair, parceque j'étais pas sur que ça soit bien expliqué !
    Voilà mon code :
    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
     
    #include <stdio.h>
    #include <string.h>
     
     
     
    int main(void)
    {
     
    	int i;
     
    	char reste[256]="";
        char result[256]="";
        int ent=0;
    	char result2[256]={};
    	int longueur = strlen(result);
    	int resultMul=1;
     
    	printf("Saisir un nombre: ");
    	scanf("%d", &ent);
    	for(i=1 ; i<ent; i++ ){
    		while(i != 0){
            	sprintf(reste, "%d", i%2);
            	strcat(result, reste);
            	i=i/2;
            	printf("Binaire de %d: %s \n", i, result );
    			result2[i] += result[longueur-i-1];
    			printf("%s", result2);
    			if(strcmp(result, result2) ==0){
    				printf("Le Binaire de %d est un palindrome", i);
    				resultMul += i;
    			}
     
     
     
    	}
     
    	return 0;
    		}
    }

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par drakop Voir le message
    Re-bonjour,

    J'ai changé mon code tout à l'heure mais ce n'était qu'une partie de mon exercice !
    […]

    Voilà pour que ce soit clair, parceque j'étais pas sur que ça soit bien expliqué !
    Bien mais du coup, ça ne nous dit pas où est ton problème. Par contre, il y en a déjà qui saute aux yeux : entre les lignes 21 et 25, tu utilises ton indice de boucle i comme accumulateur pour faire tes calculs, et tu le divises par 2 successivement jusqu'à ce qu'il arrive à zéro. C'est utile pour le décomposer en binaire mais par conséquent, à chaque tour de boucle, i vaut de nouveau zéro. Ta boucle tourne à l'infini et ne progresse jamais.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 109
    Points : 93
    Points
    93
    Par défaut re
    En gros j'ai essayé de tester avec uniquement 2 boucles, 3 boucles mais ça n'a pas marché.

    En gros j'ai obtenu principalement 2 resultats :

    1- le i qui démarre à 0 ce qui est bizarre car je l'ai initialisé à 1 et j'ai qu'une seule fois le reste et je n'ai pas les autres printf etc.

    Saisir un nombre: 5
    Binaire de 0: 1
    2- toujours le i à 0 mais cette fois une boucle infinie
    Saisir un nombre: 5
    Binaire de 0: 11111111111111111111111111111111111111 etc etc


  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Je viens de t'expliquer pourquoi : tu utilises i comme indice de boucle mais tu travailles dessus quand tu fais tes calculs. C'est absurde.

    Passe par une variable intermédiaire : déclare un « int j », remplace tous tes i par des j dans la boucle for de la ligne 21, et insère une ligne i=j; entre les lignes 21 et 22.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 109
    Points : 93
    Points
    93
    Par défaut re
    Merci,

    Faut-il modifier aussi les i pour les calculs ?(je pense pas mais sait-on jamais) car j'ai fait les changements que tu m'as donné et j'ai toujours le même soucis.

    Saisir un nombre: 5
    Binaire de 0: 1
    Par contre ici dans l'exemple que j'ai donné, il y a que deux boucles tu penses que c'est suffisant du coup ?

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par drakop Voir le message
    Faut-il modifier aussi les i pour les calculs ?(je pense pas mais sait-on jamais) car j'ai fait les changements que tu m'as donné et j'ai toujours le même soucis.

    Par contre ici dans l'exemple que j'ai donné, il y a que deux boucles tu penses que c'est suffisant du coup ?
    Bonjour

    J'ai l'impression de voir Panoramix dans "le combat des chefs" quand il a perdu la mémoire et qu'il tente de faire de la potion magique. Il demande à Astérix "est-ce que je mets ça aussi" et Astérix lui répond "ben si tu veux !!!"

    On n'écrit pas un code en demandant "est-ce que tu penses que ça va marcher ?" !!! C'est toi qui dirige ton algo et qui le fait aller où tu veux qu'il aille et non où il pourrait avoir envie d'aller. Comme le dit Grospiron, "c'est toi qui dirige tes skis et non tes skis qui te dirigent". Donc commence par réfléchir sur "comment convertir un nombre en binaire" et tu trouveras automatiquement combien il te faut de boucles. Ensuite en évitant d'utiliser une même variable dans plusieurs contextes simultanés (sauf si tu bosses avec un ordi quantique mais j'ai un doute) tu t'en sortiras.

    Maintenant pour ton problème: celui-ci se divise (selon moi) en 3 parties
    1. générer (ou remplir) une chaine représentant un nombre "n" écrit en binaire
    2. indiquer si une chaine est un palindome
    3. effectuer cette conversion et ce test pour tous les entiers situés entre 1 et un nombre saisi par l'utilisateur



    Ben (toujours pour moi) une solution probable serait de créer une fonction pour chacune de ces parties. Ainsi tu pourrais les tester de façon individuelles (tests unitaires) avant de les faire tourner ensembles (tests d'intégration).

    PS: eventuellement la partie 3 étant un "englobement" des deux autres, et n'étant elle-même utilsée nulle part, cette "partie 3" peut alors être directement intégrée dans le main()
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Salut,

    Tu peux aussi utiliser cette formule

    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
     
    int main(int argc, char *argv[], char* env[])
    {
             unsigned int dec = 16;
             short BINW_SZ = 8*sizeof(unsigned int);
             unsigned int binw[BINW_SZ];
             unsigned int bit=1;
     
             int i;
             for (i=0 ; i<=BINW_SZ-1 ; i++)
                binw[i] = (dec & bit)>>i, bit <<= 1;
     
             for (i=BINW_SZ-1 ; i>=0 ; i-- )
                printf("%u",binw[i]);
     
         return 0;
    }
    A chaque itération de boucle, tu réalises un ET binaire entre les valeurs décimales dec et bit. bit étant initialisé à 1. Donc première itération, 16 & 1 = 0, ensuite tu fais un décalage à gauche de bit ( tu multiplies bit par 2 par conséquent puisque tu passes à la puissance suivante 0001 puis 0010 puis 0100 ) donc la prochaine opération sera 16 & 2 puis 16 & 4, puis 16 & 8. Et tu enregistres le résultat dans un tableau que tu affiches par la suite.


    Cordialement.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

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

Discussions similaires

  1. [PIC 18F] Convertisseur Décimal/Binaire to DTMF en assembleur
    Par YASSSCOTT dans le forum Autres architectures
    Réponses: 0
    Dernier message: 20/03/2015, 15h56
  2. conversion décimal vers binaire 32 bit
    Par Oscar02 dans le forum Débuter
    Réponses: 4
    Dernier message: 11/05/2014, 02h12
  3. Convertir un décimal en binaire
    Par rouliane dans le forum C++
    Réponses: 4
    Dernier message: 14/12/2006, 16h15
  4. Réponses: 2
    Dernier message: 06/11/2006, 09h55
  5. Probleme convertisseur RS232 vers RS485
    Par nico_ioltech dans le forum Composants
    Réponses: 2
    Dernier message: 05/10/2005, 09h10

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