Programme de Conversion base 10 vers 16 et inversement.

Programme de Conversion base 10 vers 16 et inversement. - Algo - Programmation

Marsh Posté le 11-04-2015 à 16:29:52    

Bonjour à tous.
Je dois réaliser un programme en C++ permettant de faire une conversion de base 10 vers 16, et inversement, à travers un petit menu simple.
Le problème est que je n'arrive pas à convertir parfaitement de décimal à hexadécimal.
 
Voici ce que je fais : Je déclare un tableau de caractère de 16 cases. (0-15), contenant les digits de la base hexa (0 1 2 3 4 5 6 7 8 9 A B C D E F).
Je déclare un int unEntier, une string unHex, et mon tabHex[16].
 
Tant que unEntier > 0
       unHex =unHex + tabHex[unEntier / 16] // On concatène les chaines.
       unEntier = unEntier / 16
fintantque
On affiche le résultat.
 
Le problème est que pour la dernière partie de la conversion, ca ne fonctionne pas , par exemple je veux convertir 85 (54 en hexa).
85 / 16 = 5.3 (5 puisque entier).
tabHex[5] = 5, on aura donc unHex = "5".
On continue : 5/16 = 0, quelquechose. (0 puisque entier). On obtient donc unHex="50".  
Comment faire pour traiter cette dernière partie? Je dis que si unEntier <16 , alors je dois faire unHex=unHex+tabHex[unEntier-1] ?   Ca fonctionne pour ce cas mais pas pour les autres ^^
Merci d'avance !


Message édité par SmXme le 11-04-2015 à 16:37:15

---------------
|i9 13900K | MSI Z690 Tomahawk WIFI DDR4 | 4*16Go G.SKILL Trident Z Neo 3600Mhz C16 | EVGA 3090Ti FTW3 Ultra | DeepCool LT720 | NZXT H7 FLOW|
Reply

Marsh Posté le 11-04-2015 à 16:29:52   

Reply

Marsh Posté le 11-04-2015 à 16:42:46    

printf("%x",unEntier) et zou :o

Reply

Marsh Posté le 11-04-2015 à 16:58:49    

Oui je sais bien, mais j'dois absolument le faire sans passer par une fonction déjà accessible.
J'dois le faire "manuellement".
Merci de ta réponse !


---------------
|i9 13900K | MSI Z690 Tomahawk WIFI DDR4 | 4*16Go G.SKILL Trident Z Neo 3600Mhz C16 | EVGA 3090Ti FTW3 Ultra | DeepCool LT720 | NZXT H7 FLOW|
Reply

Marsh Posté le 11-04-2015 à 17:46:32    

http://stackoverflow.com/questions [...] onversions
 
Voila, si tu veux le nombre final (485) et non pas juste chaque nombre un par un, garde un compteur du nombre de fois ou tu as divisé.
 
Et fait 4 * 10 ^ 2 + 8 * 10 ^ 1 + 5 * 10 ^ 0 et t'auras un integer avec 485 dedans comme il faut, correspondant au 1025 de la base 15.

Reply

Marsh Posté le 11-04-2015 à 18:06:50    

Base 15 ?
Pourquoi base 15?
C'est de l'héxadécimal que je cherche à avoir.
(Désolé, j'suis "novice" en algo).


---------------
|i9 13900K | MSI Z690 Tomahawk WIFI DDR4 | 4*16Go G.SKILL Trident Z Neo 3600Mhz C16 | EVGA 3090Ti FTW3 Ultra | DeepCool LT720 | NZXT H7 FLOW|
Reply

Marsh Posté le 11-04-2015 à 19:15:33    

remplace 15 par 16 alors

Reply

Marsh Posté le 11-04-2015 à 20:52:44    

Ouaip, j'vais continuer de réfléchir un peu.  
Merci beaucoup


---------------
|i9 13900K | MSI Z690 Tomahawk WIFI DDR4 | 4*16Go G.SKILL Trident Z Neo 3600Mhz C16 | EVGA 3090Ti FTW3 Ultra | DeepCool LT720 | NZXT H7 FLOW|
Reply

Marsh Posté le 12-04-2015 à 06:42:55    

SmXme a écrit :

Base 15 ?
Pourquoi base 15?
C'est de l'héxadécimal que je cherche à avoir.
(Désolé, j'suis "novice" en algo).


J'ai une très grosse flemme, mais bon je suis de bonne humeur aujourd'hui :o:
 

Code :
  1. #include <vector>
  2. int printBase10(std::vector<int> *parts, int iter) {
  3.   int number = 0;
  4.   for (std::vector<int>::reverse_iterator it = parts->rbegin(); it != parts->rend(); ++it) {
  5.     number += *it * pow(10.0, iter);
  6.     iter--;
  7.   }
  8.   return number;
  9. };
  10. int convertNumberToBase(int number, int base) {
  11.   // Store modulo results
  12.   std::vector<int> parts;
  13.   // Store number of iterations
  14.   int iter = 0;
  15.   while(1) {
  16.     int mod = number % base;
  17.     int div = number / base;
  18.     parts.push_back(mod);
  19.     if(div <= 0) {
  20.       return printBase10(&parts, iter);
  21.     } else {
  22.       iter++;
  23.     }
  24.   }
  25. };


 
PS: je sais pas si vector est de ton niveau, si besoin tente de remplacer ca par -par exemple- un tableau de mille cases ou une merde du genre.
PS2: oué j'ai la flemme :o
PS3: techniquement iter sert a rien, puisque tu pourrais utiliser vector.size() qui te donnerai le nombre de cases utilisés, ce qui reviendrait au même que iter.
PS4: code pas testé, mais l'idée est là.
PS5: printBase10 sert a prendre les résultats, et à faire un nombre présentable en base 10, ce qui te permet d'afficher le nombre "base 16" sans te soucier de l'affichage (qui lui sera en base 10)
PS6: désolé :o j'avais pas vu que c'était pas du code mais de l'algo, bon ben prend l'idée et transforme ca en algorithmique ;)


Message édité par Devil'sTiger le 12-04-2015 à 06:45:25
Reply

Marsh Posté le 12-04-2015 à 20:05:06    

Salut tout l'monde, j'vous fait un retour. J'me suis poser au calme avec une feuille, et voilà ce que j'ai (ca fonctionne) :  
 
string unHex;
char tabHex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}
int unEntier;
int reste;
 
      while (unEntier >16){
             
            reste = unEntier % 16;
            unEntier = unEntier / 16;
            unHex = tabHex[reste] + unHex;
      }
      unHex = tabHex[unEntier] + unHex;
      unEntier = unEntier/16;
cout << unHex << endl;
 
Voila, maintenant j'dois faire dans le sens inverse, et la j'galère a mort !
       
       
 


---------------
|i9 13900K | MSI Z690 Tomahawk WIFI DDR4 | 4*16Go G.SKILL Trident Z Neo 3600Mhz C16 | EVGA 3090Ti FTW3 Ultra | DeepCool LT720 | NZXT H7 FLOW|
Reply

Sujets relatifs:

Leave a Replay

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