#include <stdio.h>
#include <ctype.h>
#include <string.h>
//---------------------------------------------------------------------------
int digitValue(char);
void toUpperCase(char roman_Number[]);
int romanToDec(char roman_Number[]);
//---------------------------------------------------------------------------
int main(){
char roman_Number[1000];
long int number;
printf("Introduce un numero romano (Los digitos validos son I, V, X, L, C, D, M): ");
scanf("%s",roman_Number);
//Paso la cadena a mayusculas
toUpperCase(roman_Number);
//La paso de romano a decimal
number=romanToDec(roman_Number);
if(number > 0)
printf("Su valor decimal es: %ld\n",number);
return 0;
}
//---------------------------------------------------------------------------
//Con esta funcion paso de romano a decimal
int romanToDec(char roman_Number[]){
int i=0;
long int number =0;
while(roman_Number[i]){
if(digitValue(roman_Number[i]) < 0){
printf("El digito '%c' no es valido para numeros romanos\n",roman_Number[i]);
return 0;
}
if((strlen(roman_Number) -i) > 2){
if(digitValue(roman_Number[i]) < digitValue(roman_Number[i+2])){
printf("Numero romano con formato no valido\n");
return 0;
}
}
if(digitValue(roman_Number[i]) >= digitValue(roman_Number[i+1]))
number = number + digitValue(roman_Number[i]);
else{
number = number + (digitValue(roman_Number[i+1]) - digitValue(roman_Number[i]));
i++;
}
i++;
}
return number;
}
//---------------------------------------------------------------------------
//Con esta funcion paso la cadena a mayusculas
void toUpperCase(char roman_Number[]){
unsigned int i;
for(i=0;i<strlen(roman_Number);i++){
roman_Number[i] = toupper(roman_Number[i]);
}
}
//---------------------------------------------------------------------------
//Con esta funcion obtengo el valor de cada caracter
int digitValue(char c){
int value=0;
switch(c){
case 'I': value = 1; break;
case 'V': value = 5; break;
case 'X': value = 10; break;
case 'L': value = 50; break;
case 'C': value = 100; break;
case 'D': value = 500; break;
case 'M': value = 1000; break;
case '\0': value = 0; break;
default: value = -1;
}
return value;
}
//---------------------------------------------------------------------------