Vous êtes sur la page 1sur 19

#include <iostream>

#include <cmath>

using namespace std;

char InttoChar (int nbre)

char nbre1;

char tab[36]=
{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W',
'X','Y','Z'};

if
(nbre==0||nbre==1||nbre==2||nbre==3||nbre==4||nbre==5||nbre==6||nbre==7||nbre==8||nbre
==9||nbre==10||nbre==11||nbre==12||nbre==13||nbre==14||nbre==15||nbre==16||nbre==17||
nbre==18||nbre==19||nbre==20||nbre==21||nbre==22||nbre==23||nbre==24||nbre==25||nbre=
=26||nbre==27||nbre==28||nbre==29||nbre==30||nbre==31||nbre==32||nbre==33||nbre==34||
nbre==35);

for ( int i=0;i<=(nbre);i++)

nbre1=tab[i];

return nbre1;

/// TentoX void

void TentoX1(int nbre, int b, int bits){

int n=0, v(nbre),m, n1;

while (nbre!=0)

{
nbre/=b;

n++;

char a[bits]; /// on donne à a la taille n

nbre=v;

///Boucle de remplissage du tableau avec les restes

for (int i=0;i<bits;i++)

if(i<n){

m=nbre%b;

nbre/=b;

a[i]=InttoChar(m);

else a[i]='0';

n1=bits-1;

// Boucle d'affichage du tableau (le résultat)

for(int i=n1;i>=0;i--)

cout<<a[i];

///**************************************************************

///Fonction: créer un tableau


/// Valeur retour char car un string est un tableau de char

char creattab (int n)

char tab[n];

return tab[n];

// Fonction pour convertir chaque caractère de la chaine de caractère en entier

int CharToInt (char nbre)

int nbreI;

if (nbre=='1') nbreI=1;

else if (nbre=='2') nbreI=2;

else if (nbre=='3') nbreI=3;

else if (nbre=='4') nbreI=4;

else if (nbre=='5') nbreI=5;

else if (nbre=='6') nbreI=6;

else if (nbre=='7') nbreI=7;

else if (nbre=='8') nbreI=8;

else if (nbre=='9') nbreI=9;

else if (nbre=='A') nbreI=10;

else if (nbre=='B') nbreI=11;

else if (nbre=='C') nbreI=12;

else if (nbre=='D') nbreI=13;

else if (nbre=='E') nbreI=14;

else if (nbre=='F') nbreI=15;

else if (nbre=='0') nbreI=0;

else nbreI=16;

return nbreI;

}
///********************************************************************************
*************************

/// Fonction de passage de la base 2 à la base 10

int Xto10 (string nbre, int len, int b){

int s(0); // valeur en base 10

char tab[len];

int m(0);

for (int i=(len-1); i>=0;i--)

tab[m]=CharToInt(nbre[i]);

m++;

for(int i=0;i<len;i++)

s=s+tab[i]*pow(b,i);

return s;

///********************************************************************************
********************************

/// Fonction de passage de 10 à X

string TentoX(int nbre, int b, int bits)

int n=0, v(nbre),m;

string a,c;

while (nbre!=0)

{
nbre/=b;

n++;

a=creattab(bits); /// on donne à a la taille n

nbre=v;

///Boucle de remplissage du tableau avec les restes

for (int i=0;i<bits;i++)

if (i<n){

m=nbre%b;

nbre/=b;

a[i]=InttoChar(m);}

else a[i]='0';

return a;

/// Fonction de passage de la base 2 à la base 10

int Twoto101 (string nbre, int len){

int s(0); // valeur en base 10

int m(0);

for (int i(0); i<=(len-1); i++)

if (nbre[i]=='0') s= s+0*pow(2,m);
else s= s+1*pow(2,m);

m++;

return s;

// Fonction de passage de la base 2 à la base 10

int Twoto10 (int tab[], int len){

int s(0); // valeur en base 10

int m(0);

for (int i(0); i<=(len-1); i++)

if (tab[i]==0) s= s+0*pow(2,m);

else s= s+1*pow(2,m);

m++;

return s;

///********************************************************************************
********************

///********************************************************************************
********************

int main()

int b,bits, nbre10,s, len,ch,bd,dep,rep;

do {
cout << "Entrer la base de depart ";

cin>> b;

cout <<"Entrer la base de destination ";

cin>>bd;

cout<< "Enter le nombre de bits ";

cin>>bits;

while(bits!=8 && bits!=16 && bits!=32 && bits!=64){

cout<<"Veuillez entrer un nombre de bits entre 8,16,32 et 64: ";

cin>>bits;

if (b==10) dep=2;

else dep=1;

cout <<"Entrer le nombre a convertir ";

switch(dep)

case 1:

string nbre;

cin>> nbre;

len = nbre.size();

for(int i=0;i<len;i++)

int n;

n=CharToInt(nbre[i]);

while(n>=b)

cout<<"Votre nombre est faux. Ressayer:"<<endl;

cin>> nbre;
len = nbre.size();

n=CharToInt(nbre[i]);

s=Xto10(nbre,len,b);

string nbre2= TentoX(s,2,bits);

int tab[bits];

for(int i=(bits-1);i>=0;i--)

tab[i]=CharToInt(nbre2[i]);

/// Conversion vers 10 en tenant compte du signe

if(nbre2[bits-1]=='0') ch=1;

else ch=2;

switch (ch) {

case 1:

nbre10=Twoto10(tab,bits);

break;

case 2:

/// Boucle de création du complément à 1


for(int i=0; i<=(bits-1);i++)

if (tab[i]==0) tab[i]=1;

else tab[i]=0;

/// Calcul du complément à 2

if (tab[0]==0) tab[0]=1;

else{

tab[0]=0;

int i=1;

while(tab[i]==1){

tab[i]=0;

i++;

tab[i]=1;

cout<<""<<endl;

nbre10=-(Twoto10(tab,bits));

if (bd==10){

cout <<"Le nombre en base 10 est: "<<nbre10<<endl;

goto END;

break;

}
///************************************************************************

/// Convertion de nbre10 en bd

int nbrec,m,n1,nbre101;

string a;

nbrec=nbre10;

int v=nbrec;

while(((-pow(2,(bits-1)))>= nbrec || nbrec>=pow(2,(bits-1))))

cout<<"Votre nombre ne peut pas etre code sur ce nombre de bits. Entrer un autre nombre de
bits: ";

cin>>bits;

if (nbrec>0){

int n=0;

/// Boucle de determination de la taille du tableau

while (nbrec!=0)

nbrec/=2;

n++;

a= creattab(bits); /// on donne à a la taille n


nbrec=v;

///Boucle de remplissage du tableau avec les restes

int m;

for (int i=0;i<bits;i++)

if (i<n){

m=nbrec%2;

nbrec/=2;

a[i]=InttoChar(m);

else a[i]='0';

int n1=bits-1;

cout<<" "<<endl;

cout<<"Le nombre dans la base "<<bd<<" est: ";

TentoX1(v,bd,bits);

else {

int n=0;

nbrec=abs(nbrec);

v=nbrec;

// Boucle de determination de la taille du tableau

while (nbrec!=0)
{

nbrec/=2;

n++;

a= creattab(bits); // on donne à a la taille n

nbrec=v;

///Boucle de remplissage du tableau avec les restes

for (int i=0;i<bits;i++)

if (i<n){

m=nbrec%2;

nbrec/=2;

a[i]=InttoChar(m);

else a[i]='0';

n1=bits-1;

/// Boucle de création du complément à 1

for(int i=n1;i>=0;i--)

if (a[i]=='0') a[i]='1';

else a[i]='0';

// Calcul du complément à 2
if (a[0]=='0') a[0]='1';

else{

a[0]='0';

int i=1;

while(a[i]=='1'){

a[i]='0';

i++;

a[i]='1';

int ur[bits];

for(int i=n1;i>=0;i--) {

ur[i]=CharToInt(a[i]);

nbre101=Twoto10(ur,bits);

cout<<"Le nombre dans la base "<<bd<<" est: ";

TentoX1(nbre101,bd, bits);

break;

///********************************************************************************
************************************
///
**********************************************************************************
*********************************

/// 10toX

case 2:

int nbre,m, n1,nbre10;

string a;

cout << "Entrer le nombre a convertir en base 10: ";

cin>>nbre;

//Boucle pour quitter le programme en cas de nombre et retourner 0 pour nbre=0 (pour nbre=0 la
boucle n'est pas lancée.

while(nbre==false)

if (nbre==0)

cout<<"Votre nombre dans la base est egal a 0"<<endl;

return 0;

else

cout<<"Saisie invalide"<<endl;

return 0;

int v=nbre;

while(bits!=8 && bits!=16 && bits!=32 && bits!=64){

cout<<"Veuillez entrer un nombre de bits entre 8,16,32 et 64: ";


cin>>bits;

while(((-pow(2,(bits-1)))>= nbre || nbre>=pow(2,(bits-1))))

cout<<"Votre nombre ne peut pas etre code sur ce nombre de bits. Entrer un autre nombre de
bits: ";

cin>>bits;

if (nbre>0){

int n=0;

/// Boucle de determination de la taille du tableau

while (nbre!=0)

nbre/=2;

n++;

a= creattab(bits); /// on donne à a la taille n

nbre=v;

///Boucle de remplissage du tableau avec les restes

int m;

for (int i=0;i<bits;i++)

{
if (i<n){

m=nbre%2;

nbre/=2;

a[i]=InttoChar(m);

else a[i]='0';

int n1=bits-1;

cout<<"Le nombre dans la base "<<bd<<" est: ";

TentoX1(v,bd,bits);

else {

int n=0;

nbre=abs(nbre);

v=nbre;

/// Boucle de determination de la taille du tableau

while (nbre!=0)

nbre/=2;

n++;

a= creattab(bits); /// on donne à a la taille bits

nbre=v;
///Boucle de remplissage du tableau avec les restes

for (int i=0;i<bits;i++)

if (i<n){

m=nbre%2;

nbre/=2;

a[i]=InttoChar(m);

else a[i]='0';

n1=bits-1;

/// Boucle de création du complément à 1

for(int i=n1;i>=0;i--)

if (a[i]=='0') a[i]='1';

else a[i]='0';

// Calcul du complément à 2

if (a[0]=='0') a[0]='1';

else{

a[0]='0';

int i=1;

while(a[i]=='1'){

a[i]='0';

i++;

a[i]='1';
}

cout<<""<<endl;

int ur[bits];

for(int i=n1;i>=0;i--) {

ur[i]=CharToInt(a[i]);

nbre10=Twoto10(ur,bits);

cout<<nbre10<<endl;

cout<<"Le nombre dans la base "<<bd<<" est: ";

TentoX1(nbre10,bd,bits);

break;

cout<<" "<<endl;

END: cout<<"Voulez vous recommencer? 0 pour OUI, n'importe quel autre chiffre pour
NON."<<endl;

cin>>rep;

//Boucle pour quitter le programme en cas de nombre invalid

while(rep==false && rep!=0)

cout<<"Saisie invalide"<<endl;
return 0;

} while (rep==0);

///********************************************************************************
************************************

return 0;