Classique code : conversion decimale=>binaire

Signaler
Messages postés
133
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
29 avril 2008
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
salut à tous,
Comme un nombre incalculable de gens je dois faire le desormais classique code : convertir du binaire en decimale. Pour ma part je l'ai ecrit comme ça :

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

int main ()
{
 

  int longueur=0,i=0,j=0,resultat=0;
  char nb_lu[256];
 
  scanf("%s",&nb_lu);
  longueur=strlen(nb_lu);
  for(i=longueur;i>0;i--)
    {
      resultat+=nb_lu[i]*puissance(2,j);
      j++;
    }
  printf("%d\n",resultat);

  return 0;
}

int puissance (int x,int exposant)
{
  int i,resultat=x;
  for(i=0;i<exposant-1;i++)
    {
      resultat*=x;
  
    }
  return resultat ;
}

Comme sa n'affiche que des conneries, je vous demande qu'est ce qu'il cloche dans mon code

Voila merci d'avance
a+
A voir également:

17 réponses

Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

Salut,
Je comprends pas ton " i<exposant-1 "
puisque tu fais commencer i à 0, si tu demande la puissance à 4, il va juste te calculer de 0 à 2 non?
Sinon quand tu dis qu'il te mets des conneries, c'est des conneries qui ont du sens quand meme? ca reste des multiples de 2?
Ciao
Messages postés
198
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
3 avril 2008

Excuse pour ma premiere remarque elle tient pas la route, j'avais pas fait gaffe au premier resultat*
Mais ca empehce pas ma deuxieme question?
Messages postés
133
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
29 avril 2008

Bah c'est des puissances de 2 en tout cas : pour transformer un binaire en decimal il faut multiplier chaque rang par la puissance de 2 associé ??

110 = 1*2^2+1*2^1+0*2^0=5
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

Salut !
Si j'ai bien comprit, tu as une chaine qui contient un nombre sous la forme binaire et tu veux obtenir un nombre décimal à la place ?

Commence par retourner ta chaine, ca sera plus simple, comme ca l'index 0 correspond au nombre de poids faible. Mais encore mieux, tes index correspondent à ta puissance

memset(nbl_u, 0, 256); //Ca c'est juste pour être certain qu'on ne va pas partir n'importe où dans la mémoire.
scanf("%s", &nb_lu);
nb_lu = [_]strrev(nb_lu); //Le [_] c'est parce que la version POSIX de la fonction c'est "char* strrev(char*)" mais sous Visual Studio elle est dépréciée au profit de la version ISO C++ "char* _strrev(char*)" Comme tu le vois, il n'y a que le "_" qui change

maintenant que ta chaine est retournée ca va être simple :
longueur = strlen(nb_lu);
for(int i = 0; i < longueur; i++)
resultat += pow(2, i) * nb_lu[i]; //T'emmerdes pas à faire une fonction puissance, yen a une standard qui fonctionne parfaitement bien.

Sinon ta fonction puissance est fausse.
Si tu fait puissance (1000, 0), ca te retourne 1000 alors que ca doit faire 1.

En plus elle est un peu mal foutue je trouve. J'aurais écrit ca plutot :

int puissance(int base, int pow)
{
int res = 1; //Le résultat d'une puissance c'est jamais 0, mais 1 minimum.
while(pow--) // On utilise de préférence les for quand on sait combien de fois ca va tourner ou que se sert de l'indice
res *= base;
return res;
}

Avec ce code, si pow == 0, ca retourne 1,
si pow 1 ca retourne 1 * base base,
si pow 2 ca retourne 1 * base * base base²
...
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Quand tu écris : resultat+=nb_lu[i]*...
Dans nb_lu[i], tu as le code ascii du caractère et non pas 0 ou 1.
tu peux faire resultat+=(nb_lu[i]-0x30)*... ca devrait marcher
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

Ah oui c'est vrai aussi ca, j'avais zapé.
Messages postés
133
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
29 avril 2008

Merci pour vos reponsses rapides.

ctx: pour utiliser la fonction strrev, faut-il declarer des librairies particulieres (moi j'ai declarer stdio et math). Et je n'ai pas bien compris ton explication denormes maus on j'ai mis sa dans mon code :

 memset(nb_lu, 0, 256);
  scanf("%s",&nb_lu);
  nb_lu = [_]strrev(nb_lu);
   longueur=strlen(nb_lu);
for( i = 0; i < longueur; i++)
    resultat += pow(2, i) * nb_lu[i];

Et a la compile j'ai
darkwhite:/media/sda5/Dossier pierre/c/ioi# gcc -lm -o  dec dec.c
dec.c: In function ‘main’:
dec.c:12: error: expected expression before ‘[’ token
dec.c:12: error: ‘_’ undeclared (first use in this function)
dec.c:12: error: (Each undeclared identifier is reported only once
dec.c:12: error: for each function it appears in.)
Messages postés
133
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
29 avril 2008

juju : dans un char comme char nb=010 ;
                                  char[0] est different de 0 ??
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

LOOL,
je t'ai expliquer que le [_] c'est parce que le "_" devant strrev est optionnel, suivant ton compilateur.
Donc soit tu utilise strrev(...) soit tu utilise _strrev(....)
[_]strrev(...) ca existe pas et ca veut rien dire d'ailleur.
Vu que tu utilise gcc, c'est strrev(...) qu'il te faut utilisé.
c'est du standard, c'est comprit dans <strings.h> si je me souvient bien.
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

au passage je répond a ta question,
oui, char nb=010; c'est pas possible.
Ce que tu as vraiment c'est char nb[] = "010";
Et ca c'est des lettes, pas des chiffres. Pour transformer une lettre numérique en chiffre il faut lui soustraire la lettre numérique "0".
"0" - "0" = 0
"1" - "0" = 1
mais "0" - 0 = "0"
Messages postés
133
Date d'inscription
vendredi 17 novembre 2000
Statut
Membre
Dernière intervention
29 avril 2008

Heu pour la fonction

nb_lu = strrev(nb_lu);

j'ai un bleme a la compile :
darkwhite:/media/sda5/Dossier pierre/c/ioi# gcc -lm -o  dec dec.c
dec.c: In function ‘main’:
dec.c:12: error: incompatible types in assignment
Messages postés
285
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
20 janvier 2013

Oui, normal c'est de ma faute, je n'ai prit en compte ta déclaration de nb_lu.
char *nb_lu_reverted = strrev(nb_lu);

Ca vien du fait que ton nb_lu est déclaré en tableau static, et non en pointeur, tu ne peux donc pas lui changer d'adresse.

Tu auras compris que dans la suite du code, il te faudra utiliser nb_lu_reverted au lieu de nb_lu.

En fait, si mes souvenirs sont bon :
strrev(nb_lu);

Ca suffit. Mais c'est a tester, je ne sais plus si la chaine est directement inversée dans son contenant ou si une nouvelle chaine est créee et déposée sur la pile.

N'oublie pas de prendre en compte la remarque de Juju, c'est sa remarque qui fait que la conversion est bonne. Avec mon code elle est plus simple et efficace mais je n'ai pas prit en compte la conversion ascii.
Messages postés
130
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
18 août 2008

Pas la peine d'utiliser des trucs farfelu. Le code suivant va tres bien :

#include

<stdio.h>#include

<math.h>#include

<string.h>int

Bin2Dec(
const
char *pszBin){
int number, p;number p 0;

const
char *pszbuf = pszBin;

const
char *pszorig = pszBin;

while (*pszbuf) pszbuf++;
// on se place a la finpszbuf--;

while ((pszbuf - pszorig) != -1) {number += (*pszbuf - 0x30) * pow(2.0,

static_cast<
double>(p));++p;

pszbuf--;

}

return number;}

int

main(
int argc,
char *argv[]){

char szarg[] =
"1010101";printf_s(

"%d\n", Bin2Dec(szarg));

return 0;}
Messages postés
130
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
18 août 2008

Mince, j'ai poste l'inverse... Mdr... Desole.
Messages postés
130
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
18 août 2008

Ben non c'est bon j'avais raison. Edites ton titre c'est pas decimale=>binaire mais binaire vers decimale.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

Ben dis donc, strlen, strrev et une fonction puissance pour convertir ca, c'est du lourd.


c'est pas plus simple comme ca ?


int Bin2Dec(const char* bin)

{

   int dec;

   for(dec = 0; *bin; bin++)

   {

      dec *= 2;

      dec += *bin - '0';

   }

   return dec;

}
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Et bien, vous n'avez pas cherché très longtemps sur le site (je ne parle pas pour aardman) :)

J'ai simplement recherché "binaire decimale" avec le moteur de recherche de CS et le premier résultat donne un code qui donne justement la fonction de aardman ainsi que son opposé (décimale->binaire).

http://www.cppfrance.com/recherche.aspx?r=binaire+decimale&tr=source

C++ (@++)<!--