Classique code : conversion decimale=>binaire

cs_darkwhite Messages postés 133 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 29 avril 2008 - 18 juil. 2007 à 14:12
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 19 juil. 2007 à 06:06
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+

17 réponses

fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
18 juil. 2007 à 15:10
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
0
fredsor Messages postés 198 Date d'inscription lundi 24 avril 2006 Statut Membre Dernière intervention 3 avril 2008
18 juil. 2007 à 15:14
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?
0
cs_darkwhite Messages postés 133 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 29 avril 2008
18 juil. 2007 à 15:26
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
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
18 juil. 2007 à 15:33
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²
...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
18 juil. 2007 à 15:34
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
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
18 juil. 2007 à 15:40
Ah oui c'est vrai aussi ca, j'avais zapé.
0
cs_darkwhite Messages postés 133 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 29 avril 2008
18 juil. 2007 à 15:51
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.)
0
cs_darkwhite Messages postés 133 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 29 avril 2008
18 juil. 2007 à 15:54
juju : dans un char comme char nb=010 ;
                                  char[0] est different de 0 ??
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
18 juil. 2007 à 15:57
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.
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
18 juil. 2007 à 15:59
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"
0
cs_darkwhite Messages postés 133 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 29 avril 2008
18 juil. 2007 à 16:02
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
0
ctx_man Messages postés 285 Date d'inscription mardi 28 décembre 2004 Statut Membre Dernière intervention 20 janvier 2013 3
18 juil. 2007 à 16:50
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.
0
NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
18 juil. 2007 à 22:03
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;}
0
NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
18 juil. 2007 à 22:12
Mince, j'ai poste l'inverse... Mdr... Desole.
0
NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
18 juil. 2007 à 22:20
Ben non c'est bon j'avais raison. Edites ton titre c'est pas decimale=>binaire mais binaire vers decimale.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
18 juil. 2007 à 22:52
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;

}
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
19 juil. 2007 à 06:06
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++ (@++)<!--
0
Rejoignez-nous