Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define NMAX 1000000
- using namespace std;
- char S[NMAX], *p = S, c[NMAX];
- map<string, int> numar;
- long termen();
- long factor();
- long eval() {
- long r = termen();
- while (*p == '+' || *p == '-') {
- switch (*p) {
- case '+':
- ++p; // trecem peste semnul "+"
- r += termen();
- break;
- case '-':
- ++p; // trecem peste semnul "-"
- r -= termen();
- break;
- }
- }
- return r;
- }
- long termen() {
- long r = factor();
- while (*p == '*' || *p == '/') {
- switch (*p) {
- case '*' :
- ++p;
- r *= factor();
- break;
- case '/':
- ++p;
- r /= factor();
- break;
- }
- }
- return r;
- }
- long factor() {
- long r = 0;
- if (*p == '(') { // avem o subexpresie
- ++p; // trecem peste '('
- r = eval();
- ++p; // trecem peste ')'
- } else {
- while (*p >= '0' && *p <= '9') { // avem un numar
- r = r * 10 + *p - '0';
- ++p;
- }
- }
- return r;
- }
- bool este_operator(char *sir) {
- if (strstr(sir, "inmultit") != nullptr || strstr(sir, "produsul") != nullptr)
- return true;
- if (strstr(sir, "impartit") != nullptr || strstr(sir, "impartirii") != nullptr)
- return true;
- if (strstr(sir, "adunat") != nullptr || strstr(sir, "plus") != nullptr || strstr(sir, "suma") != nullptr)
- return true;
- if (strstr(sir, "diferenta") != nullptr || strstr(sir, "scazut") != nullptr || strstr(sir, "minus") != nullptr)
- return true;
- return false;
- }
- bool este_paranteza(char *sir) {
- return strstr(sir, "(") != nullptr || strstr(sir, ")") != nullptr;
- }
- /*bool este_paranteza2(char c {
- return c == '(' || c == ')';
- }
- */
- bool este_util(char *sir) {
- return strstr(sir, "si") == nullptr && strstr(sir, "de") == nullptr && strstr(sir, "la") == nullptr &&
- strstr(sir, "cu") == nullptr && strstr(sir, "Cat") == nullptr && strstr(sir, "este") == nullptr
- && strstr(sir, "lui") == nullptr;
- }
- void init() {
- numar["o"] = 1;
- numar["unu"] = 1;
- numar["un"] = 1;
- numar["doi"] = 2;
- numar["doua"] = 2;
- numar["trei"] = 3;
- numar["patru"] = 4;
- numar["cinci"] = 5;
- numar["sai"] = 6;
- numar["sase"] = 6;
- numar["sapte"] = 7;
- numar["opt"] = 8;
- numar["noua"] = 9;
- numar["zece"] = 10;
- numar["unsprezece"] = 11;
- numar["doisprezece"] = 12;
- numar["treisprezece"] = 13;
- numar["paisprezece"] = 14;
- numar["cincisprezece"] = 15;
- numar["saisprezece"] = 16;
- numar["saptesprezece"] = 17;
- numar["optsprezece"] = 18;
- numar["nouasprezece"] = 19;
- numar["zeci"] = 10;
- numar["sute"] = 100;
- numar["suta"] = 100;
- numar["mii"] = 1000;
- numar["mie"] = 1000;
- numar["milion"] = 1000000;
- numar["milioane"] = 1000000;
- }
- void insereaza_cifra(int cifra, int &poz) {
- S[poz++] = cifra + '0';
- }
- void insereaza__numar(int nr, int &poz) {
- int uc, temp[10], j = -1;
- while (nr > 0) {
- uc = nr % 10;
- temp[++j] = uc;
- nr /= 10;
- }
- while (j >= 0) {
- cout << temp[j];
- insereaza_cifra(temp[j], poz);
- j--;
- }
- }
- void insereaza_operator(char *sir, int &poz) {
- if (strstr("inmultitprodusul", sir) != nullptr)
- S[poz++] = '*';
- if (strstr("impartitimpartirii", sir) != nullptr)
- S[poz++] = '/';
- if (strstr("adunatplussuma", sir) != nullptr)
- S[poz++] = '+';
- if (strstr("diferentascazutminus", sir) != nullptr)
- S[poz++] = '-';
- if (strstr(sir, "(") != nullptr)
- S[poz++] = '(';
- if (strstr(sir, ")") != nullptr)
- S[poz++] = ')';
- cout << S[poz - 1];
- }
- void citire() {
- cin.getline(c, NMAX);
- }
- void convertor_expresie_matematica() {
- int Suma = 0, cnt = 0, mult = 0, poz = 0;
- char *sir;
- bool ramas = false;
- sir = strtok(c, " ?,.");
- while (sir) {
- if (este_operator(sir) || este_paranteza(sir)) {
- /*if (!este_paranteza(sir)) {
- if (ramas)
- Suma += mult;
- insereaza__numar(Suma, poz);
- Suma = 0;
- cnt = 0;
- }
- */
- if (Suma != 0 || ramas) {
- if (ramas)
- Suma += mult;
- insereaza__numar(Suma, poz);
- Suma = 0;
- ramas = false;
- cnt = 0;
- }
- insereaza_operator(sir, poz);
- } else {
- if (este_util(sir)) {
- if (cnt % 2 == 0) {
- ramas = true;
- mult = numar[sir];
- } else {
- ramas = false;
- Suma += mult * numar[sir];
- }
- cnt++;
- }
- }
- sir = strtok(nullptr, " .?,");
- }
- if (Suma != 0 || ramas) {
- if (ramas)
- Suma += mult;
- insereaza__numar(Suma, poz);
- }
- }
- int main() {
- init();
- citire();
- convertor_expresie_matematica();
- cout << '\n';
- cout << eval();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement