#include #include #include struct { char *c; int n; } roman[] = { {"IV", 4}, {"IX", 9}, {"XL", 40}, {"XC", 90}, {"CD", 400}, {"CM", 900}, {"O", 0}, {"I", 1}, {"V", 5}, {"X", 10}, {"L", 50}, {"C", 100}, {"D", 500}, {"M", 1000}, {"Q", -1} }; struct { char *c; int n; } roman2[] = { {"M", 1000}, {"CM", 900}, {"D", 500}, {"CD", 400}, {"C", 100}, {"XC", 90}, {"L", 50}, {"XL", 40}, {"X", 10}, {"IX", 9}, {"V", 5}, {"IV", 4}, {"I", 1}, {"Q", -1} }; int dlzka = 0; int parse(char *start) { int ret = 0; char *s = start; int i; /*printf("parsea: %s\n", s); */ while (*s) { if (*s == '+' || *s == '-') { /*printf("parse: %d\n", ret); */ dlzka = s - start; /*printf("dlzka: %d\n", dlzka);*/ return ret; } for (i = 0; roman[i].n != -1; i++) { if (strncmp(s,roman[i].c, strlen(roman[i].c)) == 0) { ret += roman[i].n; s += strlen(roman[i].c); break; } } } /*printf("parse: %d\n", ret);*/ dlzka = s - start; /*printf("dlzka: %d\n", dlzka);*/ return ret; } void preved(int c) { int i; if (c == 0) printf("0"); while (c) { for (i = 0; roman2[i].n != -1; i++) { if (c >= roman2[i].n) { printf("%s", roman2[i].c); c -= roman2[i].n; break; } } } } int main(void) { char line[20000]; int reg[20]; char *s; int i; int kam; while (fgets(line, sizeof(line), stdin) != NULL) { /*rintf("line: %s\n", line);*/ line[strlen(line)-1] = '\0'; if (!strcmp(line, "RESET")) { for (i = 0; i < 20; i++) reg[i] = -1; printf("Ready\n"); } else if (!strcmp(line, "QUIT")) { printf("Bye\n"); return 0; } else { int error = 0; int cislo = 0; int result = 0; char temp[1000]; int f = 0; kam = atoi(line); s = line + 2; memset(temp, 0, sizeof(temp)); f = 1; int op = 0; while (*s) { if (*s >= '0' && *s <= '9') { cislo = reg[*s-'0']; if (reg[*s-'0'] == -1) { printf("Error\n"); error = 1; break; } /*printf("cislo %d\n", cislo);*/ if (op == 0) { result = cislo; } else if (op == 1) result += cislo; else if (op == 2) result -= cislo; s++; } else if (*s == '+') { op = 1; s++; } else if (*s == '-') { op = 2; s++; } else { cislo = parse(s); if (op == 0) { result = cislo; f = 0; } else if (op == 1) result += cislo; else if (op == 2) result -= cislo; s += dlzka; } } if (error) continue; if (result < 0 || result > 10000) { printf("Error\n"); continue; } /*printf("result: %d\n", result);*/ printf("%d=", kam); preved(result); printf("\n"); reg[kam] = result; } } return 0; }