cs_darkwhite
Messages postés133Date d'inscriptionvendredi 17 novembre 2000StatutMembreDernière intervention29 avril 2008
-
18 juil. 2007 à 14:12
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 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];
fredsor
Messages postés198Date d'inscriptionlundi 24 avril 2006StatutMembreDerniè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
ctx_man
Messages postés285Date d'inscriptionmardi 28 décembre 2004StatutMembreDernière intervention20 janvier 20133 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²
...
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 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
cs_darkwhite
Messages postés133Date d'inscriptionvendredi 17 novembre 2000StatutMembreDernière intervention29 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 :
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.)
ctx_man
Messages postés285Date d'inscriptionmardi 28 décembre 2004StatutMembreDernière intervention20 janvier 20133 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.
ctx_man
Messages postés285Date d'inscriptionmardi 28 décembre 2004StatutMembreDernière intervention20 janvier 20133 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"
cs_darkwhite
Messages postés133Date d'inscriptionvendredi 17 novembre 2000StatutMembreDernière intervention29 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
ctx_man
Messages postés285Date d'inscriptionmardi 28 décembre 2004StatutMembreDernière intervention20 janvier 20133 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.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 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).