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 / Exemple :
#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.
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.