Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.34 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement