DilyaraL

Семестровая1

Oct 21st, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.84 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <fstream>
  4. #include <cstringt.h>
  5.  
  6. using namespace std;
  7.  
  8. const int m = 3;
  9.  
  10. struct node
  11. {
  12. char info;
  13. node * next;
  14. };
  15. void setNull(node * & p)
  16. {
  17. p = NULL;
  18. }
  19. void createElem(node * & p, char y)
  20. {
  21. p = new node;
  22. p->info = y;
  23. p->next = NULL;
  24. }
  25. void setHead(node * head1, node * & p)
  26. {
  27. p = head1;
  28. }
  29. bool nodeIsNull(node * p)
  30. {
  31. return p == NULL;
  32. }
  33. void showNode(node * p)
  34. {
  35. cout << p->info;
  36. }
  37. void moove(node * & p)
  38. {
  39. p = p->next;
  40. }
  41. void createListFromFile(node * & head1, ifstream & f)
  42. {
  43. node * q;
  44. char x;
  45. head1 = new node;
  46. setNull(head1->next);
  47. node* tail = head1;
  48. while (f.get(x))
  49. {
  50. createElem(q, x);
  51. tail->next = q;
  52. tail = q;
  53. }
  54. q = head1;
  55. moove(head1);
  56. delete q;
  57. f.close();
  58. }
  59.  
  60. void showList(node * head)
  61. {
  62. node * q;
  63. setHead(head, q);
  64. while (!nodeIsNull(q))
  65. {
  66. showNode(q);
  67. moove(q);
  68. }
  69. cout << endl;
  70. }
  71.  
  72. int comp(node* head)
  73. {
  74. node* p;
  75. setHead(head, p);
  76. int q = 0, l = 0, w = 0, kidenf = 0;// состояние. место в списке.длина индиф. колво после =.
  77. if (!nodeIsNull(p))
  78. {
  79. while (!nodeIsNull(p))
  80. {
  81. switch (q)
  82. {
  83. case 0:l++; if (p->info >= 'A'&&p->info <= 'Z')
  84. {
  85. w++;// проверяем, что иднификатор не больше указанного значения
  86. q = 1;
  87. }
  88. else
  89. {
  90. cout << "Ошибка в месте: " << l << " индификатор не может начинается с данного символа " << p->info << endl;
  91. q = 10;
  92. }
  93. break;
  94. case 1: l++; if (p->info >= 'A'&&p->info <= 'Z' || p->info >= '0'&& p->info <= '9')
  95. {
  96. w++;
  97. if (w > m)
  98. {
  99. cout << "Ошибка в месте: " << l << " индификатор недопустимой длины" << endl;
  100. q = 10;
  101. }
  102. else q = 1;
  103. }
  104. else if (p->info == ':') { w = 0; q = 2; }
  105. else {
  106. cout << "Ошибка в месте: " << l << " после иднификатора должно идти : " << endl;
  107. q = 10;
  108. }
  109. break;
  110. case 2:l++;
  111. if (p->info == '=')q = 3;
  112. else {
  113. cout << "Ошибка в месте: " << l << " после : должно идти = " << endl;
  114. q = 10;
  115. }
  116. break;
  117. case 3: l++;
  118. if (p->info == '0' || p->info == '1') q = 5;
  119. else
  120. if (p->info >= 'A'&&p->info <= 'Z')
  121. {
  122. w++;// проверяем, что иднификатор не больше указанного значения
  123. q = 4;
  124. }
  125. else {
  126. cout << "Ошибка в месте: " << l << " недопустимый ввод " << p->info << endl;
  127. q = 10;
  128. }
  129. break;
  130. case 4: l++;
  131. if (p->info >= 'A'&&p->info <= 'Z' || p->info >= '0'&& p->info <= '9')
  132. {
  133. w++;
  134. if (w > m)
  135. {
  136. cout << "Ошибка в месте: " << l << " индификатор недопустимой длины " << p->info << endl;
  137. q = 10;
  138. }
  139. else q = 4;
  140. }
  141. else {
  142. w = 0;
  143. if (p->info == '+' || p->info == '&' || p->info == '%' || p->info == '>' || p->info == '*')
  144. {
  145. kidenf++;
  146. if (kidenf > 1)
  147. {
  148. q = 10;
  149. cout << "Ошибка в месте: " << l << " недопустимое количество переменных " << endl;
  150. }
  151. else
  152. {
  153. q = 3;
  154. }
  155. }
  156. else if (p->info == ';') {
  157. q = 0; kidenf = 0;
  158. }
  159. else {
  160. cout << "Ошибка в месте: " << l << " недопустимый ввод " << p->info << endl;
  161. q = 10;
  162. }
  163. }
  164. break;
  165. case 5:l++;
  166. if (p->info == '0' || p->info == '1') q = 5;
  167. else {
  168. if (p->info == '+' || p->info == '&' || p->info == '%' || p->info == '>' || p->info == '*')
  169. {
  170. kidenf++;
  171. if (kidenf > 1)
  172. {
  173. q = 10;
  174. cout << "Ошибка в месте: " << l << " недопустимое количество переменных " << endl;
  175. }
  176. else
  177. {
  178. q = 3;
  179. }
  180. }
  181. else if (p->info == ';') {
  182. q = 0; kidenf = 0;
  183. }
  184. else {
  185. cout << "Ошибка в месте: " << l << " недопустимый ввод " << p->info << endl;
  186. q = 10;
  187. }
  188. }
  189. break;
  190. case 10:break;
  191.  
  192. }
  193. moove(p);
  194. }
  195. return q;
  196. }
  197. else
  198. {
  199. cout << "Список пустой" << endl;
  200. return -1;
  201. }
  202.  
  203. }
  204.  
  205. struct L
  206. {
  207. char name[m+1];
  208. char info1[9];
  209. char oper[2];
  210. char info2[9];
  211. L * next;
  212. };
  213.  
  214. void copy(node* head, L * &head1)
  215. {
  216. node* p;
  217. L *q;
  218. head1 = new L;
  219. head1->next=NULL;
  220. L* tail = head1;;
  221. int i = 0;
  222. setHead(head, p);
  223. while (!nodeIsNull(p))
  224. {
  225. q = new L;
  226. if (p->info >= 'A'&&p->info <= 'Z')
  227. {
  228. i = 0;
  229. while (p->info != ':')
  230. {
  231. q->name[i] = p->info;
  232. i++;
  233. moove(p);
  234. }
  235. q->name[i] = '\0';
  236. }
  237. moove(p);
  238. moove(p);
  239. int j = 0;
  240. while (p->info != '+' && p->info != '&' && p->info != '%' && p->info != '>' && p->info != '*'&& p->info != ';')
  241. {
  242. q->info1[j] = p->info;
  243. j++;
  244. moove(p);
  245. }
  246. q->info1[j] = '\0';
  247.  
  248. if (p->info != ';')
  249. {
  250. j = 0;
  251. q->oper[0] = p->info;
  252. q->oper[1] = '\0';
  253. moove(p);
  254. while (p->info != ';')
  255. {
  256. q->info2[j] = p->info;
  257. j++;
  258. moove(p);
  259. }
  260. q->info2[j] = '\0';
  261. }
  262. else
  263. {
  264. q->oper[0] = '\0';
  265. q->info2[0] = '\0';
  266. }
  267.  
  268. if(!nodeIsNull(p))
  269. moove(p);
  270. q->next = NULL;
  271. tail->next = q;
  272. tail = q;
  273. }
  274. q = head1;
  275. head1=head1->next;
  276. delete q;
  277. }
  278.  
  279. void showL(L*head1)
  280. {
  281. L *q = head1;
  282. while (q)
  283. {
  284. for (int i = 0; i < m&&q->name[i]!='\0'; i++)
  285. {
  286. cout << q->name[i];
  287. }
  288. cout << '=';
  289. for (int i = 0; i < 9 && q->info1[i] != '\0'; i++)
  290. {
  291. cout << q->info1[i];
  292. }
  293. cout << q->oper[0];
  294. for (int i = 0; i < 9 && q->info2[i] != '\0'; i++)
  295. {
  296. cout << q->info2[i];
  297. }
  298. cout << endl;
  299. q = q->next;
  300. }
  301. }
  302.  
  303. void Del(L* &temp, L*& q, L*& head1)
  304. {
  305. if (q != head1)
  306. {
  307. L*p = q;
  308. q = q->next;
  309. temp->next = q;
  310. delete p;
  311. }
  312. else
  313. {
  314. L*p = head1;
  315. head1 = head1->next;
  316. delete p;
  317. }
  318. }
  319.  
  320. void movearray(char *p, char* q)// из первого во второй
  321. {
  322. for (int i = 0; i < 9; i++)
  323. q[i] = p[i];
  324. }
  325.  
  326. void plusk(char *p, char *q)//+
  327. {
  328. for (int i = 0; i < 8; i++)
  329. {
  330. if (p[i] == '0'&&q[i] == '1')
  331. p[i] = '1';
  332. }
  333. }
  334.  
  335. void mult(char *p, char *q)//&
  336. {
  337. for (int i = 0; i < 8; i++)
  338. {
  339. if (p[i] == '1'&&q[i] == '1')
  340. p[i] = '1';
  341. else
  342. p[i] = '0';
  343. }
  344. }
  345.  
  346. void mod2(char *p, char *q)//%
  347. {
  348. for (int i = 0; i < 8; i++)
  349. {
  350. if (p[i] == q[i])
  351. p[i] = '0';
  352. else
  353. p[i] = '1';
  354. }
  355. }
  356.  
  357. void imp(char *p, char *q)//>
  358. {
  359. for (int i = 0; i < 8; i++)
  360. {
  361. if (p[i] == '1'&&q[i] == '0')
  362. p[i] = '0';
  363. else
  364. p[i] = '1';
  365. }
  366. }
  367.  
  368. void shef(char *p, char *q)///*
  369. {
  370. for (int i = 0; i < 8; i++)
  371. {
  372. if (p[i] == '1'&&q[i] == '1')
  373. p[i] = '0';
  374. else
  375. p[i] = '1';
  376. }
  377.  
  378. }
  379.  
  380. void operation(L* q)
  381. {
  382. if (q->oper[0] != '\0')
  383. {
  384. if (q->oper[0] == '+')
  385. plusk(q->info1, q->info2);
  386. else
  387. if (q->oper[0] == '&')
  388. mult(q->info1, q->info2);
  389. else
  390. if (q->oper[0] == '%')
  391. mod2(q->info1, q->info2);
  392. else
  393. if (q->oper[0] == '>')
  394. imp(q->info1, q->info2);
  395. else
  396. if (q->oper[0] == '*')
  397. shef(q->info1, q->info2);
  398. q->info2[0] = '\0';
  399. q->oper[0] = '\0';
  400. }
  401. }
  402.  
  403. bool par(char *p, char *q)
  404. {
  405. bool t=true;
  406. for (int i = 0; i < m&&t; i++)
  407. {
  408. if (p[i] != q[i])
  409. t = false;
  410. }
  411. return t;
  412. }
  413.  
  414. void Do(L *&head1)
  415. {
  416. L *q = head1;
  417. L*p, * temp;
  418. char x;
  419. while (q)
  420. {
  421. p = head1;
  422. temp = p;
  423. while (!par(p->name, q->name) &&p != q)///проверяем есть ли до этого переменная с таким же именем
  424. {
  425. temp = p;
  426. p = p->next;
  427. }
  428. if (p != q)//если есть удаляем
  429. {
  430. Del(temp, p, head1);
  431. }
  432. if (q->oper[0] != '\0')
  433. {
  434. if (q->info1[0] >= 'A'&&q->info1[0] <= 'Z')///если после = переменная находим ее значение
  435. {
  436. p = head1;
  437. while (!par(p->name, q->info1))
  438. {
  439. p = p->next;
  440. }
  441. movearray(p->info1, q->info1);
  442. }
  443. if (q->info2[0] >= 'A'&&q->info2[0] <= 'Z')// если после знака переменная вновь находим ее значение
  444. {
  445. p = head1;
  446. while (!par(p->name, q->info2))
  447. {
  448. p = p->next;
  449. }
  450. movearray(p->info1, q->info2);
  451. }
  452. operation(q);
  453. }
  454. q = q->next;
  455. }
  456. }
  457.  
  458. int main()
  459. {
  460. setlocale(LC_ALL, "Russian");
  461. ifstream f("Text.txt");
  462. node * head;
  463. createListFromFile(head, f);
  464. //showList(head);
  465. if (comp(head) == 0)
  466. {
  467. L* head1;
  468. copy(head, head1);
  469. //showL(head1);
  470. Do(head1);
  471. showL(head1);
  472. }
  473.  
  474. system("pause");
  475. return 0;
  476. }
Advertisement
Add Comment
Please, Sign In to add comment