Conversion décimal/binaire/hexadécimal - C - Programmation
Marsh Posté le 30-01-2007 à 15:26:47
galaxed a écrit : Bonjour à tous, |
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":
traitement "2"
traitement "7"
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...
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
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...
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 .
Je vais tester comme ca et je reviens vous embeter si j'ai un probleme .
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...
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...
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.
Marsh Posté le 30-01-2007 à 19:37:04
exhortae a écrit : t'as pas fait d'informatique industrielle?? |
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é !!!)
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
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 ^^.
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. |
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 : |
sscanf(), strtoul()
Ce serait bien qu'on ait le sujet en entier pour se faire une idée...
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
Marsh Posté le 30-01-2007 à 23:53:36
Sve@r a écrit : |
yep, je suis passer à côté bizzarement
Marsh Posté le 31-01-2007 à 14:13:29
Taz a écrit : on fait pas les TP |
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...
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 ?
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
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) |
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...
Marsh Posté le 21-01-2009 à 21:22:29
Check le code de cet outil javascript :
Convertisseur de bases
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 ? . Je cherche depuis un moment déjà mais je trouves pas.
Merci d'avance,
Galaxed.
Message édité par galaxed le 30-01-2007 à 14:50:46