Convertir un entier binaire en decimal (Langage C) ?? [Résolu/Fermé]

Messages postés
10
Date d'inscription
samedi 25 février 2012
Statut
Membre
Dernière intervention
23 avril 2014
- - Dernière réponse : fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
- 20 mai 2016 à 20:43
Bonjour,

Je suis bloquer, si qelq1 peut m'aider. mon prob est le suivant:

Comment écrire un programme (en Langage C) qui converti un entier binaire en décimal.

j'ai réussis a créer un prog qui converti un entier décimal en binaire, mais j'ai bloquer dans le sens contraire !!

si qelq1 peut m'aider et Merciii d'avance.
Afficher la suite 

9 réponses

Meilleure réponse
Messages postés
215
Date d'inscription
mardi 25 décembre 2012
Statut
Membre
Dernière intervention
28 novembre 2014
34
31
Merci
Bonjour,
Ton problème est de convertir le binaire en décimal ? C'est bien cela ?

Dire « Merci » 31

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 66047 internautes nous ont dit merci ce mois-ci

Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1620
4
Merci
Bonjour,

Commence par nous poster le "code" que tu as fait. On pourra se faire une idée plus précise (n'oublie pas de le mettre dans les balises "code" (à droite du bouton "souligné")).

Cdlt,

Google is your friend
Messages postés
10
Date d'inscription
samedi 25 février 2012
Statut
Membre
Dernière intervention
23 avril 2014
2
2
Merci
Voila l'idée de code ke j'ai fait:

#include<stdio.h>
#include<string.h>
int i,j,k,n;
char a[30],t['n'],t2['n'];

main(){
       printf("Donner un entier binaire:\n");
       scanf("%s",&a);
       n=strlen(a);
       for(i=n-1;i>=0;i--){
                           for(j=0;j<=i;j++){
                                             t2[k]=0;
                                             t2[k]=t2[k]+(t[j])*(2^i);
                                             k=k+1;
                                             }
                                             }
        for(k=0;k<=n-1;k++){
                            printf("%d",t2[k]);
                            }
               
                      
                      return0;
}
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1620 -
char a[30],t['n'],t2['n'];
int i,j,k,n;
Evite les variables globales. Mets-les dans la fonction.
char t['n']; n'existe pas. Si tu veux un tableau d'une taille connue à l'exécution, je te conseille de passer par un pointeur : char *t. De même pour t2.
Ensuite, une fois que n sera connue, il faudra allouer la taille du pointeur : t=malloc(n); Et une fois que tu ne te serviras plus de la variable, il faudra utiliser, free(t);
main(){
Le prototype de main() sans argument est : int main (void)

t2[k]=0; t2[k]=t2[k]+(t[j])*(2^i);
Aucun intérêt de mettre t2[k] à 0 pour lui affecter une valeur juste après. Cela ne doit pas être dans la même boucle. 2^i, ne calcule pas la puissance (mais xor). Je te conseille de te faire une fonction puissance. Ou à défaut, tu peux utiliser pow() de la libmath.

return0;
Tu as oublié un espace entre return et 0;

Je te laisse tout corriger. Teste et indique-nous les erreurs qui restent.
yyassinos
Messages postés
10
Date d'inscription
samedi 25 février 2012
Statut
Membre
Dernière intervention
23 avril 2014
2 -
Mercii frère FIDDY pour tes conseils, enfin j'ai trouver la solution:

#include <stdio.h>
#include <math.h>

main()
{
int i,n,d=0;
int t['n'];
printf("Donnnez le nombre de bits a convertir : ");
scanf("%d",&n);

for(i=n-1;i>=0;i--)
{
printf("\nDonnez le i EME  bit : ");
scanf("%d",&t[i]);
}

for(i=0;i<n;i++)
{

d=d+t[i]*pow(2,i);
}
printf("\nLe nombre en decimal est : %d",d);

return 0;
}
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1620 -
Tu n'as pas suivi tous mes conseils...
main() -> int main(void)
int t['n']; -> archi faux, je t'ai dit comment faire...
yyassinos
Messages postés
10
Date d'inscription
samedi 25 février 2012
Statut
Membre
Dernière intervention
23 avril 2014
2 -
Bien reçue..Merciii :)
Messages postés
5
Date d'inscription
samedi 19 janvier 2013
Statut
Membre
Dernière intervention
20 janvier 2013
2
2
Merci
assalamou alaykom :)

j'ai 1 an sans faire aucun de language C lol , mais j'étais excellente, je pense que c'est une bonne idée

soit b votre nombre binaire à determiner l'équivalent en entier , exemple 11000101
le résultat (le nombre entier) est la somme ; i est un compteur (degré de puissance ou position)

somme := 0;
i:=0;
while (b>0)
begin
if ((b%10)==1) then %le chiffre des unité%
begin
if (i==0) then somme=1;
else
puis2 := 1;
for (y=1;y>i;i++)
puis2 := puis2 * 2; %2 à la puissance i %
end;
somme = somme + puis2;
b:=b/10;
i:=i+1;
end;

return somme;


bonne chance
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1620 -
j'ai 1 an sans faire aucun de language C lol , mais j'étais excellente,
Ce n'est pas du C que tu as donné, mais du Pascal...
KX
Messages postés
16082
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
27 novembre 2019
2462 -
"Ce n'est pas du C que tu as donné, mais du Pascal..."
Même pas ^^
monacoccm
Messages postés
5
Date d'inscription
samedi 19 janvier 2013
Statut
Membre
Dernière intervention
20 janvier 2013
2 -
On ne tient pas compte du language, il suffit d'avoir l'idée, merci de vos propres commentaires, les plus modestes sont les savants,.... sachant qu'on peut l'inverser
Messages postés
253
Date d'inscription
vendredi 23 février 2007
Statut
Membre
Dernière intervention
1 mai 2014
29
1
Merci
Bonjour,

#include<stdio.h>
#include<string.h>


int main(void){
int i,n;
char a[30];
printf("Donner un entier binaire:\n");
scanf("%s",&a);
n=strlen(a);
int resultat=0;
for(i=n-1;i>=0;i--){
if(a[i]=='1'){
resultat+=(2^(i+1));
}
}
printf("Resultat : %d",resultat);
return 0;
}
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1620 -
scanf("%s",&a);
Pas de &.

2^(i+1) ?
^ n'est pas l'opérateur de puissance en C.
Et puis c'est pas 2 puissance i+1 qu'il faut mettre mais 2 puissance i.

printf("Resultat : %d",resultat);
Faut flusher stdout. Soit explicitement, soit avec \n.
Oui il y a plus des faut :
on ne peux mettre 2(i+1)
il faut que déclare include <math.h> et puis met pow(2,i) et ne modifie rien comme (2,i+1)
bon chance :p
Messages postés
253
Date d'inscription
vendredi 23 février 2007
Statut
Membre
Dernière intervention
1 mai 2014
29
1
Merci
J'ai refais le programme, je me suis trompé, c'étais pas i+1, j'ai ajouté une fonction puissance 2:

#include<stdio.h>
#include<string.h>

int power2(n){
int resultat=1;
while(n>0){
resultat*=2;
n--;
}
return resultat;
}

int main(void){
int i,n;
char a[30];
printf("Donner un entier binaire:\n");
scanf("%s",&a);
n=strlen(a);
int resultat=0;
for(i=n-1;i>=0;i--){
if(a[i]=='1'){
resultat+=(power2(i));
}
}
printf("Resultat : %d",resultat);
return 0;
}
KX
Messages postés
16082
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
27 novembre 2019
2462 -
Pourquoi tu ne vérifies pas les codes que tu proposes ?
Tu verrais d'une part que ça ne compiles pas (il te manque un int dans la déclaration de power2) et d'autre part que ça ne fais pas ce que l'on veut car tu considères que a[i] correspond à 2^i ce qui est faux, car les bits se lisent de droite à gauche, contrairement au tableau qui va de gauche à droite !

De plus en utilisant la fonction power2 comme tu le fais, tu refais tout le calcul de 2^n à partir de 1 à chaque itération, tu fais donc beaucoup plus de calculs que nécessaire, car il suffit d'une petite opération pour modifier la puissance d'une itération à l'autre.

int n=strlen(a);
int resultat=0;
int puissance=1;

for (int i=n-1; i>=0; i--)
{
    if (a[i]=='1')
        resultat += puissance;
    puissance *= 2;
}

Ou alors, pour optimiser un peu (en évitant par exemple le calcul de strlen) :

int resultat=0;
char* b = a;

for(;;)
{
    if (b[0]=='1')
        (resultat <<= 1)++;
    else if (b[0]=='\0')
        break;
    else
        resultat <<= 1;

    b++;
}
ljm972
Messages postés
253
Date d'inscription
vendredi 23 février 2007
Statut
Membre
Dernière intervention
1 mai 2014
29 -
Tu as entièrement raison. Tu as optimisé le code.
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1620 -
KX, le fan du C99 :p.
Messages postés
253
Date d'inscription
vendredi 23 février 2007
Statut
Membre
Dernière intervention
1 mai 2014
29
0
Merci
Non, c'est bien i+1, car dans la boucle i arrive à zéro,
J'ai testé "^" en C, et ça fonctionne bien, de mon coté.
Ce code fonctionne -t-il chez vous ?
KX
Messages postés
16082
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
27 novembre 2019
2462 -
Le ^ existe en C, mais comme le disait fiddy, il ne s'agit pas d'un opérateur de puissance, mais d'un opérateur OU exclusif (voir Langage C - Les opérateurs).

Exemple : 2 ^ 6 = 010 ^ 110 = 100 = 4. On est loin de 64...
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1620 -
Non, c'est bien i+1, car dans la boucle i arrive à zéro,
Non ! Prends un exemple concret, et tu verras bien.
Prenons par exemple a=10
Dans ce cas, n = 2
1ère boucle : i = n-1 = 1
a[1] = 1 donc resultat = resultat + 2 puissance (i+1) = 0 + 2 puissance 2 = 4.
2ème boucle : i = i-1 = 0
a[1] = 0 donc on touche pas à resultat
Donc resultat = 4.
Outch.
Re teste avec 2 puissance i, et là ça fonctionne ;-)

'ai testé "^" en C, et ça fonctionne bien, de mon coté.
J'ai pas dit que ça ne fonctionnait pas mais que cela ne représentait pas l'opérateur puissance. ^ représente le xor... Rien à voir.
0
Merci
int binaire(int n){
int s=0,i=0;
while(n>0){
s+=(n%10)*pow(2,i);
n/=10;i++;
}
return s;
}
0
Merci
#include<stdio.h>
#include<conio.h>
#include <math.h>
main()
{
int n,d,i,nb,p,s=0;
printf(" donnez le nombre de bits \n ");
scanf("%d",&nb);
int t[nb];
printf("\n la methede pour entrer un nombre en binaire ");
for(i=0;i<nb;i++)printf("\n * ");
printf("<= le pois le plus fort \n");
printf("\n donnez le nombre en binaire \n");
for(i=0;i<nb;i++)
{
scanf("%d",&t[i]);
}
for(i=0;i<nb;i++)
{
p=t[i]*(pow(2,i));
s=s+p;
}
for(i=nb-1;i>=0;i--)
{
printf(" %d",t[i]);
}
printf(" => %d ",s);
getch();}
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1620 -
Pas terrible comme réponse sur un sujet datant de 3 ans... Le code ne respecte pas la norme.