Accueil > > > CONVERSION D'ENTIERS DANS LES BASES BINAIRE, HEXADECIMALE, OCTALE, TEST DE NOMBRE PREMIER TRADUCTION LITTERALE
CONVERSION D'ENTIERS DANS LES BASES BINAIRE, HEXADECIMALE, OCTALE, TEST DE NOMBRE PREMIER TRADUCTION LITTERALE
Information sur la source
Description
Ce code permet de convertir un entier en binaire, octal ou hexadecimal, de meme il permet de voir si le nombre est premier ou pas, ou encore de l'ecrire en chaine litteral. Je l'ai fait juste dans le cadre de l'apprentissage du langage C.
Source
-
- #include<stdio.h>
- #include<conio.h>
- #include<string.h>
- #include<stdlib.h>
-
-
- /****************************************************************************
- Nous allons travailler avec le type long pour pouvoir traiter des valeurs
- de l'ordre des millions
- *****************************************************************************/
-
-
- unsigned long a,c,d=2,e; /* a est l'entier à traiter,c est utilisé comme
- quotient de la division dans la fonction "bin",
- d est le diviseur de la fonction "prime" et e
- est une variable tampon dans "bin"*/
-
- int cpt,b,i; /* cpt un compteur(dans "bin"),b sert à valider
- un choix dans "choix" et i est l'indice du
- tableau utilisé dans "bin" */
-
-
- int*t; // pointeur utilisé dans "bin"
-
-
- /******La fonction suivante permet la conversion en binaire de l'entier******/
-
- void bin() {
- c=0;i=0;cpt=0;
- e=a;
- t=(int*)malloc(32); //On prevoit 32 cases
- c=e/2;
- while(c!=0) {t[i]=e%2; //On utilise la methode des divisions successives
- i++;
- cpt++;
- e=c;
- c=e/2;
- }
- t[i]=e;
- printf("\nLa valeur binaire de %lu est:",a);
- for(i=cpt;i>=0;i--) //pour afficher les restes à partir de la dernière valeur du tableau
- printf("%d",t[i]);
- printf("\n");
- free(t);
- }
-
-
-
- /*****************************************************************************
- Les 2 fonctions qui suivent permettent de convertir respectivement en octal
- et en hexadecimal en utilisant directement les formats de conversion ASCII
- ******************************************************************************/
-
-
- void oct() //fonction de calcul de la valeur octale du nombre
- {
- printf("\nLa valeur octale de %lu est:%lo\n",a,a);
- }
-
- void hexa() //fonction de calcul de la valeur hexadecimale
- {
- printf("\nLa valeur hexadecimale de %lu est:%lX\n",a,a);
- }
-
-
-
- /****************** La fonction qui suit nous permet de tester si l'entier
- est premier ou pas **************************/
-
- void prime()
- { if (d*d>a) printf("\n%lu est premier\n",a);
- else{
- if (a%d==0) printf("\n%lu n'est pas premier\n",a);
- else {d++;
- prime();
- }
-
- }
-
- }
-
- /**************************************************************************
- La fonction "chaine" nous permettra d'ecrire litteralement l'entier saisie
- La fonction "val" sera appel‚e dans "chaine" pour des besoins de calcul
- de la longueur de l'entier (le nombre de chiffres)
- ***************************************************************************/
-
- int val(int len){ //retourner une valeur à "chaine" selon la longueur de la chaine
- if (len>9)
- return 4 ;
- if (len<=9 && len>6)
- return 3 ;
- if (len<=6 && len>3)
- return 2 ;
- if (len==3)
- return 1;
- return 0;
- }
-
- void chaine (){
- char nb[15]; /*l'entier sera mis dans ce tableau après conversion en chaine de caractère*/
- char nbstr[256] = ""; // recevra l'ecriture literale de l'entier
- int len, tmplen; // longueur de la chaine
- char unites [][10] ={"", "cent ", "mille ", "million ", "milliard "};
- char dizaines [][14] = {"", "dix ", "vingt ", "trente ", "quarante ", "cinquante ", "soixante ", "soixante", "quatre-vingt ", "quatre-vingt"} ;
- char nombres [][11] = {"", "et un ", "deux ", "trois ", "quatre ", "cinq ", "six ", "sept ", "huit ", "neuf ", "dix ", "onze ", "douze ", "treize ", "quatorze ", "quinze ", "seize ", "dix-sept ", "dix-huit ", "dix-neuf "};
- ltoa(a,nb,10); // conversion de l'entier en chaine de caractŠres
- tmplen = len = strlen(nb) ;
- if (len==1 && nb[0]==48)
- strcat(nbstr, "z\x82ro") ;
- else{
- while (tmplen>0)
- {switch (tmplen % 3)
- {case 0 : if ((nb[len-tmplen]-48) != 1)
- strcat(nbstr, nombres[nb[len-tmplen]-48]);
- if (!(nb[len-tmplen]-48))
- break;
- strcat(nbstr, "cent ") ;
- break;
- case 2 : if (!(nb[len-tmplen]-48))
- break;
- if ((nb[len-tmplen]-48) == 1)
- {strcat(nbstr, nombres[10+(nb[len-(--tmplen)]-48)]) ;
- strcat(nbstr, unites[val(tmplen)]) ;
- break ;
- }
- strcat(nbstr, dizaines[nb[len-tmplen]-48]);
- if ((nb[len-tmplen]-48) == 7 || (nb[len-tmplen]-48) == 9)
- {if (!(nb[len-(tmplen-1)]-48))
- strcat(nbstr, "-dix "); //pour mettre soixante-dix ou quatre vingt-dix
- else
- {if (nb[len-(tmplen-1)]-48 == 1)
- strcat(nbstr, " et ");
- else
- strcat(nbstr, "-");
- strcat(nbstr, nombres[10+(nb[len-(--tmplen)]-48)]) ;
- strcat(nbstr, unites[val(tmplen)]) ;
- }
- }
- break;
- case 1 : if ((nb[len-tmplen]-48)==1)
- {if (len==tmplen || !(nb[len-tmplen-1]-48))
- strcat(nbstr, "un ");
- else
- strcat(nbstr, nombres[1]);
- }
- else
- strcat(nbstr, nombres[nb[len-tmplen]-48]);
- strcat(nbstr, unites[val(tmplen)]) ;
- break ;
- }
- tmplen-- ;
- }
- }
- printf("\n%s s'ecrit litteralement %s\n", nb, nbstr);
- }
-
- /*************************************************************/
-
-
- void choix() //fontion de choix du type d'operation à effectuer
- {printf("\n1->Convertir en binaire\n2->Convertir en octal\n3->Convertir en hexadecimal\n4->Convertir en chaine litterale\n5->Voir si le nombre est premier\n6->Quitter MANIP-ENTIERS\n\n"
- );
- scanf("%d",&b); //Saisie du numero du choix
- if(b==1) bin();
- else{ if(b==2) oct();
- else{ if(b==3) hexa();
- else{ if(b==4) chaine();
- else{ if(b==5) prime();
- else{ if(b==6) printf("\n\nAU REVOIR\n"); //on quitte "manip-entier"
- else{ printf("\n\n\aCHOIX ERRONE.\nEntrez un choix correct\n");
- }
- }
- }
- }
- }
- }
- }
-
-
- /****************************************************************/
- /****************************************************************/
- /****************************************************************/
-
- int main(){ //clrscr();
- printf("Bienvenue sur MANIP-ENTIERS.\n\nEntrez un nombre s'il vous plait.\n\n");
- scanf("%lu",&a); //Saisie de l'entier à manipuler
- printf("\n\nQue voulez-vous faire de ce nombre?\nEntrez un choix s'il vous plait.\n\n");
- choix();
- while(b!=6) choix(); //pour ramener le menu de choix du type d'operation tant qu'on ne choisit pas de quitter
- getch();
- return 0;
- }
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
/****************************************************************************
Nous allons travailler avec le type long pour pouvoir traiter des valeurs
de l'ordre des millions
*****************************************************************************/
unsigned long a,c,d=2,e; /* a est l'entier à traiter,c est utilisé comme
quotient de la division dans la fonction "bin",
d est le diviseur de la fonction "prime" et e
est une variable tampon dans "bin"*/
int cpt,b,i; /* cpt un compteur(dans "bin"),b sert à valider
un choix dans "choix" et i est l'indice du
tableau utilisé dans "bin" */
int*t; // pointeur utilisé dans "bin"
/******La fonction suivante permet la conversion en binaire de l'entier******/
void bin() {
c=0;i=0;cpt=0;
e=a;
t=(int*)malloc(32); //On prevoit 32 cases
c=e/2;
while(c!=0) {t[i]=e%2; //On utilise la methode des divisions successives
i++;
cpt++;
e=c;
c=e/2;
}
t[i]=e;
printf("\nLa valeur binaire de %lu est:",a);
for(i=cpt;i>=0;i--) //pour afficher les restes à partir de la dernière valeur du tableau
printf("%d",t[i]);
printf("\n");
free(t);
}
/*****************************************************************************
Les 2 fonctions qui suivent permettent de convertir respectivement en octal
et en hexadecimal en utilisant directement les formats de conversion ASCII
******************************************************************************/
void oct() //fonction de calcul de la valeur octale du nombre
{
printf("\nLa valeur octale de %lu est:%lo\n",a,a);
}
void hexa() //fonction de calcul de la valeur hexadecimale
{
printf("\nLa valeur hexadecimale de %lu est:%lX\n",a,a);
}
/****************** La fonction qui suit nous permet de tester si l'entier
est premier ou pas **************************/
void prime()
{ if (d*d>a) printf("\n%lu est premier\n",a);
else{
if (a%d==0) printf("\n%lu n'est pas premier\n",a);
else {d++;
prime();
}
}
}
/**************************************************************************
La fonction "chaine" nous permettra d'ecrire litteralement l'entier saisie
La fonction "val" sera appel‚e dans "chaine" pour des besoins de calcul
de la longueur de l'entier (le nombre de chiffres)
***************************************************************************/
int val(int len){ //retourner une valeur à "chaine" selon la longueur de la chaine
if (len>9)
return 4 ;
if (len<=9 && len>6)
return 3 ;
if (len<=6 && len>3)
return 2 ;
if (len==3)
return 1;
return 0;
}
void chaine (){
char nb[15]; /*l'entier sera mis dans ce tableau après conversion en chaine de caractère*/
char nbstr[256] = ""; // recevra l'ecriture literale de l'entier
int len, tmplen; // longueur de la chaine
char unites [][10] ={"", "cent ", "mille ", "million ", "milliard "};
char dizaines [][14] = {"", "dix ", "vingt ", "trente ", "quarante ", "cinquante ", "soixante ", "soixante", "quatre-vingt ", "quatre-vingt"} ;
char nombres [][11] = {"", "et un ", "deux ", "trois ", "quatre ", "cinq ", "six ", "sept ", "huit ", "neuf ", "dix ", "onze ", "douze ", "treize ", "quatorze ", "quinze ", "seize ", "dix-sept ", "dix-huit ", "dix-neuf "};
ltoa(a,nb,10); // conversion de l'entier en chaine de caractŠres
tmplen = len = strlen(nb) ;
if (len==1 && nb[0]==48)
strcat(nbstr, "z\x82ro") ;
else{
while (tmplen>0)
{switch (tmplen % 3)
{case 0 : if ((nb[len-tmplen]-48) != 1)
strcat(nbstr, nombres[nb[len-tmplen]-48]);
if (!(nb[len-tmplen]-48))
break;
strcat(nbstr, "cent ") ;
break;
case 2 : if (!(nb[len-tmplen]-48))
break;
if ((nb[len-tmplen]-48) == 1)
{strcat(nbstr, nombres[10+(nb[len-(--tmplen)]-48)]) ;
strcat(nbstr, unites[val(tmplen)]) ;
break ;
}
strcat(nbstr, dizaines[nb[len-tmplen]-48]);
if ((nb[len-tmplen]-48) == 7 || (nb[len-tmplen]-48) == 9)
{if (!(nb[len-(tmplen-1)]-48))
strcat(nbstr, "-dix "); //pour mettre soixante-dix ou quatre vingt-dix
else
{if (nb[len-(tmplen-1)]-48 == 1)
strcat(nbstr, " et ");
else
strcat(nbstr, "-");
strcat(nbstr, nombres[10+(nb[len-(--tmplen)]-48)]) ;
strcat(nbstr, unites[val(tmplen)]) ;
}
}
break;
case 1 : if ((nb[len-tmplen]-48)==1)
{if (len==tmplen || !(nb[len-tmplen-1]-48))
strcat(nbstr, "un ");
else
strcat(nbstr, nombres[1]);
}
else
strcat(nbstr, nombres[nb[len-tmplen]-48]);
strcat(nbstr, unites[val(tmplen)]) ;
break ;
}
tmplen-- ;
}
}
printf("\n%s s'ecrit litteralement %s\n", nb, nbstr);
}
/*************************************************************/
void choix() //fontion de choix du type d'operation à effectuer
{printf("\n1->Convertir en binaire\n2->Convertir en octal\n3->Convertir en hexadecimal\n4->Convertir en chaine litterale\n5->Voir si le nombre est premier\n6->Quitter MANIP-ENTIERS\n\n"
);
scanf("%d",&b); //Saisie du numero du choix
if(b==1) bin();
else{ if(b==2) oct();
else{ if(b==3) hexa();
else{ if(b==4) chaine();
else{ if(b==5) prime();
else{ if(b==6) printf("\n\nAU REVOIR\n"); //on quitte "manip-entier"
else{ printf("\n\n\aCHOIX ERRONE.\nEntrez un choix correct\n");
}
}
}
}
}
}
}
/****************************************************************/
/****************************************************************/
/****************************************************************/
int main(){ //clrscr();
printf("Bienvenue sur MANIP-ENTIERS.\n\nEntrez un nombre s'il vous plait.\n\n");
scanf("%lu",&a); //Saisie de l'entier à manipuler
printf("\n\nQue voulez-vous faire de ce nombre?\nEntrez un choix s'il vous plait.\n\n");
choix();
while(b!=6) choix(); //pour ramener le menu de choix du type d'operation tant qu'on ne choisit pas de quitter
getch();
return 0;
}
Conclusion
Merci de me signaler si je peux optimiser tel ou tel partie. Encore une fois, c'est dans le cadre de l'apprentissage du langage.
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
conversion hexadecimal-binaire [ par naddoush ]
salut tout le monde, je voudrais bien faire une conversion de l'hexadecimal en binaire, y a-t-il une fonctio que me permet de faire ça? je travaille
Conversion chaine binaire en float, double... [ par renyone ]
Bonjour, j'ai une chaine binaire (de 32 bits par exemple) et j'aimerais obtenir le float (ou double...) qu 'elle représente; Y a-t-il des fonctions dé
Recuperer les 4 octets d un float en hexadecimal ou en binaire [ par salsou34 ]
Bonjour,Afin de faire un crc32 j'aurai besoin de recuperer les octets de 6 floattants, je n'ai trouvé des solutions de crc que sur des int, et je ne p
conversion decimal - binaire [ par diabablo ]
slt les amisj'aime la programmation mais pour debuter j'ai un peu de soucis tel que la conversion d'un nombre decimal en binaire. en faite ce n'est pa
conversion binaire vers float rs-232 [ par zilot2 ]
bonjours et pardonnez mon français: j'ai un projet pic16f qui consiste a envoyer un nombre float au port rs-232 puis je l'affiche sur pc.mon probleme
Conversion binaire -> Texte [ par milanoran ]
Bonjour j'ai un petit problème avec une application sous visulen c++ 6.0 qui nécessite une conversion binaire -> caractère . pour être plus précis j
Conversion binaire d'un nombre saisi au clavier [ par Debord10 ]
Bjr! J'ai un petit souci,je voudrai convertir un nombre en binaire,mais ça marche pas;je sais quoi faire! Voilà ce que j'aifais : #include #include us
Conversion décimale binaire [ par Coincoinisback ]
Bonjour, je dois écrire un programme qui affiche la conversion binaire d'un nombre entier (compris entre 0 et 4 294 067 295, codé sur 32 bits) mais l'
conversion d'une chaine type "01001000" en binaire [ par brennyboy ]
Bonjour à tous !J'aimerais savoir comment passer d'une chaine de 8 caracteres contenant seulement de 0 et des 1, au chiffre décimal correspo
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|