Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <fstream>
- #include <cstringt.h>
- using namespace std;
- const int m = 3;
- struct node
- {
- char info;
- node * next;
- };
- void setNull(node * & p)
- {
- p = NULL;
- }
- void createElem(node * & p, char y)
- {
- p = new node;
- p->info = y;
- p->next = NULL;
- }
- void setHead(node * head1, node * & p)
- {
- p = head1;
- }
- bool nodeIsNull(node * p)
- {
- return p == NULL;
- }
- void showNode(node * p)
- {
- cout << p->info;
- }
- void moove(node * & p)
- {
- p = p->next;
- }
- void createListFromFile(node * & head1, ifstream & f)
- {
- node * q;
- char x;
- head1 = new node;
- setNull(head1->next);
- node* tail = head1;
- while (f.get(x)&&x!=' ')
- {
- createElem(q, x);
- tail->next = q;
- tail = q;
- }
- q = head1;
- moove(head1);
- delete q;
- f.close();
- }
- void showList(node * head)
- {
- node * q;
- setHead(head, q);
- while (!nodeIsNull(q))
- {
- showNode(q);
- moove(q);
- }
- cout << endl;
- }
- int First(node* head)
- {
- node* p;
- setHead(head, p);
- int q = 0, l = 0, w = 0, kidenf = 0;// состояние. место в списке.длина индиф. колво после =.
- if (!nodeIsNull(p))
- {
- while (!nodeIsNull(p))
- {
- switch (q)
- {
- case 0:l++; if (p->info >= 'A'&&p->info <= 'Z')
- {
- w++;// проверяем, что идентификатор не больше указанного значения
- q = 1;
- }
- else
- {
- cout << "Ошибка в месте: " << l << " индификатор не может начинается с данного символа " << p->info << endl;
- q = 10;
- }
- break;
- case 1: l++; if (p->info >= 'A'&&p->info <= 'Z' || p->info >= '0'&& p->info <= '9')
- {
- w++;
- if (w > m)
- {
- cout << "Ошибка в месте: " << l << " индификатор недопустимой длины" << endl;
- q = 10;
- }
- else q = 1;
- }
- else if (p->info == ':') { w = 0; q = 2; }
- else {
- cout << "Ошибка в месте: " << l << " после иднификатора должно идти : " << endl;
- q = 10;
- }
- break;
- case 2:l++;
- if (p->info == '=')q = 3;
- else {
- cout << "Ошибка в месте: " << l << " после : должно идти = " << endl;
- q = 10;
- }
- break;
- case 3: l++;
- if (p->info == '0' || p->info == '1') q = 5;
- else
- if (p->info >= 'A'&&p->info <= 'Z')
- {
- w++;// проверяем, что иднификатор не больше указанного значения
- q = 4;
- }
- else {
- cout << "Ошибка в месте: " << l << " недопустимый ввод " << p->info << endl;
- q = 10;
- }
- break;
- case 4: l++;
- if (p->info >= 'A'&&p->info <= 'Z' || p->info >= '0'&& p->info <= '9')
- {
- w++;
- if (w > m)
- {
- cout << "Ошибка в месте: " << l << " индификатор недопустимой длины " << p->info << endl;
- q = 10;
- }
- else q = 4;
- }
- else {
- w = 0;
- if (p->info == '+' || p->info == '&' || p->info == '%' || p->info == '>' || p->info == '*')
- {
- kidenf++;
- if (kidenf > 1)
- {
- q = 10;
- cout << "Ошибка в месте: " << l << " недопустимое количество переменных " << endl;
- }
- else
- {
- q = 3;
- }
- }
- else if (p->info == ';') {
- q = 0; kidenf = 0;
- }
- else {
- cout << "Ошибка в месте: " << l << " недопустимый ввод " << p->info << endl;
- q = 10;
- }
- }
- break;
- case 5:l++;
- if (p->info == '0' || p->info == '1') q = 5;
- else {
- if (p->info == '+' || p->info == '&' || p->info == '%' || p->info == '>' || p->info == '*')
- {
- kidenf++;
- if (kidenf > 1)
- {
- q = 10;
- cout << "Ошибка в месте: " << l << " недопустимое количество переменных " << endl;
- }
- else
- {
- q = 3;
- }
- }
- else if (p->info == ';') {
- q = 0; kidenf = 0;
- }
- else {
- cout << "Ошибка в месте: " << l << " недопустимый ввод " << p->info << endl;
- q = 10;
- }
- }
- break;
- case 10:break;
- }
- moove(p);
- }
- return q;
- }
- else
- {
- cout << "Список пустой" << endl;
- return -1;
- }
- }
- struct L
- {
- char name[m+1];
- char info1[9];
- char oper[2];
- char info2[9];
- L * next;
- };
- void copy(node* head, L * &head1)
- {
- node* p;
- L *q;
- head1 = new L;
- head1->next=NULL;
- L* tail = head1;;
- int i = 0;
- setHead(head, p);
- while (!nodeIsNull(p))
- {
- q = new L;
- if (p->info >= 'A'&&p->info <= 'Z')
- {
- i = 0;
- while (p->info != ':')
- {
- q->name[i] = p->info;
- i++;
- moove(p);
- }
- q->name[i] = '\0';
- }
- moove(p);
- moove(p);
- int j = 0;
- while (p->info != '+' && p->info != '&' && p->info != '%' && p->info != '>' && p->info != '*'&& p->info != ';')
- {
- q->info1[j] = p->info;
- j++;
- moove(p);
- }
- q->info1[j] = '\0';
- if (p->info != ';')
- {
- j = 0;
- q->oper[0] = p->info;
- q->oper[1] = '\0';
- moove(p);
- while (p->info != ';')
- {
- q->info2[j] = p->info;
- j++;
- moove(p);
- }
- q->info2[j] = '\0';
- }
- else
- {
- q->oper[0] = '\0';
- q->info2[0] = '\0';
- }
- if(!nodeIsNull(p))
- moove(p);
- q->next = NULL;
- tail->next = q;
- tail = q;
- }
- q = head1;
- head1=head1->next;
- delete q;
- }
- void showL(L*head1)
- {
- L *q = head1;
- while (q)
- {
- for (int i = 0; i < m&&q->name[i]!='\0'; i++)
- {
- cout << q->name[i];
- }
- cout << '=';
- for (int i = 0; i < 9 && q->info1[i] != '\0'; i++)
- {
- cout << q->info1[i];
- }
- cout << q->oper[0];
- for (int i = 0; i < 9 && q->info2[i] != '\0'; i++)
- {
- cout << q->info2[i];
- }
- cout << endl;
- q = q->next;
- }
- }
- void Del(L* &temp, L*& q, L*& head1)
- {
- if (q != head1)
- {
- L*p = q;
- q = q->next;
- temp->next = q;
- delete p;
- }
- else
- {
- L*p = head1;
- head1 = head1->next;
- delete p;
- }
- }
- void movearray(char *p, char* q)// из первого во второй
- {
- for (int i = 0; i < 9; i++)
- q[i] = p[i];
- }
- void plusk(char *p, char *q)//+
- {
- for (int i = 0; i < 8; i++)
- {
- if (p[i] == '0'&&q[i] == '1')
- p[i] = '1';
- }
- }
- void mult(char *p, char *q)//&
- {
- for (int i = 0; i < 8; i++)
- {
- if (p[i] == '1'&&q[i] == '1')
- p[i] = '1';
- else
- p[i] = '0';
- }
- }
- void mod2(char *p, char *q)//%
- {
- for (int i = 0; i < 8; i++)
- {
- if (p[i] == q[i])
- p[i] = '0';
- else
- p[i] = '1';
- }
- }
- void imp(char *p, char *q)//>
- {
- for (int i = 0; i < 8; i++)
- {
- if (p[i] == '1'&&q[i] == '0')
- p[i] = '0';
- else
- p[i] = '1';
- }
- }
- void shef(char *p, char *q)///*
- {
- for (int i = 0; i < 8; i++)
- {
- if (p[i] == '1'&&q[i] == '1')
- p[i] = '0';
- else
- p[i] = '1';
- }
- }
- void operation(L* q)
- {
- if (q->oper[0] != '\0')
- {
- if (q->oper[0] == '+')
- plusk(q->info1, q->info2);
- else
- if (q->oper[0] == '&')
- mult(q->info1, q->info2);
- else
- if (q->oper[0] == '%')
- mod2(q->info1, q->info2);
- else
- if (q->oper[0] == '>')
- imp(q->info1, q->info2);
- else
- if (q->oper[0] == '*')
- shef(q->info1, q->info2);
- q->info2[0] = '\0';
- q->oper[0] = '\0';
- }
- }
- bool par(char *p, char *q)
- {
- bool t=true;
- for (int i = 0; i < m&&t; i++)
- {
- if (p[i] != q[i])
- t = false;
- }
- return t;
- }
- bool findsame(L *head1, char* a, L*q)
- {
- L* p = head1;
- while (p&&!par(p->name, a)&&p!=q)
- {
- p = p->next;
- }
- if (p&&p!=q)
- {
- movearray(p->info1, a);
- return true;
- }
- else
- return false;
- }
- int Do(L *&head1)
- {
- L *q = head1;
- L*p, * temp;
- int M = 1;
- while (q&&M==1)
- {
- p = head1;
- temp = p;
- while (!par(p->name, q->name) &&p != q && M == 1)///проверяем есть ли до этого переменная с таким же именем
- {
- temp = p;
- p = p->next;
- }
- if (p != q)//если есть удаляем
- {
- Del(temp, p, head1);
- }
- if (q->oper[0] != '\0')
- {
- if (q->info1[0] >= 'A'&&q->info1[0] <= 'Z')///если после = переменная находим ее значение
- {
- if (!findsame(head1, q->info1,q))
- {
- cout << q->info1[0] << q->info1[1] << q->info1[2] << " индификатор не определен" << endl;
- M = 0;
- }
- }
- if (q->info2[0] >= 'A'&&q->info2[0] <= 'Z')// если после знака переменная вновь находим ее значение
- {
- if (!findsame(head1, q->info2,q))
- {
- cout << q->info2[0] << q->info2[1] << q->info2[2] << " индификатор не определен" << endl;
- M = 0;
- }
- }
- operation(q);
- }
- q = q->next;
- }
- return M;
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- ifstream f("Text.txt");
- node * head;
- createListFromFile(head, f);
- //showList(head);
- if (First(head) == 0)
- {
- L* head1;
- copy(head, head1);
- //showL(head1);
- if(Do(head1))
- showL(head1);
- }
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment