[vc++]conversion romain->décimal et inverse

Description

Voila 2 fonctions : Int2Roman et Roman2Int. Je rapelle (car je me suis renseigné sur un site) que le vrai nombre maximal en chiffre romains est 4988). Il peut y avoir 4 milles, 1 cinq-cents, 4 cents, 1 cinquante, 3 dix, 1 cinq et 3 un. J'espère être assez compréhensible ! Enfin la meilleure des choses c'est d'essayer le prog ou de matter la source @+ :)
Ah au fait, j'attends vos commentaires :)

Source / Exemple :


#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct s_roman
{
	char	roman_char;
	short	roman_int;
};

char*		Int2Roman (int);
int			Roman2Int (char*);

char		j, debug;
s_roman		roman[7];

int		main (int argc, char *argv[])
{
	char	roman_nb[64];
	short	nombre = 0;

	strcpy (roman_nb, "");

	if ( (argc > 1) && (strcmp(argv[1], "debug=1") == 0) ) debug = 1;

	/* INITIALISATION S_ROMAN */
	roman[0].roman_char = 'M';
	roman[1].roman_char = 'D';
	roman[2].roman_char = 'C';
	roman[3].roman_char = 'L';
	roman[4].roman_char = 'X';
	roman[5].roman_char = 'V';
	roman[6].roman_char = 'I';
	for (j=0 ; j<7 ; j++) roman[j].roman_int = 0;

	printf ("* Int2Roman\nEntrez un nombre entier <= 4988 : ");
	while ( (nombre <= 0) || (nombre > 4988) )
	{
		scanf ("%d", &nombre); flushall();
	}
	printf ("Nombre converti : %s\n", Int2Roman(nombre) );

	printf ("* Roman2Int\nEntrez un nombre romain <= MMMMDCCCCLXXXVIII : ");
	gets (roman_nb);
	printf ("Nombre romain converti : %d\n", Roman2Int(roman_nb) );

	system ("pause");

	return (0);
}

char*		Int2Roman (int nombre)
{
	char	*roman_nb = new char[64];
	char	i = 0;

	strcpy (roman_nb, "");

	while (nombre - 1000 >= 0) 
	{
		nombre = nombre - 1000;
		strncat (roman_nb, "M", 1);
		i++;
		if (debug == 1) printf ("roman_nb=%s nombre=%d i=%d\n", roman_nb, nombre, i);
	}

	while (nombre - 500 >= 0) 
	{
		nombre = nombre - 500;
		strncat (roman_nb, "D", 1);
		i++;
		if (debug == 1) printf ("roman_nb=%s nombre=%d i=%d\n", roman_nb, nombre, i);
	}

	while (nombre - 100 >= 0) 
	{
		nombre = nombre - 100;
		strncat (roman_nb, "C", 1);
		i++;

		if (debug == 1) printf ("roman_nb=%s nombre=%d i=%d\n", roman_nb, nombre, i);
	}

	while (nombre - 50 >= 0) 
	{
		nombre = nombre - 50;
		strncat (roman_nb, "L", 1);
		i++;

		if (debug == 1) printf ("roman_nb=%s nombre=%d i=%d\n", roman_nb, nombre, i);
	}

	while (nombre - 10 >= 0) 
	{
		nombre = nombre - 10;
		strncat (roman_nb, "X", 1);
		i++;

		roman[4].roman_int++;

		if (roman[4].roman_int == 4)
		{
			roman_nb[i-4] = 'X';
			roman_nb[i-3] = 'L';
			roman_nb[i-2] = '\0';
			i = i - 2;
		}

		if (debug == 1) printf ("roman_nb=%s nombre=%d i=%d\n", roman_nb, nombre, i);
	}

	while (nombre - 5 >= 0) 
	{
		nombre = nombre - 5;
		strncat (roman_nb, "V", 1);
		i++;
		if (debug == 1) printf ("roman_nb=%s nombre=%d i=%d\n", roman_nb, nombre, i);
	}

	while (nombre - 1 >= 0) 
	{
		nombre = nombre - 1;
		strncat (roman_nb, "I", 1);
		i++;

		roman[6].roman_int++;

		if (roman[6].roman_int == 4)
		{
			roman_nb[i-4] = 'I';
			roman_nb[i-3] = 'V';
			roman_nb[i-2] = '\0';

			i = i - 2;

			if (roman_nb[i-3] == 'V')
			{
				roman_nb[i-3] = 'I';
				roman_nb[i-2] = 'X';
				roman_nb[i-1] = '\0';

				i = i - 1;
			}
		}

		if (debug == 1) printf ("roman_nb=%s nombre=%d i=%d\n", roman_nb, nombre, i);
	}
	
	for (j=0 ; j<7 ; j++) roman[j].roman_int = 0;
	return (roman_nb);
}

// MDCLXVI

int			Roman2Int (char* roman_nb)
{
	short	nombre = 0;
	char	i = 0;
	
	while (roman_nb[i] != '\0') 
	{
		if ( (roman_nb[i] != 'M') && (roman_nb[i] != 'D') && (roman_nb[i] != 'C') 
			&& (roman_nb[i] != 'L') && (roman_nb[i] != 'X') && (roman_nb[i] != 'V') 
			&& (roman_nb[i] != 'I') ) return (0);

		if (roman_nb[i] == 'M')
		{
			if (roman[0].roman_int == 4) return (0);

			nombre = nombre + 1000;
			roman[0].roman_int++;
		}

		if (roman_nb[i] == 'D')
		{
			if (roman[1].roman_int == 1) return (0);

			nombre = nombre + 500;
			roman[1].roman_int++;
		}
		
		if (roman_nb[i] == 'C')
		{
			if (roman[2].roman_int == 4) return (0);

			nombre = nombre + 100;
			roman[2].roman_int++;
		}

		if (roman_nb[i] == 'L')
		{
			if (roman_nb[i-1] == 'X')
			{
				nombre = nombre - 10;
				nombre = nombre + 40;
				roman[3].roman_int++;
			}
			else
			{
				if (roman[3].roman_int == 4) return (0);
			
				nombre = nombre + 50;
				roman[3].roman_int++;
			}
		}

		if (roman_nb[i] == 'X')
		{
			if (roman_nb[i-1] == 'I')
			{
				nombre = nombre - 1;
				nombre = nombre + 9;
				roman[4].roman_int++;
			}
			else
			{
				if (roman[4].roman_int == 4) return (0);
			
				nombre = nombre + 10;
				roman[4].roman_int++;
			}
		}

		if (roman_nb[i] == 'V')
		{
			if (roman_nb[i-1] == 'I')
			{
				nombre = nombre - 1;
				nombre = nombre + 4;
				roman[5].roman_int++;
			}
			else
			{
				if (roman[5].roman_int == 2) return (0);
			
				nombre = nombre + 5;
				roman[5].roman_int++;
			}
		}

		if (roman_nb[i] == 'I')
		{
			if (roman[6].roman_int == 4) return (0);
			
			nombre = nombre + 1;
			roman[6].roman_int++;
		}

		i++;
	}
	
	for (j=0 ; j<7 ; j++) roman[j].roman_int = 0;
	return (nombre);
}

Conclusion :


En espérant que ca marche bien car ya tellement de nombres à tester !

Codes Sources

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.