Conversion decimal binaire en C

Fermé
lechat - 7 déc. 2008 à 21:34
 Niouk - 2 mars 2011 à 12:47
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");

}

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
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 :
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
2
merci beaucoup j'ai bien compris mon erreur.
0
Fiddy est ce que tu peux m'expliquer en detail tom algorithme sil te plait
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
14 avril 2010 à 07:44
bin[i++]=x%2+'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,
0
pardon j'ai oublié le return b en postant.
0
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 338
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 :
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;
}
0
MERCIII
0