Convertisseur décimal -> binaire en C.

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour j'essaye aujourd'hui de faire un convertisseur décimal binaire mais j'ai un soucis :

 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 succèsives 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 !

Même les divisions succèsives ne marchent pas !

Édité par Drakop

+0 -0

Bonjour,

Tu ne cherches pas à convertir une représentation décimale vers une représentation binaire, mais à obtenir la représentation binaire d'un nombre.

Je pense qu'un bon début serait de revoir tes cours de C. En effet, les blocs en C ne sont pas définis par l'indentation, mais par des accolades. Ici, seule la ligne 12 fait partie du while.

Et tu ferais mieux de mettre cette division par 2 en fin de boucle, pour calculer le bon résultat. Bon résultat qui sera par contre inversé.

Dernière remarque, ta variable reste ne contiendra que trois caractères maximum (en cas de nombre négatif, en comptant le \0). Pas besoin donc d'une taille de 256. Je te conseille aussi plutôt d'utiliser snprintf, voire de faire le calcul à la main, sprintf juste pour sortir 0 ou 1, ça fait un peu usine à gaz.

Auteur du sujet

Ah ouio effectivement quel étourdit je suis, ayant fait du python ça m'arrive de mélanger comme il est possible de ne pas mettre d'accolade si il y a une seule instruction !

En tout cas merci de ta réponse !

Je viens de tester, en effet ça ne marche pas, pour 10 ça marche mais pour 22 ou 25 par ex ça ne marche pas

Édité par Drakop

+0 -0

La meilleur méthode étant d'avoir une variable 'i' qui va s'incrémenter à chaque tour et ajouter '0' ou '1' à res. Ensuite, avec cette même variable tu places le 0 final. Ça t'évite d'avoir à utiliser sprintf ou snprintf qui sont des fonctions un peu lourdes. D'ailleurs autant utiliser "%s%d", pour ta chaîne de format de sprintf plutôt que rajouter un strcat après ^^ .

N'oublie pas de sortir ta dernier ligne de la boucle (celle du printf, celle qui affiche le résultat).

Comme entwanne l'a dit, n'oublie pas de faire la division après avoir pris le modulo.

Pour finir, tu peux utiliser les opérateurs bit à bit pour avoir la représentation binaire d'un nombre.

+0 -0
Auteur du sujet

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 :

 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
#include <stdio.h>
#include <string.h>




int main(void)
{

    int i=1;
    int j=1;
    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++ ){
        i=j;

        while(i != 0){
            sprintf(reste, "%d", j%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;
        }
}
+0 -0

A noter que l'on peut aussi utiliser les opérateurs binaires & et <<

Exemple (rien à voir avec l'exercice, je l'ai vite fait) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main(void) {
    char binaryStr[33];
    int i, k, num;

    printf("Ecrire un nombre\n");
    scanf("%d", &num);
    for(i = 0, k = 1; i < 33; i++, k = k<<1)
    {
        binaryStr[31 - i] = ((num & k) == 0 ? '0' : '1');
    }
    binaryStr[32] = '\0';
    printf("Binaire de %d : %s\n", num, binaryStr);

    return 0;
}

Édité par SylafrsOne

C'est en se plantant qu'on devient cultivé.

+0 -0

Salut,

Des petites remarques supplémentaires (mais tu pourrais aussi prendre en compte celles portant sur ton premier code) :

  • Attention avec les identificateurs de tes variables, on dirait que tu en utilises certain pour plusieurs choses en même temps.
  • J'ai l'impression que tu attends de longueur de « suivre » toujours la longueur de result quand on fait des modifications dessus. Ce n'est pas le cas, ici longueur vaudra 0 tout au long de la fonction. Il faut que tu en gères à la main la modification. Une solution serait de faire tout le temps appel à strlen pour ça, mais une meilleure serait de compter à la main combien de caractères tu ajoutes (notons qu'ici on ne concatène que des 0 et des 1 !).

Édité par Lucas-84

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte