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

Catégorie :Maths & Algorithmes Classé sous : conversion, binaire, hexadecimal, octal Niveau : Débutant Date de création : 17/05/2007 Vu : 9 432

Note :
5 / 10 - par 1 personne
5,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note


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.
 

Commentaires et avis

signaler à un administrateur
Commentaire de layebado le 18/05/2007 23:56:36

pas mal

signaler à un administrateur
Commentaire de Cyr62110 le 19/05/2007 13:52:10

Un peu trop de source identique sur Cppfrance, normal tout le monde passe par un convertisseur.
Sinon bonne continuation.
Bye

signaler à un administrateur
Commentaire de alyggattor le 20/05/2007 00:10:10

Merçi pour votre encouragement Cyr62110. J'aimerai bien passer à un niveau sup.
C'est vrai j'en ai vu d'autres sur le site. Mais celle ci m'a permis d'avoir une meilleure familliarité avec les pointeurs.
Bye

signaler à un administrateur
Commentaire de nightlord666 le 23/05/2007 22:11:11

Je ne connaissait pas ce style d'indentation... Il y a une logique dedans ? Moi je ne l'ai pas trouvée :)

Sinon, else{ if peut s'écrire else if tout simplement, ça évite de créer plein de blocs et d'indenter n'importe comment. et une succession de else if = un switch, plus élégant et plus lisible.

signaler à un administrateur
Commentaire de alyggattor le 24/05/2007 00:32:24

Effectivement, la succession de else if donne un switch: c'est ce que j'ai ressorti dans la fonction "chaine". Je voulais juste faire sortir les differentes possibilités, encore que je ne suis pas carrement rodé pour la programmation.
Merçi pour l'autre notation de else if. C'est vrai que ça evite les erreurs.

Ajouter un commentaire

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 &#224; tous !J'aimerais savoir comment passer d'une chaine de 8 caracteres contenant seulement de 0 et des 1, au chiffre d&#233;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 &gt; 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 -&gt


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,452 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.