begin process at 2012 02 10 06:43:34
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > 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

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

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

Auteur : alyggattor

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
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.


 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip Source avec une capture CONVHTML : UN UTILITAIRE DE CONVERSION POUR FICHIERS HTML par pgl10
TECHNIQUE SIMPLE DE CONVERSION BINAIRE DÉCIMAL par DarthKhaos
Source avec Zip Source avec une capture CONVERSION D'UN NOMBRE D'UNE BASE QUELCONQUE VERS UNE AUTRE par Abrahamz
Source avec Zip CONVERSION DEC / HEX / BIN (WIN 32) par aardman

Commentaires et avis

Commentaire de layebado le 18/05/2007 23:56:36

pas mal

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

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

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.

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 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 &#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


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,602 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales