# roman numeral to decimal integer

0 Tallied Votes 864 Views

the code takes each character and stores where and how many times a roman numeral appears and the assess the integer. this is my first code im posting. anything to make the code better is most welcome.
roman numeral refers to
M=1000
D=500
C=100
L=50
X=10
V=5
I=1
and uses the standard method of assessing roman numeral.

``````//code to convert roman numeral to integer
#include<stdio.h>
#include<conio.h>
main()
{
int n=0,i=0,x=0,ax=0,bx=0,cx=0,dx=0,ex=0,fx=0,gx=0,g[10],a[10],b[10],c[10],d[10],e[10],f[10];
char r[10];
printf("please enter the roman numeral :");
scanf("%s",&r);
for(;i<10;i++)
{
switch(r[i])
{
case'I':
a[ax]=i;++ax;
break;
case'V':
b[bx]=i;++bx;
break;
case'X':
c[cx]=i;++cx;
break;
case'L':
d[dx]=i;++dx;
break;
case'C':
e[ex]=i;++ex;
break;
case'D':
f[fx]=i;++fx;
break;
case'M':
g[gx]=i;++gx;
break;
default:
;
}
}
for(i=0;r[i]!=0 ;i++)
{
x++;
}
n = 1000*(gx);
for(i=0;i<fx;i++)
{
if(gx==0)
n=500*fx;
else if(f[i]>g[gx-1])
n=n+500;
else
n=n-500;
}
for(i=0;i<ex;i++)
{
if(gx==0&fx==0)
n=100*ex;
else if(fx==0&gx!=0&e[i]<g[gx-1])
n=n-100;
else if(fx==0&gx!=0&e[i]>g[gx-1])
n=n+100;
else if(fx=!0&gx==0&e[i]<f[fx-1])
n=n-100;
else if(fx=!0&gx==0&e[i]>f[fx-1])
n=n+100;
else if(fx=!0&gx!=0&e[i]>f[fx-1]&e[i]>g[gx-1])
n=n+100;
else if(fx=!0&gx!=0&e[i]>g[gx-1]&e[i]<f[fx-1])
n=n-100;
}
n= ((50*dx)+n);
n= ((10*cx)+n);
for(i=0;i<cx;i++)
{
if(c[i]<e[ex-1]&c[i]<d[dx-1])
n = n-20;
}
n= ((5*bx)+n);
n= ((1*ax)+n);
for(i=0;i<ax;i++)
{
if(a[i]<b[bx-1]&a[i]<c[cx-1])
n = n-2;
}
printf("value is %d ",n);
getch();
return 0;
}``````
Salem 5,138

First, INDENT your code.

``````#include<stdio.h>
main()
{
int n = 0, i = 0, x = 0, ax = 0, bx = 0, cx = 0, dx = 0, ex = 0, fx =
0, gx = 0, g[10], a[10], b[10], c[10], d[10], e[10], f[10];
char r[10];
printf("please enter the roman numeral :");
scanf("%s", &r);
for (; i < 10; i++) {
switch (r[i]) {
case 'I':
a[ax] = i;
++ax;
break;
case 'V':
b[bx] = i;
++bx;
break;
case 'X':
c[cx] = i;
++cx;
break;
case 'L':
d[dx] = i;
++dx;
break;
case 'C':
e[ex] = i;
++ex;
break;
case 'D':
f[fx] = i;
++fx;
break;
case 'M':
g[gx] = i;
++gx;
break;
default:
;
}
}
for (i = 0; r[i] != 0; i++) {
x++;
}
n = 1000 * (gx);
for (i = 0; i < fx; i++) {
if (gx == 0)
n = 500 * fx;
else if (f[i] > g[gx - 1])
n = n + 500;
else
n = n - 500;
}
for (i = 0; i < ex; i++) {
if (gx == 0 & fx == 0)
n = 100 * ex;
else if (fx == 0 & gx != 0 & e[i] < g[gx - 1])
n = n - 100;
else if (fx == 0 & gx != 0 & e[i] > g[gx - 1])
n = n + 100;
else if (fx = !0 & gx == 0 & e[i] < f[fx - 1])
n = n - 100;
else if (fx = !0 & gx == 0 & e[i] > f[fx - 1])
n = n + 100;
else if (fx = !0 & gx != 0 & e[i] > f[fx - 1] & e[i] > g[gx - 1])
n = n + 100;
else if (fx = !0 & gx != 0 & e[i] > g[gx - 1] & e[i] < f[fx - 1])
n = n - 100;
}
n = ((50 * dx) + n);
n = ((10 * cx) + n);
for (i = 0; i < cx; i++) {
if (c[i] < e[ex - 1] & c[i] < d[dx - 1])
n = n - 20;
}
n = ((5 * bx) + n);
n = ((1 * ax) + n);
for (i = 0; i < ax; i++) {
if (a[i] < b[bx - 1] & a[i] < c[cx - 1])
n = n - 2;
}
printf("value is %d ", n);
return 0;
}``````

