Conversion decimal binaire en C
lechat
-
Niouk -
Niouk -
Bonjour, j'ai créé une fonction qui convertie un nombre decimal en un binaire. mais lorsque j'execute mon programme ça me renvoie des caracteres comme des smileys, des tirets.. bref pas le bon resultat. je ne comprends pas bien où est le pb. je sais qu'il est deconseillé d'utilisé la fonction strtol mais comme je n'ai aucun calcul a faire sur le binaire renvoyé je ne sais pas si dans mon cas c'est grave. sinon je veu bien renvoyer une chaine de caractere mais je ne sais pas exactement comment faire. je sais juste qu'il faut renvoyer un pointeur de chaine ...merci d'avance.
int binaire(int x)
{
if (x > 0)
{ int i=0;
char bin[32];
int b;
binaire(x / 2);
printf("%d", x % 2);
bin[i]=x%2;
i++;
printf("%s\n",bin);
b = strtol(bin,NULL,10);
}
}
int main()
{
int a; /*entier converti*/
int x; /*entier a convertir*/
printf("x?\n");
scanf("%d",&x);
a=binaire(x);
printf("binaire:%d\n",a);
printf("END OF MAIN");
}
int binaire(int x)
{
if (x > 0)
{ int i=0;
char bin[32];
int b;
binaire(x / 2);
printf("%d", x % 2);
bin[i]=x%2;
i++;
printf("%s\n",bin);
b = strtol(bin,NULL,10);
}
}
int main()
{
int a; /*entier converti*/
int x; /*entier a convertir*/
printf("x?\n");
scanf("%d",&x);
a=binaire(x);
printf("binaire:%d\n",a);
printf("END OF MAIN");
}
A voir également:
- Programme de conversion binaire en décimal
- Binaire - Guide
- Programme demarrage windows - Guide
- Mettre en veille un programme - Guide
- Logiciel gratuit conversion calendrier républicain - Télécharger - Études & Formations
- Message programmé iphone - Guide
4 réponses
Salut,
Ton algorithme est faux. En plus tu stockes dans une chaîne de caractères non pas le code ascii et non pas la valeur. Ce qui fait bugger strtol.
Dans cet algorithme, il ne faut pas oublier d'inverser l'ordre des retenus. Je n'ai pas testé mon programme, mais ça devrait marcher. N'hésite pas à poser des questions :
J'ai essayé de respecter la forme de ton algo avec l'usage de la chaîne de caractère, mais il y a moyen de faire sans et donc de ne pas se limiter à une chaîne de taille 32.
Cdlt
Ton algorithme est faux. En plus tu stockes dans une chaîne de caractères non pas le code ascii et non pas la valeur. Ce qui fait bugger strtol.
Dans cet algorithme, il ne faut pas oublier d'inverser l'ordre des retenus. Je n'ai pas testé mon programme, mais ça devrait marcher. N'hésite pas à poser des questions :
int binaire(int x) { if (x > 0) { int i=0; char bin[32]; int b=0; while(x>0){ bin[i++]=x%2+'0'; x/=2; } while(i>0){ b=(bin[--i]-'0')+10*b; } return b; } return -1; }
J'ai essayé de respecter la forme de ton algo avec l'usage de la chaîne de caractère, mais il y a moyen de faire sans et donc de ne pas se limiter à une chaîne de taille 32.
Cdlt
Pourquoi utiliser une récursive ? On peut très bien faire ça en itératif et c'est plus rapide et plus lisible :
Et ton main() est incorrect :
char* binaire(int n, char* buffer) { char* buf = buffer; int rem; do { rem = n%2; n /= 2; if (rem>9) rem+=7; *buf = 48+(char)rem; buf++; } while (n>0); *buf='\0'; strrev(buffer); return buffer; }
Et ton main() est incorrect :
int main(int argc, char* argv[]) { int n; char buf[33]; printf("Conversion base 10 -> base 2.\n\nEntrez un nombre : "); scanf("%d",&n); binaire(n,buf); printf("En base 2 : %s\n\n",buf); return 0; }
On récupère le reste de la division de x par 2 (x%2) et on le convertit en char (+'0' (code ascii du chiffre 0)). Et on passe à la case d'après dans le tableau (i++).
x/=2;
On divise x par 2.
while(x>0)
On réalise les deux opérations ci-dessus tant que x est non nul.
Ainsi, on récupère dans une chaîne de caractères les restes des divisions successives par 2 de l'entier à convertir en binaire. Il ne reste plus qu'à inverser la chaîne pour avoir le nombre en binaire.
b=(bin[--i]-'0')+10*b;
On décrémente i (--i) pour passer au caractère précédent.
On part de la fin de la chaîne bin et on récupère le caractère qu'on convertit en nombre (-'0'). Et on y ajoute 10*b. C'est-à-dire qu'on décale b d'un cran sur la gauche (multiplication par 10) et on y ajoute les unités (ici le reste précédemment calculé).
while(i>0)
On répète l'opération précédente pour tous les caractères de la chaîne bin.
return b;
b contient alors l'integer en binaire.
Cdlt,