|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
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
Sources en rapport avec celle ci
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 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
Conversion hexadecimal -> decimal ( et contraire) en C [ par Arrakis ]
Bonjour,Je ne connais pas de fonction pour realiser cette conversion du decimal vers l'hexa, si vous avez une idéemerciArrakis
conversion binaire-décimal en C [ par Tooshort23 ]
Bonjour,je suis étudiant en IUT GEII.Savais vous convertir un nombre binaire (de taille: 32 bits) en décimal ?merci de me donner des conseils.Si possi
Conversion décimale => binaire [ par nicolas66 ]
Bonsoir tlm,j'ai un pb un une ptite fonction pas très compliquée à mon avis :char * itob( int n ){ char * chaine; int i = 0; while ( n > 0 ) { *(c
probleme de conversion binaire [ par montie_s ]
Je cree un programme capable de transformer les codes ascii de caracteres en leur equivalence en base 2, puis de reprendre ces nombre en binaire pour
CRC + affichage/conversion binaire [ par Ferrari01 ]
Bonjour...Est-ce que quelqu'un aurait un petit programme de CRC et/ou un petit programme qui permet d'afficher 4 caractères en binaire (ex.: abcd ->
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|