Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define NMAX 1000000
  4.  
  5. using namespace std;
  6.  
  7. char S[NMAX], *p = S, c[NMAX];
  8.  
  9. map<string, int> numar;
  10.  
  11. long termen();
  12.  
  13. long factor();
  14.  
  15. long eval() {
  16.     long r = termen();
  17.     while (*p == '+' || *p == '-') {
  18.         switch (*p) {
  19.             case '+':
  20.                 ++p;                        // trecem peste semnul "+"
  21.                 r += termen();
  22.                 break;
  23.             case '-':
  24.                 ++p;                        // trecem peste semnul "-"
  25.                 r -= termen();
  26.                 break;
  27.         }
  28.     }
  29.     return r;
  30. }
  31.  
  32. long termen() {
  33.     long r = factor();
  34.     while (*p == '*' || *p == '/') {
  35.         switch (*p) {
  36.             case '*' :
  37.                 ++p;
  38.                 r *= factor();
  39.                 break;
  40.             case '/':
  41.                 ++p;
  42.                 r /= factor();
  43.                 break;
  44.         }
  45.     }
  46.     return r;
  47. }
  48.  
  49. long factor() {
  50.     long r = 0;
  51.     if (*p == '(') {                        // avem o subexpresie
  52.         ++p;                                // trecem peste '('
  53.         r = eval();
  54.         ++p;                                // trecem peste ')'
  55.     } else {
  56.         while (*p >= '0' && *p <= '9') {        // avem un numar
  57.             r = r * 10 + *p - '0';
  58.             ++p;
  59.         }
  60.     }
  61.     return r;
  62. }
  63.  
  64. bool este_operator(char *sir) {
  65.     if (strstr(sir, "inmultit") != nullptr || strstr(sir, "produsul") != nullptr)
  66.         return true;
  67.     if (strstr(sir, "impartit") != nullptr || strstr(sir, "impartirii") != nullptr)
  68.         return true;
  69.     if (strstr(sir, "adunat") != nullptr || strstr(sir, "plus") != nullptr || strstr(sir, "suma") != nullptr)
  70.         return true;
  71.     if (strstr(sir, "diferenta") != nullptr || strstr(sir, "scazut") != nullptr || strstr(sir, "minus") != nullptr)
  72.         return true;
  73.  
  74.     return false;
  75. }
  76.  
  77. bool este_paranteza(char *sir) {
  78.     return strstr(sir, "(") != nullptr || strstr(sir, ")") != nullptr;
  79. }
  80.  
  81. /*bool este_paranteza2(char c {
  82.     return c == '('  || c == ')';
  83. }
  84. */
  85. bool este_util(char *sir) {
  86.     return strstr(sir, "si") == nullptr && strstr(sir, "de") == nullptr && strstr(sir, "la") == nullptr &&
  87.            strstr(sir, "cu") == nullptr && strstr(sir, "Cat") == nullptr && strstr(sir, "este") == nullptr
  88.            && strstr(sir, "lui") == nullptr;
  89. }
  90.  
  91. void init() {
  92.     numar["o"] = 1;
  93.     numar["unu"] = 1;
  94.     numar["un"] = 1;
  95.     numar["doi"] = 2;
  96.     numar["doua"] = 2;
  97.     numar["trei"] = 3;
  98.     numar["patru"] = 4;
  99.     numar["cinci"] = 5;
  100.     numar["sai"] = 6;
  101.     numar["sase"] = 6;
  102.     numar["sapte"] = 7;
  103.     numar["opt"] = 8;
  104.     numar["noua"] = 9;
  105.     numar["zece"] = 10;
  106.     numar["unsprezece"] = 11;
  107.     numar["doisprezece"] = 12;
  108.     numar["treisprezece"] = 13;
  109.     numar["paisprezece"] = 14;
  110.     numar["cincisprezece"] = 15;
  111.     numar["saisprezece"] = 16;
  112.     numar["saptesprezece"] = 17;
  113.     numar["optsprezece"] = 18;
  114.     numar["nouasprezece"] = 19;
  115.     numar["zeci"] = 10;
  116.     numar["sute"] = 100;
  117.     numar["suta"] = 100;
  118.     numar["mii"] = 1000;
  119.     numar["mie"] = 1000;
  120.     numar["milion"] = 1000000;
  121.     numar["milioane"] = 1000000;
  122. }
  123.  
  124. void insereaza_cifra(int cifra, int &poz) {
  125.     S[poz++] = cifra + '0';
  126. }
  127.  
  128. void insereaza__numar(int nr, int &poz) {
  129.     int uc, temp[10], j = -1;
  130.     while (nr > 0) {
  131.         uc = nr % 10;
  132.         temp[++j] = uc;
  133.         nr /= 10;
  134.     }
  135.     while (j >= 0) {
  136.         cout << temp[j];
  137.         insereaza_cifra(temp[j], poz);
  138.         j--;
  139.     }
  140. }
  141.  
  142. void insereaza_operator(char *sir, int &poz) {
  143.     if (strstr("inmultitprodusul", sir) != nullptr)
  144.         S[poz++] = '*';
  145.     if (strstr("impartitimpartirii", sir) != nullptr)
  146.         S[poz++] = '/';
  147.     if (strstr("adunatplussuma", sir) != nullptr)
  148.         S[poz++] = '+';
  149.     if (strstr("diferentascazutminus", sir) != nullptr)
  150.         S[poz++] = '-';
  151.     if (strstr(sir, "(") != nullptr)
  152.         S[poz++] = '(';
  153.     if (strstr(sir, ")") != nullptr)
  154.         S[poz++] = ')';
  155.     cout << S[poz - 1];
  156. }
  157.  
  158. void citire() {
  159.     cin.getline(c, NMAX);
  160. }
  161.  
  162. void convertor_expresie_matematica() {
  163.     int Suma = 0, cnt = 0, mult = 0, poz = 0;
  164.     char *sir;
  165.     bool ramas = false;
  166.     sir = strtok(c, " ?,.");
  167.     while (sir) {
  168.         if (este_operator(sir) || este_paranteza(sir)) {
  169.             /*if (!este_paranteza(sir)) {
  170.                 if (ramas)
  171.                     Suma += mult;
  172.                 insereaza__numar(Suma, poz);
  173.                 Suma = 0;
  174.                 cnt = 0;
  175.             }
  176.              */
  177.             if (Suma != 0 || ramas) {
  178.                 if (ramas)
  179.                     Suma += mult;
  180.                 insereaza__numar(Suma, poz);
  181.                 Suma = 0;
  182.                 ramas = false;
  183.                 cnt = 0;
  184.  
  185.             }
  186.             insereaza_operator(sir, poz);
  187.         } else {
  188.             if (este_util(sir)) {
  189.                 if (cnt % 2 == 0) {
  190.                     ramas = true;
  191.                     mult = numar[sir];
  192.                 } else {
  193.                     ramas = false;
  194.                     Suma += mult * numar[sir];
  195.                 }
  196.                 cnt++;
  197.             }
  198.         }
  199.         sir = strtok(nullptr, " .?,");
  200.     }
  201.     if (Suma != 0 || ramas) {
  202.         if (ramas)
  203.             Suma += mult;
  204.         insereaza__numar(Suma, poz);
  205.     }
  206. }
  207.  
  208. int main() {
  209.     init();
  210.     citire();
  211.     convertor_expresie_matematica();
  212.     cout << '\n';
  213.     cout << eval();
  214.     return 0;
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement