Advertisement
palenda21

Lab16A/B

May 25th, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.65 KB | None | 0 0
  1. #include<iostream>
  2. #include<math.h>
  3. using namespace std;
  4.  
  5. struct stack
  6. {
  7.     int data;
  8.     stack* next;
  9. };
  10.  
  11. stack *add(stack* &top, int element)
  12. {
  13.     stack* q = new stack();
  14.     q->data = element;
  15.     q->next = top;
  16.     top = q;
  17.  
  18.     return q;
  19. }
  20.  
  21. stack* read_stack(stack*& top, int& data)
  22. {
  23.     stack *q = top;
  24.     data = top->data;
  25.     top = top->next;
  26.     delete q;
  27.     return top;
  28. }
  29.  
  30. int priority(char ch)
  31. {
  32.     switch (ch)
  33.     {
  34.     case '(': case ')': return 0;
  35.     case '+': case '-': return 1;
  36.     case '*': case '/': return 2;
  37.     case '^': return 3;
  38.     default: return -1;
  39.     }
  40. }
  41.  
  42. void PostFix(char* str_in, char* str_out)
  43. {
  44.     stack* top = NULL;
  45.     int k = 0;
  46.     int data;
  47.     for (int i = 0; i < strlen(str_in); i++)
  48.     {
  49.         if (str_in[i] > 'A' && str_in[i]!='^')
  50.             // ^ - в таблице ascii дальше чем алфавит A-Z
  51.         {
  52.             str_out[k++] = str_in[i];
  53.             continue;
  54.         }
  55.  
  56.         if (top == NULL || str_in[i] == '(')
  57.         {
  58.             add(top, str_in[i]);
  59.             continue;
  60.         }
  61.  
  62.         if (str_in[i] == ')')
  63.         {
  64.             while (top->data != '(')
  65.             {
  66.                 read_stack(top, data);
  67.                 str_out[k++] = data;
  68.             }
  69.             read_stack(top, data);//удаляем '('
  70.             continue;
  71.         }
  72.        
  73.         while (top != NULL && priority(str_in[i]) <= priority(top->data))
  74.         {
  75.             read_stack(top, data);
  76.             str_out[k++] = data;
  77.        
  78.         }
  79.         add(top, str_in[i]);
  80.     }
  81.  
  82.     while (top != NULL)
  83.     {
  84.         top = read_stack(top, data);
  85.         str_out[k++] = data;
  86.        
  87.     }
  88.     str_out[k] = '\0';
  89. }
  90.  
  91. int result(char* str_out,int *mass)
  92. {
  93.     stack* top = NULL;
  94.     int k = 0;
  95.     int data;
  96.     int inf1;
  97.     int inf2;
  98.     for (int i = 0; i < strlen(str_out); i++)
  99.     {
  100.         if (str_out[i] > 'A' && str_out[i]!='^')
  101.         {
  102.             add(top, mass[str_out[i]]);
  103.             continue;
  104.         }
  105.         //если знак операции
  106.         read_stack(top, inf2);
  107.         read_stack(top, inf1);
  108.         switch (str_out[i])
  109.         {
  110.         case '+': add(top, inf1 + inf2); break;
  111.         case '-': add(top, inf1 - inf2); break;
  112.         case '*': add(top, inf1 * inf2); break;
  113.         case '/':
  114.             if (inf2 == 0)
  115.             {
  116.                 cout << "деление на ноль" << endl;
  117.                 system("pause");
  118.                 return 1;
  119.             }
  120.             add(top, inf1 / inf2); break;
  121.         case '^': add(top, pow(inf1, inf2)); break;
  122.         }
  123.            
  124.        
  125.     }
  126.     read_stack(top, data); //вывод ответа/что осталось в стеке
  127.     return data;
  128.    
  129. }
  130.  
  131. int errors(char* str)
  132. {
  133.     stack* top = NULL;
  134.     stack* q;
  135.     if (strlen(str) == 1)
  136.     {
  137.         cout << "ввел один символ" << endl;
  138.         return 0;
  139.     }
  140.     if (isalpha(str[0]) || str[0] == '(')
  141.     {
  142.         for (unsigned int i = 0; i < strlen(str); i++)
  143.         {
  144.             if (!isalpha(str[i]) && str[i] != '(' && str[i] != ')' && str[i] != '*' && str[i] != '-' && str[i] != '+' && str[i] != '^' && str[i] != '/')
  145.             {
  146.                 cout << "введенный символ не является латиницей или знаками операций." << endl;
  147.                 return -1;
  148.             }
  149.             if (str[i] == '(')
  150.             {
  151.                 top = add(top, str[i]);
  152.                 continue;
  153.             }
  154.             if (isalpha(str[i]) && str[i + 1] == '(')
  155.             {
  156.                 cout << "за переменной не последовал знак вычисления" << endl;
  157.                 return -1;
  158.             }
  159.             if ((str[i] == '*' || str[i] == '-' || str[i] == '+' || str[i] == '^' || str[i] == '/' || str[i] == '(') && !isalpha(str[i + 1]) && str[i + 1] != '(')
  160.                 // ошибка, если после ( сразу идет знак операции
  161.             {
  162.                 cout << "после знака операции последовало что-то странное" << endl;
  163.                 return -1;
  164.             }
  165.             if (str[i] == ')')
  166.             {
  167.                 if (isalpha(str[i + 1]) || top == NULL)
  168.                 {
  169.                     cout << "стек пуст или после скобочки ты ввел переменную или колво открытых не соотвутсвует колву закрытых скобочек" << endl;
  170.                     return -1;
  171.                 }
  172.                 q = top;
  173.                 top = top->next;
  174.                 delete q;
  175.                 continue;
  176.             }
  177.             if (isalpha(str[i]) && isalpha(str[i + 1]))
  178.             {
  179.                 cout << "за переменной следовала переменная" << endl;
  180.                 return -1;
  181.             }
  182.             if (isdigit(str[i]))
  183.             {
  184.                 cout << "введена цифра а не символ" << endl;
  185.                 return -1;
  186.             }
  187.         }
  188.         if (top != NULL)
  189.         {
  190.             while (top != NULL)
  191.             {
  192.                 q = top;
  193.                 top = top->next;
  194.                 delete q;
  195.             }
  196.             cout << "стек не пуст, мб кол-во скобочек нарушено" << endl;
  197.             return -1;
  198.         }
  199.     }
  200.     else
  201.     {
  202.         cout << "первый символ знак операции или число" << endl;
  203.         return -1;
  204.     }
  205.     return 1;
  206. }
  207.  
  208. void vvod(char* str, int* mass)
  209. {
  210.     double m[50];
  211.     int n = 0, k = 0;
  212.     for (int i = 0; i < strlen(str); i++)
  213.     {
  214.         n = 0;
  215.         for (int j = 0; j < k; j++)
  216.             if (m[j] ==(str[i]))  // счетчик повторено вводимых
  217.                 n++;
  218.  
  219.         if (isalpha(str[i])  && n == 0) // если повторений нет выполняем ввод
  220.         {
  221.             cout << "ведите значение для переменной " << str[i] << " = ";
  222.             cin >> mass[(str[i])];
  223.             m[k] = (str[i]);
  224.             k++;
  225.         }
  226.     }
  227. }
  228.  
  229. int main()
  230. {
  231.     setlocale(LC_ALL, "ru");
  232.     char str_in[20];
  233.     cout << " Vvedite viragenie " << endl;
  234.     cin.getline(str_in, 20);
  235.     char str_out[20];
  236.  
  237.     int mass[150];
  238.    
  239.     if (errors(str_in) == 1)
  240.     {
  241.         vvod(str_in, mass);
  242.         PostFix(str_in, str_out);
  243.         cout << "Post_form:" << str_out;
  244.         cout << endl << "Result " << result(str_out, mass);
  245.     }
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement