A voir également:
- Programme de conversion binaire en décimal
- Codage binaire - Guide
- Programme demarrage windows 10 - Guide
- Désinstaller programme windows 10 - Guide
- Casio fx-92 affichage décimal ✓ - Forum calculatrices
4 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
7 déc. 2008 à 22:02
7 déc. 2008 à 22:02
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
ghuysmans99
Messages postés
2496
Date d'inscription
jeudi 14 juillet 2005
Statut
Contributeur
Dernière intervention
5 juin 2016
339
14 avril 2010 à 10:32
14 avril 2010 à 10:32
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; }
7 déc. 2008 à 22:25
14 avril 2010 à 06:40
14 avril 2010 à 07:44
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,