SHARE
TWEET

Untitled

a guest May 22nd, 2019 109 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <locale.h>
  4. #include <conio.h>
  5. #include <stdlib.h>
  6. #include "ctime"
  7. #include "string.h"
  8. #include "ctype.h"
  9. using namespace std;
  10. struct Tree
  11. {
  12.     char sym[10];
  13.     Tree *Left;
  14.     Tree *Right;
  15. };
  16.  
  17. int Priority(char c)
  18. {
  19.     switch (c)
  20.     {
  21.     case '+':
  22.     case '-':
  23.         return 1;
  24.     case '*':
  25.     case '/':
  26.         return 2;
  27.     }
  28.     return 100;
  29. }
  30. Tree *CreateTree(char **str, int first, int last)
  31. {
  32.  
  33.     Tree *elka;
  34.     char c;
  35.     int skobka = 0, minPrt = 100, prt, k = first;
  36.     for (int i = first; i < last; i++)
  37.     {
  38.         c = str[i][0];
  39.         if (isdigit(c) == 0)
  40.         {
  41.             if (c == '(')
  42.                 skobka++;
  43.             if (c == ')')
  44.                 skobka--;
  45.             if (skobka == 0)
  46.             {
  47.                 prt = Priority(c);
  48.                 if (prt <= minPrt)
  49.                 {
  50.                     minPrt = prt;
  51.                     k = i;
  52.                 }
  53.             }
  54.         }
  55.     }
  56.         if ((minPrt==100)&&(str[first][0] == '(') && (str[last][0] == ')'))
  57.         return CreateTree(str, first + 1, last - 1);
  58.     elka = new Tree;
  59.     strcpy(elka->sym, str[k]);
  60.     bool key = false;
  61.     for (int i = first; i < last; i++)
  62.         if (strchr("+/-*()", str[i][0]) != NULL)
  63.             key = true;
  64.     if (key == true)
  65.     {
  66.         elka->Left = CreateTree(str, first, k - 1);
  67.         elka->Right = CreateTree(str, k + 1, last);
  68.     }
  69.     else
  70.     {
  71.         elka->Left = NULL;
  72.         elka->Right = NULL;
  73.     }
  74.     return elka;
  75. }
  76. void viv(Tree *a, int level)
  77. {
  78.     if (a != NULL)
  79.     {
  80.         viv(a->Left, level + 1);
  81.         for (int i = 0; i < level; i++)
  82.             printf("   ");
  83.         puts(a->sym);
  84.         viv(a->Right, level + 1);
  85.     }
  86. }
  87. char *vvod()
  88. {
  89.     int n;
  90.     bool key;
  91.     char *primer;
  92.     do
  93.     {
  94.         primer = new char[100];
  95.         puts("Введите пример");
  96.         gets(primer);
  97.         n = 0;
  98.         for (int i = 0; i < strlen(primer); i++)
  99.         {
  100.             key = true;
  101.             if (primer[i] == '(')
  102.                 n++;
  103.             if (primer[i] == ')')
  104.                 n--;
  105.             if (((primer[i] == '/') || (primer[i] == '*')) && ((i == 0) || (primer[i - 1] == '(')))
  106.             {
  107.                 puts("Операции * и / не могут быть унарными");
  108.                 key = false;
  109.             }
  110.             if (strchr("1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM+-*/()", primer[i]) == NULL)
  111.             {
  112.                 puts("Недопустимые символы");
  113.                 key = false;
  114.             }
  115.             if (((primer[i] == '/') || (primer[i] == '*') || (primer[i] == '+') || (primer[i] == '-')) && (primer[i + 1] == ')'))
  116.             {
  117.                 puts("после операции должно быть число или переменная");
  118.                 key = false;
  119.             }
  120.             if (n < 0)
  121.             {
  122.                 puts("неправильно проставленны скобки");
  123.                 key = false;
  124.             }
  125.             if ((primer[i + 1] == '(') && (strchr("QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890", primer[i])))
  126.             {
  127.                 puts("забыт знак перед скобками");
  128.                 key = false;
  129.             }
  130.         }
  131.     } while ((n != 0) || (key == false));
  132.     printf("Вы ввели: %s\n", primer);
  133.     if (primer[0] == '-')
  134.     {
  135.         for (int i = strlen(primer) - 1; i >= 0; i--)
  136.             primer[i + 1] = primer[i];
  137.         primer[0] = '0';
  138.     }
  139.     if (primer[0] == '+')
  140.         for (int i = 1; i < strlen(primer) + 1; i++)
  141.             primer[i - 1] = primer[i];
  142.     for (int i = 1; i < strlen(primer); i++)
  143.     {
  144.         if ((primer[i] == '-') && (primer[i - 1] == '('))
  145.         {
  146.             for (int j = strlen(primer); j >= i; j--)
  147.                 primer[j + 1] = primer[j];
  148.             primer[i] = '0';
  149.         }
  150.         if ((primer[i] == '+') && (primer[i - 1] == '('))
  151.  
  152.             for (int j = i + 1; j < strlen(primer) + 1; j++)
  153.                 primer[j - 1] = primer[j];
  154.     }
  155.  
  156.     return primer;
  157. }
  158. char *inttostr(int a)
  159. {
  160.     char s[10];
  161.     int i = 1000, j = 0;
  162.     while (a < i)
  163.         i = i / 10;
  164.     while (a > 0)
  165.     {
  166.         switch (a / i)
  167.         {
  168.         case 0:
  169.             s[j] = '0';
  170.             break;
  171.         case 1:
  172.             s[j] = '1';
  173.             break;
  174.         case 2:
  175.             s[j] = '2';
  176.             break;
  177.         case 3:
  178.             s[j] = '3';
  179.             break;
  180.         case 4:
  181.             s[j] = '4';
  182.             break;
  183.         case 5:
  184.             s[j] = '5';
  185.             break;
  186.         case 6:
  187.             s[j] = '6';
  188.             break;
  189.         case 7:
  190.             s[j] = '7';
  191.             break;
  192.         case 8:
  193.             s[j] = '8';
  194.             break;
  195.         case 9:
  196.             s[j] = '9';
  197.         }
  198.         while (a >= i)
  199.             a -= i;
  200.         i = i / 10;
  201.         j++;
  202.         s[j] = '\0';
  203.     }
  204.     return s;
  205. }
  206. int strtoint(char *a)
  207. {
  208.     int i = 0, j = 0;
  209.     while (a[j] != '\0')
  210.     {
  211.         i *= 10;
  212.         switch (a[j])
  213.         {
  214.         case '0':
  215.             break;
  216.         case '1':
  217.             i += 1;
  218.             break;
  219.         case '2':
  220.             i += 2;
  221.             break;
  222.         case '3':
  223.             i += 3;
  224.             break;
  225.         case '4':
  226.             i += 4;
  227.             break;
  228.         case '5':
  229.             i += 5;
  230.             break;
  231.         case '6':
  232.             i += 6;
  233.             break;
  234.         case '7':
  235.             i += 7;
  236.             break;
  237.         case '8':
  238.             i += 8;
  239.             break;
  240.         case '9':
  241.             i += 9;
  242.         }
  243.         j++;
  244.     }
  245.     return i;
  246. }
  247. float calc(Tree *a)
  248. {
  249.     float l, r;
  250.     if (((a->Left)->sym[0] == '+') || ((a->Left)->sym[0] == '-') || ((a->Left)->sym[0] == '*') || ((a->Left)->sym[0] == '/'))
  251.         l = calc(a->Left);
  252.     else
  253.         l = strtoint((a->Left)->sym);
  254.     if (((a->Right)->sym[0] == '+') || ((a->Right)->sym[0] == '-') || ((a->Right)->sym[0] == '*') || ((a->Right)->sym[0] == '/'))
  255.         r = calc(a->Right);
  256.     else
  257.         r = strtoint((a->Right)->sym);
  258.     switch (a->sym[0])
  259.     {
  260.     case '+':
  261.         return l + r;
  262.     case '-':
  263.         return l - r;
  264.     case '*':
  265.         return l * r;
  266.     case '/':
  267.         return l * 1.0 / r;
  268.     }
  269. }
  270. int main()
  271. {
  272.     srand(time(NULL));
  273.     setlocale(0, "russian");
  274.     char *primer, **str;
  275.     int n;
  276.     bool key;
  277.     puts("введите 1 для ввода примера или 2 для использования готового:(3/f-7)*(4-2*(8*g+5))");
  278.     scanf("%d",&n);
  279.     getch();
  280.     if (n==1)
  281.     {
  282.     primer = new char[100];
  283.     strcpy(primer, vvod());
  284.     }
  285.     else
  286.     primer="(3/f-7)*(4-2*(8*g+5))";
  287.     n = 0;
  288.     for (int j = 0; j < strlen(primer); j++)
  289.     {
  290.         n++;
  291.         if (strchr("1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM", primer[j]) != NULL)
  292.             while (strchr("1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM", primer[j + 1]) != NULL)
  293.                 j++;
  294.     }
  295.  
  296.     str = new char *[n];
  297.     for (int i = 0; i < n; i++)
  298.         str[i] = new char[10];
  299.     char *sim;
  300.     int j = 0;
  301.     int l;
  302.     for (int i = 0; i < n; i++)
  303.     {
  304.         if ((primer[j] == '+') || (primer[j] == '-') || (primer[j] == '*') || (primer[j] == '/') || (primer[j] == '(') || (primer[j] == ')'))
  305.         {
  306.             str[i][0] = primer[j];
  307.             j++;
  308.         }
  309.         else
  310.         {
  311.             sim = new char[10];
  312.  
  313.             l = 0;
  314.             while ((primer[j] != '+') && (primer[j] != '-') && (primer[j] != '*') && (primer[j] != '/') && (primer[j] != '(') && (primer[j] != ')') && (primer[j] != '\0'))
  315.             {
  316.                 sim[l] = primer[j];
  317.                 l++;
  318.                 j++;
  319.             }
  320.             sim[l] = '\0';
  321.             strcpy(str[i], sim);
  322.         }
  323.     }
  324.     int s;
  325.     for (int i = 0; i < n; i++)
  326.     {
  327.         key = true;
  328.         for (j = 0; j < strlen(str[i]); j++)
  329.             if (strchr("QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm", str[i][j]) != NULL)
  330.                 key = false;
  331.         if (key == false)
  332.         {
  333.             sim = new char[10];
  334.             printf("Введите значение переменной %s(любой другой символ - для задания случайно)", str[i]);
  335.             gets(sim);
  336.             key = true;
  337.             for (j = 0; j < strlen(sim); j++)
  338.                 if (strchr("QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm", sim[j]) != NULL)
  339.                     key = false;
  340.             if (key == false)
  341.                 sim = inttostr(rand() % 1000);
  342.             for (j = i + 1; j < n; j++)
  343.             {
  344.                 if (strcmp(str[i], str[j]) == 0)
  345.                     strcpy(str[j], sim);
  346.             }
  347.             strcpy(str[i], sim);
  348.         }
  349.     }
  350.     printf("Вы ввели(с учетом обработки):");
  351.     for (int i = 0; i < n; i++)
  352.         printf("%s", str[i]);
  353.     puts("");
  354.     Tree *head = CreateTree(str, 0, n - 1);
  355.     puts("Бинарное дерево:");
  356.     viv(head, 0);
  357.     printf("Ответ: %f", calc(head));
  358.     getch();
  359.     return 0;
  360. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top