Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1624 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Conversion décimal/binaire/hexadécimal

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Conversion décimal/binaire/hexadécimal

n°1508617
galaxed
Posté le 30-01-2007 à 14:38:58  profilanswer
 

Bonjour à tous,
 
Voila dans le cadre d'un projet d'informatique je dois coder un convertisseur de bases. Les saisies se font via la ligne de commande, le nombres a convertir est donc une chaine.
Or je n'ai pas le droit d'utiliser atoi ( il est dit dans le sujet, que cette fonction n'est pas nécéssaire ). Donc je vous pose question ! Comment je peux faire ? :p. Je cherche depuis un moment déjà mais je trouves pas.
 
Merci d'avance,
 
Galaxed.

Message cité 1 fois
Message édité par galaxed le 30-01-2007 à 14:50:46
mood
Publicité
Posté le 30-01-2007 à 14:38:58  profilanswer
 

n°1508639
Sve@r
Posté le 30-01-2007 à 15:26:47  profilanswer
 

galaxed a écrit :

Bonjour à tous,
 
Voila dans le cadre d'un projet d'informatique je dois coder un convertisseur de bases. Les saisies se font via la ligne de commande, le nombres a convertir est donc une chaine.
Or je n'ai pas le droit d'utiliser atoi ( il est dit dans le sujet, que cette fonction n'est pas nécéssaire ). Donc je vous pose question ! Comment je peux faire ? :p. Je cherche depuis un moment déjà mais je trouves pas.
 
Merci d'avance,
 
Galaxed.


Je ne comprends pas trop l'énoncé (on entre un nb en base 10 et sa base d'arrivée et faut le convertir, on entre un nombre et sa base de départ et sa base d'arrivée et faut faire la conversion, etc...).
Si ton but est de convertir une chaîne (par exemple "127" ) en un nombre corresondant, alors en effet tu peux très bien le faire à la main sans passer par "atoi()" ni même "strtol()"
Tu commences par initialiser ton résultat à 0. Puis tu traites chaque caractère de la chaîne que tu ajoutes au résultat en ayant pris soin de commencer par multiplier celui-ci par 10
 
Exemple: 127  
res=0
traitement "1":

  • res=res * 10 => res=0
  • res=res + 1 => res=1

traitement "2"

  • res=res * 10 => res=10
  • res=res + 2 => res=12

traitement "7"

  • res=res * 10 => res=120
  • res=res + 7 => res=127

Idem pour convertir "127" écrit en base 8 en sa valeur base 10 (on multiplie res par 8 à chaque tour).
 
Il existe aussi des astuces de conversion entre certaines bases. Par exemple passer de la base 2 à la base 8 ou 16 est très rapide car 8=2^3 et 16=2^4 donc dans un cas on groupe les chiffres 3 par 3, dans l'autre on les groupe 4 par 4 et on fait la conversion directement. Idem pour passer de la base 3 à la base 9 (on groupera les chiffres 2 par 2) et aussi entre la base 4 et la base 16 (là aussi on groupera les chiffres 2 par 2)...
 
Sinon je vois pas trop ce que tu dois faire...


Message édité par Sve@r le 30-01-2007 à 15:28:34

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1508640
flo850
moi je
Posté le 30-01-2007 à 15:27:53  profilanswer
 

je présume qu'avec ce projet tu as eu des cours de convesion entre deux bases  
 
tu utilise scanf("%f",&monNombre) pour lire le nombre  
 
tu utilise ta mouliette de conversion ( a savoir que tu pourrai meme le faire en direct avec printif ,mais c'ets aps le but de l'exo )  
 
puis tu affiche le resultat

n°1508643
Sve@r
Posté le 30-01-2007 à 15:29:56  profilanswer
 

flo850 a écrit :

tu utilise scanf("%f",&monNombre) pour lire le nombre


Ben oui j'y ai pensé aussi mais si on lui interdit "atoi()" cela signifie probablement qu'on lui interdit aussi toutes les autres fonctions de conversion de chaîne en nombre sinon ce n'est franchement pas la peine de venir poser la question...


Message édité par Sve@r le 30-01-2007 à 15:30:24

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1508649
galaxed
Posté le 30-01-2007 à 15:41:40  profilanswer
 

En fait, je spécifie dans la ligne de commande la base d'entrée, la base de sortie, et le nombre. En gros je dois faire dec->bin, bin->dec, bin->hexa...etc.
Merci pour l'exemple, je crois avoir compris  :D .
Je vais tester comme ca et je reviens vous embeter si j'ai un probleme :o.
 
PS : Effectivement on nous interdit toutes les fonctions de conversion de châine en nombre.
 
En fait non ca va pas ^^, dans un sens je comprend, de binaire a decimal, et d'hexa a décimal j'ai compris. Mais de décimal a binaire ou de décimal a hexa je rame... :(


Message édité par galaxed le 30-01-2007 à 15:52:36
n°1508697
galaxed
Posté le 30-01-2007 à 16:31:19  profilanswer
 

Pour la conversion de décimal en binaire je vois que 2facons :  
-La méthode des divisions sucessives.
-La méthode ou l'ont soustrait des puissances a chaques fois que cela est possible.
 
Pour ces 2facons je vois pas comment on pourrait se passer de atoi...

n°1508802
exhortae
Membre du Cartel des Médecins
Posté le 30-01-2007 à 18:45:37  profilanswer
 

t'as pas fait d'informatique industrielle??
pcque c'est souvent dans le premier cours qu'on fait la conversion des bases
 
faut utiliser le modulo
 
genre pour la conversion en hexadecimal, tu effectue une division euclidienne de l'entier par 16, puis tu récopère le reste et tu le place dans une chaine de carcteres, vers la fin tu devras inverser la chaine.

Message cité 1 fois
Message édité par exhortae le 30-01-2007 à 18:46:28
n°1508813
Sve@r
Posté le 30-01-2007 à 19:37:04  profilanswer
 

exhortae a écrit :

t'as pas fait d'informatique industrielle??
pcque c'est souvent dans le premier cours qu'on fait la conversion des bases


On le fait dans tous les premiers cours d'info, même la non-industrielle...
 

exhortae a écrit :

genre pour la conversion en hexadecimal, tu effectue une division euclidienne de l'entier par 16, puis tu récupères le reste et tu le place dans une chaine de carcteres, vers la fin tu devras inverser la chaine.


Ben oui, tout le monde sait faire ça. Le pb c'est qu'en entrée, il n'a pas un nombre, il a une chaîne représentant un nombre.
Genre on lui passe "123" lui il récupère le tableau {'65', '66', '67', 0}. Va donc faire un programme de divisions avec ça..... sans le convertir en "nombre 123" je vois pas comment faire (ou alors j'ai pas compris l'énoncé !!!)


Message édité par Sve@r le 30-01-2007 à 19:38:12

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1508820
exhortae
Membre du Cartel des Médecins
Posté le 30-01-2007 à 19:49:15  profilanswer
 

mais je pense qu'il a le droit d'écrire lui même sa fonction atoi non??
 
genre on part d'un N = 0 qui est le résultat numérique final.
 
on fait une boucle avec comme condition tant que le tableau est plein et que le caractere lu est un chiffre compris entre 0 et 9.
 
et on utilise cette relation
 
N = N*10 + (CH[I]-'0');
 
il a le droit de faire ça à mon avis enfin comme tu le dis je vois pas comment le faire autrement

Message cité 1 fois
Message édité par exhortae le 30-01-2007 à 19:51:53
n°1508862
galaxed
Posté le 30-01-2007 à 22:17:27  profilanswer
 

Bah pour être exact on me dit dans le sujet :
 
"Conseil : N'utilisez pas la fonction atoi(), vous n'en avez pas besoin."
 
A partir de la je me dis qu'il doit y avoir un moyen d'éviter le atoi (ou autres du genre).  
Enfin bon, j'ai beau chercher je trouves pas donc je vais le faire avec atoi ce sera plus simple...  
 
Si quelqu'un trouve tout de même la solution, qu'il me fasse signe ^^.

mood
Publicité
Posté le 30-01-2007 à 22:17:27  profilanswer
 

n°1508868
Sve@r
Posté le 30-01-2007 à 22:37:56  profilanswer
 

exhortae a écrit :

mais je pense qu'il a le droit d'écrire lui même sa fonction atoi non??


Ben j'en sais trop rien... mais le moyen de faire autrement ???
 

exhortae a écrit :

genre on part d'un N = 0 qui est le résultat numérique final.
 
on fait une boucle avec comme condition tant que le tableau est plein et que le caractere lu est un chiffre compris entre 0 et 9.
 
et on utilise cette relation
 
N = N*10 + (CH[I]-'0');
 
il a le droit de faire ça à mon avis enfin comme tu le dis je vois pas comment le faire autrement


Voui, c'est aussi ce que j'ai écrit dans mon premier post....
 

galaxed a écrit :

Bah pour être exact on me dit dans le sujet :
 
"Conseil : N'utilisez pas la fonction atoi(), vous n'en avez pas besoin."
 
A partir de la je me dis qu'il doit y avoir un moyen d'éviter le atoi (ou autres du genre).  
Enfin bon, j'ai beau chercher je trouves pas donc je vais le faire avec atoi ce sera plus simple...  
 
Si quelqu'un trouve tout de même la solution, qu'il me fasse signe ^^.


 
sscanf(), strtoul()
Ce serait bien qu'on ait le sujet en entier pour se faire une idée...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1508872
galaxed
Posté le 30-01-2007 à 22:51:07  profilanswer
 

Mouais..., si on a pas besoin de atoi, on a pas besoin non plus de sscanf ou de strtoul.
 
Pour le sujet, je fais des screens et je le met (format pdf).
 
 
Edit : Voila pour le sujet : www.tpcu.net/pj.jpg


Message édité par galaxed le 30-01-2007 à 22:58:47
n°1508891
exhortae
Membre du Cartel des Médecins
Posté le 30-01-2007 à 23:53:36  profilanswer
 

Sve@r a écrit :


Voui, c'est aussi ce que j'ai écrit dans mon premier post....
 
 


 
yep, je suis passer à côté bizzarement  :jap:  

n°1508969
galaxed
Posté le 31-01-2007 à 10:28:25  profilanswer
 

Petit up [:ass_kicker57]

n°1508993
Taz
bisounours-codeur
Posté le 31-01-2007 à 11:07:58  profilanswer
 

on fait pas les TP :o

n°1509122
galaxed
Posté le 31-01-2007 à 14:13:29  profilanswer
 

Taz a écrit :

on fait pas les TP :o


D'un coté je veux pas un code, je cherche juste a savoir comment faire un dec->bin sans atoi()(Le reste j'ai trouvé), c'est à dire la méthode car j'ai beau cherché, je trouves pas le moyen. J'ai pas demandé qu'on me fasse le TP que je saches... Enfin bref merci de ta participation...

n°1509128
franceso
Posté le 31-01-2007 à 14:24:26  profilanswer
 

* pour éviter atoi(), utilise l'algo présenté par Sve@r dans son premier post. D'ailleurs, fais attention à la représentation hexa qui peut utiliser des chiffres supplémentaires (A-E). Si j'étais toi, je me ferais des petites fonctions de conversion caractère<->chiffre, permettant de passer de '3' à 3 ou de 'E' à 15 (et qui gueule si son entrée est un chiffre incorrect pour la base sélectionnée).
 
* pour la conversion elle-même, je vois pas où tu bloques. Si tu as su faire toutes les autres conversions, pourquoi dec->bin te pose un problème particulier ?


---------------
TriScale innov
n°1509238
Sve@r
Posté le 31-01-2007 à 17:09:53  profilanswer
 

galaxed a écrit :

D'un coté je veux pas un code, je cherche juste a savoir comment faire un dec->bin sans atoi()


Faut d'abord convertir ta chaîne "127" en  

  • nombre 127 si c'est la base 10
  • nombre 295 si c'est la base 16

Donc mon algo du premier post magnifiquement réexpliqué par exhortae est parfait pour ça.
 
Ensuite, une fois que t'as le nombre, avec simplement des divisions successives en gardant à chaque fois le reste, puis en réaffichant le reste dans l'ordre inverse tu obtiens le bon résultat à l'écran. Tu peux même te payer le luxe d'une fonction récursive pour ne pas t'embêter à stocker les restes successifs... style

FONCTION (nombre à convertir, base de conversion)
FAIRE
    si nombre == 0
          quitter fonction
    fin si
 
    FONCTION (nombre / base, base)
 
    AFFICHER(nombre % base)
FIN FAIRE


 
Etant donné que l'appel récursif se fait avant l'affichage, les affichages se feront dans l'ordre inverse des appels donc t'auras le dernier reste en premier
 
Le reste du tp: une petite gestion d'erreur lors de la conversion initiale du style "le chiffre est plus grand que la base" et basta...


Message édité par Sve@r le 31-01-2007 à 17:13:29

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1841317
Pokerfan
Posté le 21-01-2009 à 21:22:29  profilanswer
 

Check le code de cet outil javascript :
Convertisseur de bases

n°1841327
Taz
bisounours-codeur
Posté le 21-01-2009 à 21:38:05  profilanswer
 

Merci pour ce up pourri.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Conversion décimal/binaire/hexadécimal

 

Sujets relatifs
Conversion de int et float en string en CConversion XSD en DTD
C++ Conversion de string vers longwarning: [unchecked] unchecked conversion
Problème de conversion de temps en fonction de timezoneQuel rôle pour les log binaire ?
Conversion de String vers ByteConversion Flash EXE -> swf pour integration dans powerpoint
convertir du décimal en binaire 
Plus de sujets relatifs à : Conversion décimal/binaire/hexadécimal


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR