Nombres en chiffres romains [borland turbo c++ 3.0]

Contenu du snippet

C'est un programme qui convertit un nombre en chiffre romain. Si vous y trouvez une utilité, je dis chapeau bas.

Le programme utilise un tableau contenant déjà les caractères romains. Un algorithme basique permet d'afficher les caractères nécessaires (en romain) selon le chiffre (arabe) trouvé.

La contrainte du programme était d'utiliser des pointeurs (avec malloc - realloc) pour utiliser un minimum de mémoire, la chaine de chiffres romains étant redimensionnée automatiquement. Il est évident que sans cela, le programme serait plus simple à comprendre.

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <dos.h>

// tous les chiffres romains
char romain[7]={'I', 'V', 'X', 'L', 'C', 'D', 'M'};

char * conv(int nbre)
 {
	int diz;		  	// nombre compris entre 1 et 10 (dizaine)
	int nb;				// utilise lors des calculs
	int pt=0;			// decallage du pointeur (debut -> 0)
	char *result;		// resultat retourne
	result=(char *) malloc (sizeof(char));
	char *rm;			// chaine temporaire (tampon) pointant sur result
	rm=(char *) malloc (sizeof(char));

	for (int i=3; i>=-1; i--)		// puissance de 10 decroisante (sur le nombre)
		if ((nbre / pow(10,i))  > 1 )
		 {
			diz = nbre / pow(10,i);	// on recherche le chiffre (entre 1 et 10)
			rm=result+pt;			// on actualise le pointeur tampon sur le resultat
			switch (diz)			// selon le chiffre, on obtient les resultats suivants
			 {
				case 1:	sprintf(rm,"%c",romain[2*i+0]);
						nb=1; pt+=1; break;
				case 2: sprintf(rm,"%c%c",romain[2*i+0],romain[2*i+0]);
						nb=2; pt+=2; break;
				case 3: sprintf(rm,"%c%c%c",romain[2*i+0],romain[2*i+0],romain[2*i+0]);
						nb=3; pt+=3; break;
				case 4: sprintf(rm,"%c%c",romain[2*i+0],romain[2*i+1]);
						nb=4; pt+=2; break;
				case 5: sprintf(rm,"%c",romain[2*i+1]);
						nb=5; pt+=1; break;
				case 6: sprintf(rm,"%c%c",romain[2*i+1],romain[2*i+0]);
						nb=6; pt+=2; break;
				case 7: sprintf(rm,"%c%c%c",romain[2*i+1],romain[2*i+0],romain[2*i+0]);
						nb=7; pt+=3; break;
				case 8: sprintf(rm,"%c%c%c%c",romain[2*i+1],romain[2*i+0],romain[2*i+0],romain[2*i+0]);
						nb=8; pt+=4; break;
				case 9: sprintf(rm,"%c%c",romain[2*i+0],romain[2*i+2]);
						nb=9; pt+=2; break;
				case 10:sprintf(rm,"%c",romain[2*i+2]);
						nb=10; pt+=1; break;
			 }
			nbre=nbre - nb*pow(10, i);
			result=(char *) realloc (result, pt*sizeof(char));
		 }
	return result;
 }

void main()
 {
	int nbre;
	char *result;
	result=(char *) malloc (sizeof(char));

	clrscr();
	do
	 {
		printf("Entrez votre chiffre [1 - 3999] : ");
		scanf("%d",&nbre);
	 }
	while ((nbre < 1) || (nbre > 3999));
	result=conv(nbre);	// lancement de la fonction
	printf("Le resultat est %s", result);
	getch();
 }

Conclusion :


BeLZeL (belzel@free.fr)

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.