voici un code en C++ qui permet de convertir un long int en une autre base (de 2 à 16)... l'entrée des nombres se fait dans un chaine de caractère afin de tester la validité des données introduite.
Source / Exemple :
/* convertisseur de base (de la base 2 à la base 16) by Morre Thierry alias ||MaC|| Ferson */
#include <iostream>
#include <stdlib.h>
using namespace std;
const MAX=100; // taille du vecteur pour la réponse
void input (char *, char *, int &); // encodage des valeurs
void init (int *, int); // initialisationb du tableau
bool isnum (char *); // permet de vérifié si la chaine est bien un nombre
void convert (int *, long int, int); // comvertion en fonction de la base
void print (int *, int, int); // affichage du résultat
void choix (char &); // choix de l'utilisateur
void main (void)
{
// déclaration de mes variables
bool err;
int res[MAX], base;
long int nombre;
char nbre[50], base_char[7], choix_ut='o';
do
{
init (res, MAX);
input (nbre, base_char, base);
err = isnum (nbre);
if (!err)
{
nombre = atol(nbre); // atol permet de transformer un chaine de caractère en long int (si tout les lettres sont des chiffres)
convert (res, nombre, base);
print(res,MAX,base);
}
else
cout << nbre << " n'est pas un nombre" << endl;
choix (choix_ut);
}while (choix_ut != 'n');
}
void input (char *nbre, char *base_char, int &base)
{
bool err;
do
{
cout << "En quel base souhaitez-vous le convertir (entre 2 et 16) : ";
cin >> base_char;
err=isnum(base_char);
if (err)
{
cout << "Ce n'est pas un nombre" << endl;
base = 0;
}
else
base = atoi(base_char); // idem que atol mais donne un int au lieu d'un long int
}while (!(base > 1 && base < 17));
cout << "Entrez le nombre : ";
cin >> nbre;
}
void init (int *ptr, int taille)
{
for (int i=0; i<taille; i++)
}
bool isnum (char *a)
{
bool err=0;
int i=0;
while (*(a+i) != '\0')
{
if (!(*(a+i) > ('0'-1) && *(a+i) < ('9'+1))) // test chaque caractere afin de déterminer si l'utilisateur à bien rentré un nombre et pas un lettre
err =1;
i++;
}
return err;
}
void convert (int *ptr, long int nombre, int base)
{
int i=0;
while (nombre > (base - 1))
{
nombre = nombre/base;
i++;
}
}
void print (int *ptr, int taille, int base)
{
bool flag=1; // permet de supprimé les zéro non significatif
for (int i=MAX-1; i > -1; i--) // la lecture du résultat se fait a l'envers
{
if (*(ptr+i) != 0 || !(flag)) // test si la valeur est un zéro non significatif
{
if (*(ptr+i) > 9) // si la valeur est supérieur a 10 alors il faut afficher une lettre
{
switch (*(ptr+i))
{
case 10 :
cout << 'A';
break;
case 11 :
cout << 'B';
break;
case 12 :
cout << 'C';
break;
case 13 :
cout << 'D';
break;
case 14 :
cout << 'E';
break;
case 15 :
cout << 'F';
break;
default :
cout << "erreur";
}
}
else // sinon on affiche la valeur
cout << *(ptr + i);
flag=0;
}
}
cout << endl;
}
void choix (char &choix_ut)
{
do
{
cout << "Voulez-vous en faire un autre (o/n)? : ";
cin >> choix_ut;
}while (choix_ut != 'n' && choix_ut != 'o');
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.