Conversion d'entiers dans les bases binaire, hexadecimale, octale, test de nombre premier traduction litterale

Contenu du snippet

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.

A voir également

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.