
/*  Romano.c  */

#include <math.h>
main(argc,argv)
int argc;
char *argv[];
{
int lunghezza_stringa = 0;
int i = 0;
int numero_arg = 1;
int lettera_flag = 0;
int punto_decimale = 0;
int segno_negativo = 0;
int user_entry = 0;
double pow();

while ( numero_arg < argc && argc < 10 )
{
lunghezza_stringa = strlen(argv[numero_arg]);
punto_decimale = 0;
for (i = 0; i < lunghezza_stringa; i++)
{
if (*(argv[numero_arg] + i) == 46) punto_decimale = 1;
}
segno_negativo = 0;
for (i = 0; i < lunghezza_stringa; i++)
{
if (*(argv[numero_arg]+i) == 45 ) segno_negativo = 1;
}

lettera_flag = 0;
for (i=0; i<lunghezza_stringa; i++)
{
if ((*(argv[numero_arg]+i)<48 | *(argv[numero_arg]+i)>57) &&
(*(argv[numero_arg]+i) != 46) && (*(argv[numero_arg]+i) != 45)) lettera_flag
= 1;
}
if ((punto_decimale == 1) && (lettera_flag == 0))
{
printf("\n");
for (i = 0; i < lunghezza_stringa; i++)
printf("%c", *(argv[numero_arg] + i));
printf(" e' un numero decimale.\n");
punto_decimale = 0;
}
else if (lettera_flag == 1)
{
printf("\n");
for (i = 0; i < lunghezza_stringa; i++)
printf("%c", *(argv[numero_arg] + i));
printf(" contiene lettere. ");
printf("Digita solo numeri\n");
lettera_flag = 0;
}
else if ((segno_negativo == 1) && (lettera_flag == 0))
{
printf("\n");
for (i = 0; i < lunghezza_stringa; i++)
printf("%c", *(argv[numero_arg] + i));
printf(" e' un numero negativo.  I Romani non li conoscevano.\n");
segno_negativo = 0;
}
else
{

user_entry = 0;
for (i=0; i<lunghezza_stringa; i++)
user_entry +=
(*(argv[numero_arg]+i)-48)*pow(10.0,(float)(lunghezza_stringa-1-i));
if (user_entry > 3999999)
{
printf("\n");
for (i = 0; i < lunghezza_stringa; i++)
printf("%c", *(argv[numero_arg] + i));
printf(" e' piu' grande del numero Romano conosciuto che sia stato contato.\n");
}
else if (user_entry == 0)
{
printf("\n");
for (i = 0; i < lunghezza_stringa; i++)
printf("%c", *(argv[numero_arg] + i));
printf(" non esiste.\n");
}
else
{
romano(user_entry);
}
}
numero_arg++;
}
if (argc > 9)
{
printf("\nQuesto e' troppo grande!!\n");
}
if ( argc == 1)
{
printf("\nFORMATO: Romano xxx xxx xxx ... dove xxx = numero arabico\n");
}
}

romano(arabico)
int arabico;
{
char ans1[50],ans2[50];
int indice = 0;
int domanda;
domanda = arabico;
arabico = romanize(arabico,1000000,'_','M',ans1,ans2,&indice);
if (arabico >= 900000)
{
ans1[indice] = '_';
ans2[indice] = 'C';
indice++;
arabico=romanize(arabico,900000,'_','M',ans1,ans2,&indice);
}
arabico=romanize(arabico,100000,'_','C',ans1,ans2,&indice);
if (arabico >= 90000)
{
ans1[indice] = '_';
ans2[indice] = 'X';
indice++;
arabico=romanize(arabico,90000,'_','C',ans1,ans2,&indice);
}
arabico=romanize(arabico,10000,'_','X',ans1,ans2,&indice);
if (arabico  >= 9000)
{
ans1[indice] = ' ';
ans2[indice] = 'M';
indice++;
arabico=romanize(arabico,9000,' ','X',ans1,ans2,&indice);
}
arabico=romanize(arabico,5000,'_','V',ans1,ans2,&indice);
if (arabico >= 4000)
{
ans1[indice] = ' ';
ans2[indice] = 'M';
indice++;
arabico=romanize(arabico,4000,'_','V',ans1,ans2,&indice);
}
arabico = romanize(arabico, 1000,' ', 'M', ans1,ans2, &indice);
if (arabico >= 900)
{
ans1[indice] = ' ';
ans2[indice] = 'C';
indice++;
arabico = romanize(arabico, 900, ' ', 'M', ans1, ans2, &indice);
}
arabico = romanize(arabico, 500, ' ', 'D', ans1, ans2, &indice);
if (arabico >= 400)
{
ans1[indice] = ' ';
ans2[indice] = 'C';
indice++;
arabico = romanize(arabico, 400, ' ', 'D', ans1, ans2, &indice);
}
arabico = romanize(arabico, 100, ' ', 'C', ans1, ans2, &indice);
if (arabico >= 90)
{
ans1[indice] = ' ';
ans2[indice] = 'X';
indice++;
arabico = romanize(arabico, 90, ' ', 'C', ans1, ans2, &indice);
}
arabico = romanize(arabico, 50, ' ', 'L', ans1, ans2, &indice);
if (arabico >= 40)
{
ans1[indice] = ' ';
ans2[indice] = 'X';
indice++;
arabico = romanize(arabico, 40, ' ', 'L', ans1, ans2, &indice);
}
arabico = romanize(arabico, 10, ' ', 'X', ans1, ans2, &indice);
if (arabico >= 9)
{
ans1[indice] = ' ';
ans2[indice] = 'I';
indice++;
arabico = romanize(arabico, 9, ' ', 'X', ans1, ans2, &indice);
}
arabico = romanize(arabico, 5, ' ', 'V', ans1, ans2, &indice);
if (arabico >= 4)
{
ans1[indice] = ' ';
ans2[indice] = 'I';
indice++;
arabico = romanize(arabico, 4, ' ', 'V', ans1, ans2, &indice);
}
romanize(arabico, 1, ' ', 'I', ans1, ans2, &indice);
ans1[indice] = '\0';
ans2[indice] = '\0';
printf("%s\n", ans1);
printf("%s e' il numero Romano per %d\n", ans2, domanda);
}

romanize(i,  j,  c1,  c2,  a1,  a2, indirizzo_indice)
int i,  j;
char c1,  c2, a1[],  a2[];
int *indirizzo_indice;
{
while(i >= j)
{
a1[*indirizzo_indice] = c1;
a2[*indirizzo_indice] = c2;
*indirizzo_indice = *indirizzo_indice + 1;
i = i - j;
}
return(i);
}