Second, don't use non-standard (and obsolete) headers like conio.h.

Third, use a decent compiler. I rather suspect this was tried on 20+ year old turbo c.
Modern compilers spot a lot more things, like

``````\$ gcc -W -Wall -ansi -pedantic -O2 foo.c
foo.c:3: warning: return type defaults to ‘int’
foo.c: In function ‘main’:
foo.c:8: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[10]’
foo.c:56: warning: suggest brackets around comparison in operand of &
foo.c:58: warning: suggest brackets around comparison in operand of &
foo.c:58: warning: suggest brackets around comparison in operand of &
foo.c:60: warning: suggest brackets around comparison in operand of &
foo.c:60: warning: suggest brackets around comparison in operand of &
foo.c:62: warning: suggest brackets around comparison in operand of &
foo.c:62: warning: suggest brackets around comparison in operand of &
foo.c:62: warning: suggest brackets around assignment used as truth value
foo.c:64: warning: suggest brackets around comparison in operand of &
foo.c:64: warning: suggest brackets around comparison in operand of &
foo.c:64: warning: suggest brackets around assignment used as truth value
foo.c:66: warning: suggest brackets around comparison in operand of &
foo.c:66: warning: suggest brackets around comparison in operand of &
foo.c:66: warning: suggest brackets around comparison in operand of &
foo.c:66: warning: suggest brackets around assignment used as truth value
foo.c:68: warning: suggest brackets around comparison in operand of &
foo.c:68: warning: suggest brackets around comparison in operand of &
foo.c:68: warning: suggest brackets around comparison in operand of &
foo.c:68: warning: suggest brackets around assignment used as truth value
foo.c:74: warning: suggest brackets around comparison in operand of &
foo.c:80: warning: suggest brackets around comparison in operand of &
foo.c:8: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result
foo.c:64: warning: array subscript is below array bounds
foo.c:66: warning: array subscript is below array bounds
foo.c:68: warning: array subscript is below array bounds``````

The array bound warnings are extremely troublesome.
Possibly ALL the places you used &, you should have used &&

Fourth, it doesn't work with the prefix notation.

``````\$ ./a.out
please enter the roman numeral :II
value is 2 \$
\$ ./a.out
please enter the roman numeral :XIX
value is 21 \$``````

The second one should print 19, not 21.

commented: Well said. +13
commented: thank you +0

i think i have the best one
that is

``````//code to convert roman numeral to integer
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
int ret_level(char ch)
{
switch (ch)
{
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
default:
return -1;
}
}
int main()
{
char str[10];
scanf("%s",str);
//printf("%s",str);
int len = strlen(str),x,sum = 0;
x = len-1;
int last_level = ret_level(str[x--]);
sum = last_level;
//int * array = (int *)malloc(10*sizeof(int));
while (x >= 0)
{
if (last_level <= ret_level(str[x]))
sum = sum + ret_level(str[x]);
else
sum = sum - ret_level(str[x]);
last_level = ret_level(str[x]);
x--;
}
printf("%d",sum);
return 0;
}``````
WaltP 2,905

i think i have the best one

You violate Salem's 2nd rule and you think your solution is better? Think again.
And your switch statement is terrible. And you used `scanf("%s",str);` , too. Very dangerous...

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.