Code:
#include <stdio.h>
#include <stdlib.h>
struct conversion
{
int arabic;
char *roman;
};
static struct conversion conv[] = {
{ 1000, "M", },
{ 900, "CM", },
{ 500, "D", },
{ 400, "CD", },
{ 100, "C", },
{ 90, "XC", },
{ 50, "L", },
{ 40, "XL", },
{ 10, "X", },
{ 9, "IX", },
{ 5, "V", },
{ 4, "IV", },
{ 1, "I", },
};
#define TABSIZ(tab) sizeof tab / sizeof tab[0]
static int in_range ( int val, int low, int high )
{
return val >= low && high >= val;
}
int main ( void )
{
int val;
for ( ; ; ) {
size_t i;
printf ( "Enter an number 1-1000 (0 to quit): " );
if ( scanf ( " %d", &val ) != 1 || !in_range ( val, 0, 1000 ) ) {
fprintf ( stderr, "Invalid input\n" );
exit ( EXIT_FAILURE );
}
else if ( val == 0 )
break;
for ( i = 0; i < TABSIZ ( conv ); i++ ) {
while ( val >= conv[i].arabic ) {
val -= conv[i].arabic;
printf ( "%s", conv[i].roman );
}
}
}
return EXIT_SUCCESS;
}
-Prelude