Conversion décimal/binaire/hexadécimal

Conversion décimal/binaire/hexadécimal - C - Programmation

Marsh Posté le 30-01-2007 à 14:38:58    

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
Reply

Marsh Posté le 30-01-2007 à 14:38:58   

Reply

Marsh Posté le 30-01-2007 à 15:26:47    

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.
Reply

Marsh Posté le 30-01-2007 à 15:27:53    

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

Reply

Marsh Posté le 30-01-2007 à 15:29:56    

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.
Reply

Marsh Posté le 30-01-2007 à 15:41:40    

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
Reply

Marsh Posté le 30-01-2007 à 16:31:19    

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...

Reply

Marsh Posté le 30-01-2007 à 18:45:37    

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
Reply

Marsh Posté le 30-01-2007 à 19:37:04    

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.
Reply

Marsh Posté le 30-01-2007 à 19:49:15    

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
Reply

Marsh Posté le 30-01-2007 à 22:17:27    

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 ^^.

Reply

Marsh Posté le 30-01-2007 à 22:17:27   

Reply

Marsh Posté le 30-01-2007 à 22:37:56    

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.
Reply

Marsh Posté le 30-01-2007 à 22:51:07    

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
Reply

Marsh Posté le 30-01-2007 à 23:53:36    

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:  

Reply

Marsh Posté le 31-01-2007 à 10:28:25    

Petit up [:ass_kicker57]

Reply

Marsh Posté le 31-01-2007 à 11:07:58    

on fait pas les TP :o

Reply

Marsh Posté le 31-01-2007 à 14:13:29    

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...

Reply

Marsh Posté le 31-01-2007 à 14:24:26    

* 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
Reply

Marsh Posté le 31-01-2007 à 17:09:53    

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.
Reply

Marsh Posté le 21-01-2009 à 21:22:29    

Check le code de cet outil javascript :
Convertisseur de bases

Reply

Marsh Posté le 21-01-2009 à 21:38:05    

Merci pour ce up pourri.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed