#include #include using namespace std; //enum {O = 0, I = 1, V = 5, X = 10, L = 50, C} char* buffer; int regs[10]; char reset[] = "RESET"; char quit[] = "QUIT"; char* result; int parseNum(int& idx){ int ret = 0; char next = 'a'; while (buffer[idx] != '+' && buffer[idx] != '-' && buffer[idx] != 0){ switch (buffer[idx]){ case ('O') : ret +=0; break; case ('I') : next = buffer[idx+1]; if (next == 'V') {ret+=4; idx++; break;} if (next == 'X') {ret+=9; idx++; break;} ret+=1; break; case ('V') : ret+=5; break; case ('X') : next = buffer[idx+1]; if (next == 'L') {ret+=40; idx++; break;} if (next == 'C') {ret+=90; idx++; break;} ret+=10; break; case ('L') : ret+=50; break; case ('C') : next = buffer[idx+1]; if (next == 'D') {ret+=400; idx++; break;} if (next == 'M') {ret+=900; idx++; break;} ret+=100; break; case ('D') : ret+=500; break; case ('M') : ret+=1000; break; } idx++; } --idx; // cout << "parse = " << ret << endl; return ret; } void print(int cislo){ if (cislo == 0) {cout << "O"; return;} int pocet = 0; pocet = cislo/1000; for (int i = 0; i < pocet; i++) cout << 'M'; cislo = cislo%1000; pocet = cislo/100; if (pocet == 4) {cout << "CD"; pocet = 0;} else if (pocet == 9) {cout << "CM"; pocet=0;} else if (pocet >= 5 ) {cout << 'D'; pocet-=5;} for (int i = 0; i < pocet; i++) cout << 'C'; cislo = cislo%100; pocet = cislo/10; if (pocet == 4) {cout << "XL"; pocet = 0;} else if (pocet == 9) {cout << "XC"; pocet=0;} else if (pocet >= 5 ) {cout << 'L'; pocet-=5; } for (int i = 0; i < pocet; i++) cout << 'X'; cislo = cislo%10; pocet = cislo; if (pocet == 4) {cout << "IV"; pocet=0;} else if (pocet == 9) {cout << "IX"; pocet=0;} else if (pocet >= 5 ) {cout << 'V'; pocet-=5;} for (int i = 0; i < pocet; i++) cout << 'I'; } int main (int argc, char* argv[]){ buffer = new char[10001]; bool chyba = false; bool minus = false; for (int i = 0; i < 10; i++) regs[i] = -1; cin >> setw(10001) >> buffer; result = strstr(buffer, quit); int value = 0; while ( result == NULL){ //RESET if ( (strstr(buffer, reset)) ){ cout << "Ready" << endl; for (int i = 0; i < 10; i++) regs[i] = -1; } else{ int regNr = atoi(&buffer[0]);if (regNr == 0) chyba = true; // cout << "regNr = " << regNr << endl; int reg2; for (int i = 2; i < strlen(buffer); i++){ if (chyba) {break;} switch (buffer[i]){ case ('+') : minus = false; break; case ('-') : minus = true; break; case ('1') : case ('2') : case ('3') : case ('4') : case ('5') : case ('6') : case ('7') : case ('8') : case ('9') : // cout << "cislo" << endl; reg2 = atoi(&buffer[i]); if (regs[reg2] < 0) {chyba=true; break;} value+= minus?(-regs[reg2]):(regs[reg2]); break; default : // cout << "ROMAN" << endl; value+= minus?( -parseNum(i) ):( parseNum(i) ); break; } } // cout << "value = " << value << endl; if (value>10000 || value < 0 || chyba) {chyba = true; cout << "Error" << endl;} if (!chyba) {regs[regNr] = value; cout << regNr << "="; print(value); cout << endl;} chyba = false; minus = false; value = 0; } cin >> setw(10001) >> buffer; result = strstr(buffer, quit); } cout << "Bye" << endl; return 0; }