#include #include #include #define MAX_SIZE 10000 #define REGISTERS 10 typedef std::vector vecstring; typedef struct memplace { bool aktivne; int hodnota; } memplace; //1499 void arabske_na_rimske(int arabske, char *result) { strcpy(result, ""); int tisiciek = arabske / 1000; int stoviek = (arabske % 1000) / 100; int desiatok = (arabske % 100) / 10; int jednotiek = (arabske % 10); if (arabske == 0) strcpy(result, "0"); for (int i = 0; i < tisiciek; i++) { strcat(result, "M"); } if ((stoviek == 4)) strcat(result, "CD"); else if (stoviek == 9) strcat(result, "CM"); else { if (stoviek < 5) { for (int j = 0; j < stoviek; j++) strcat(result, "C"); } else if (stoviek < 9) { strcat(result, "D"); for (int j = 5; j < stoviek; j++) strcat(result, "C"); } } if ((desiatok == 4)) strcat(result, "XL"); else if (desiatok == 9) strcat(result, "XC"); else { if (desiatok < 5) { for (int j = 0; j < desiatok; j++) strcat(result, "X"); } else if (desiatok < 9) { strcat(result, "L"); for (int j = 5; j < desiatok; j++) strcat(result, "X"); } } if ((jednotiek == 4)) strcat(result, "IV"); else if (jednotiek == 9) strcat(result, "IX"); else { if (jednotiek < 5) { for (int j = 0; j < jednotiek; j++) strcat(result, "I"); } else if (jednotiek < 9) { strcat(result, "V"); for (int j = 5; j < jednotiek; j++) strcat(result, "I"); } } } int rimske_na_arabske(char *rimske) { int vysledok = 0; int i = 0; int dlzka_rimskych = strlen(rimske); while (i < dlzka_rimskych) { // kontrola dvojciselnych // IV 4 // IX 9 // XL 40 // XC 90 // CD 400 // CM 900 bool pouzite = false; if (i < dlzka_rimskych - 1) { if ((rimske[i] == 'I') && (rimske[i + 1] == 'V')) { vysledok += 4; i += 2; pouzite = true; } if ((rimske[i] == 'I') && (rimske[i + 1] == 'X')) { vysledok += 9; i += 2; pouzite = true; } if ((rimske[i] == 'X') && (rimske[i + 1] == 'L')) { vysledok += 40; i += 2; pouzite = true; } if ((rimske[i] == 'X') && (rimske[i + 1] == 'C')) { vysledok += 90; i += 2; pouzite = true; } if ((rimske[i] == 'C') && (rimske[i + 1] == 'D')) { vysledok += 400; i += 2; pouzite = true; } if ((rimske[i] == 'C') && (rimske[i + 1] == 'M')) { vysledok += 900; i += 2; pouzite = true; } } if (!pouzite) { switch (rimske[i]) { case 'O': vysledok += 0; break; case 'I': vysledok += 1; break; case 'V': vysledok += 5; break; case 'X': vysledok += 10; break; case 'L': vysledok += 50; break; case 'C': vysledok += 100; break; case 'D': vysledok += 500; break; case 'M': vysledok += 1000; break; } i++; } } return vysledok; } vecstring parse(char *line, char* operators) { vecstring result; strcpy(operators, ""); bool je_vo_vyraze = true; int zaciatok_vyrazu = 0; for (unsigned int i = 0; i < strlen(line); i++) { if ((line[i] == '=') || (line[i] == '+') || (line[i] == '-')) { je_vo_vyraze = false; char *rozlozeny_vyraz; rozlozeny_vyraz = (char*) malloc (sizeof(char) * (i - zaciatok_vyrazu + 1)); char *c_zaciatok_vyrazu = line; c_zaciatok_vyrazu += zaciatok_vyrazu; strncpy(rozlozeny_vyraz, c_zaciatok_vyrazu, i - zaciatok_vyrazu); result.push_back(rozlozeny_vyraz); int dlzka = strlen(operators); operators[dlzka] = line[i]; operators[dlzka + 1] = '\0'; } else if ((!je_vo_vyraze) && (line[i] != '=') && (line[i] != '+') && (line[i] != '-')) { zaciatok_vyrazu = i; je_vo_vyraze = true; } if (i == strlen(line) - 1) { char *rozlozeny_vyraz; rozlozeny_vyraz = (char*) malloc (sizeof(char) * (i - zaciatok_vyrazu + 1)); char *c_zaciatok_vyrazu = line; c_zaciatok_vyrazu += zaciatok_vyrazu; strcpy(rozlozeny_vyraz, c_zaciatok_vyrazu); result.push_back(rozlozeny_vyraz); } } return result; } int main(int argc, char **argv) { char line[MAX_SIZE]; memplace data[REGISTERS]; char *rimske, *operatory; rimske = (char*) malloc (sizeof(char) * MAX_SIZE); operatory = (char*) malloc (sizeof(char) * MAX_SIZE); for (int i = 0; i < REGISTERS; i++) { data[i].aktivne = false; data[i].hodnota = 0; } gets(line); while (strcmp(line, "QUIT") != 0) { // ak je prikaz RESET if (strcmp(line, "RESET") == 0) { for (int i = 0; i < REGISTERS; i++) { data[i].aktivne = false; data[i].hodnota = 0; } printf("Ready\n"); } else { vecstring parsed = parse(line, operatory); char miesto[2]; miesto[0] = line[0]; miesto[1] = '\0'; int pamatove_miesto = atoi(miesto); bool iba_rimske = true; bool vsetko_ok = true; for (unsigned int i = 1; i < parsed.size(); i++) { for (unsigned int j = 0; j < strlen(parsed[i]); j++) switch (parsed[i][j]) { case 'O': case 'I': case 'V': case 'X': case 'L': case 'C': case 'D': case 'M': break; default: iba_rimske = false; } } if (iba_rimske) { data[pamatove_miesto].aktivne = true; } else { if (data[pamatove_miesto].aktivne == true) { } else { printf("Error\n"); vsetko_ok = false; } } if (vsetko_ok) { int medzisucet = 0; int hodnota = 0; char lastoperator = '='; for (unsigned int i = 1; i < parsed.size(); i++) { char pamat_miesto[2]; pamat_miesto[0] = parsed[i][0]; pamat_miesto[1] = '\0'; int ipamat_miesto = atoi(pamat_miesto); if ((parsed[i][0] >= '0') && (parsed[i][0] <= '9')) { hodnota = data[ipamat_miesto].hodnota; if (i == 1) medzisucet = hodnota; } else { hodnota = rimske_na_arabske(parsed[i]); if (i == 1) medzisucet = hodnota; } if (lastoperator == '+') medzisucet += hodnota; if (lastoperator == '-') medzisucet -= hodnota; lastoperator = operatory[i]; } data[pamatove_miesto].hodnota = medzisucet; arabske_na_rimske(data[pamatove_miesto].hodnota, rimske); printf("%d=%s\n", pamatove_miesto, rimske); } } gets(line); } printf("Bye!\n"); return 0; }