#include #include #include int reg[11]; char cast[10001]; char rimske[10001]; int is_num(char *pismeno) { return (pismeno[0] > '0' && pismeno[0] <= '9' ? 1 : 0); } void frimske(int num) { int pos = 0; while(1) { if (!num) break; if (num-1000 >= 0) { rimske[pos++] = 'M'; num -= 1000; continue; } if (num / 100 == 9) { rimske[pos++] = 'C'; rimske[pos++] = 'M'; num -= 900; continue; } if (num-500 >= 0) { rimske[pos++] = 'D'; num -= 500; continue; } if (num / 100 == 4) { rimske[pos++] = 'C'; rimske[pos++] = 'D'; num -= 400; continue; } if (num-100 >= 0) { rimske[pos++] = 'C'; num -= 100; continue; } if (num / 90 == 1) { rimske[pos++] = 'X'; rimske[pos++] = 'C'; num -= 90; continue; } if (num-50 >= 0) { rimske[pos++] = 'L'; num -= 50; continue; } if (num / 40 == 1) { rimske[pos++] = 'X'; rimske[pos++] = 'L'; num -= 40; continue; } if (num-10 >= 0) { rimske[pos++] = 'X'; num -= 10; continue; } if (num / 9 == 1) { rimske[pos++] = 'I'; rimske[pos++] = 'X'; num -= 9; continue; } if (num-5 >= 0) { rimske[pos++] = 'V'; num -= 5; continue; } if (num / 4 == 1) { rimske[pos++] = 'I'; rimske[pos++] = 'V'; num -= 4; continue; } if (num-1 >= 0) { rimske[pos++] = 'I'; num -= 1; continue; } } if (!pos) rimske[pos++] = 'O'; rimske[pos] = '\0'; } int to_num(char *ch) { int num = 0; int length = strlen(ch); int i; for (i = 0; i < length; i++) { int exc = 0; if (i+1 <= length) { if (ch[i] == 'I' && ch[i+1] == 'V') exc = 4; if (ch[i] == 'I' && ch[i+1] == 'X') exc = 9; if (ch[i] == 'X' && ch[i+1] == 'L') exc = 40; if (ch[i] == 'X' && ch[i+1] == 'C') exc = 90; if (ch[i] == 'C' && ch[i+1] == 'D') exc = 400; if (ch[i] == 'C' && ch[i+1] == 'M') exc = 900; } if (exc > 0) { num += exc; if (length > i+1) i++; continue; } else { if (ch[i] == 'O') exc = 0; if (ch[i] == 'I') exc = 1; if (ch[i] == 'V') exc = 5; if (ch[i] == 'X') exc = 10; if (ch[i] == 'L') exc = 50; if (ch[i] == 'C') exc = 100; if (ch[i] == 'D') exc = 500; if (ch[i] == 'M') exc = 1000; num += exc; } } /* printf("%s -> %d\n", ch, num);*/ return num; } int main() { char line[10001]; int i; int znamenka[10001]; for (i = 0; i < 11; i++) reg[i] = -1; while (1) { gets(line); if (strcmp(line, "QUIT") == 0) { printf("Bye\n"); break; } if (strcmp(line, "RESET") == 0) { for (i = 0; i < 11; i++) reg[i] = -1; printf("Ready\n"); continue; } int r; char tok[10001]; char *ptok = tok; strcpy(tok, strtok(line, "=")); r = atoi(tok); strcpy(line, strtok(NULL, "=")); /* printf("%s\n", line);*/ int tmp = strlen(line); int citac = 0; if (line[0] == '+') { znamenka[citac++] = 1; } else if (line[0] == '-') { znamenka[citac++] = 0; } else { znamenka[citac++] = 1; } for (i = 1; i < tmp; i++) { if (line[i] == '+') znamenka[citac++] = 1; if (line[i] == '-') znamenka[citac++] = 0; } int result = 0; ptok = strtok(line, "+-"); /* printf("%s\n", ptok);*/ if (is_num(ptok)) { if (reg[atoi(ptok)] == -1) { printf("Error\n"); continue; } if (znamenka[0]) { result += reg[atoi(ptok)]; } else { result -= reg[atoi(ptok)]; } } else { if (znamenka[0]) { result += to_num(ptok); } else { result -= to_num(ptok); } } int pos = 1; while ((ptok = strtok(NULL, "+-")) != NULL) { /* printf("%s %d\n", ptok, is_num(ptok));*/ if (is_num(ptok)) { if (reg[atoi(ptok)] == -1) { printf("Error\n"); break; } if (znamenka[pos++]) { result += reg[atoi(ptok)]; } else { result -= reg[atoi(ptok)]; } } else { if (znamenka[pos++]) { result += to_num(ptok); } else { result -= to_num(ptok); } } } if (result < 0 || result > 10000) { printf("Error\n"); continue; } frimske(result); printf("%d=%s\n", r, rimske); reg[r] = result; } return 0; }