Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- #include <fstream>
- #include <stdlib.h>
- #include <Windows.h>
- using namespace std;
- string Tape;
- int Carriage=0;
- string Status = "q0"; // стартовое состояние
- ofstream Log("Log.txt");
- struct Rule
- {
- string OldStatus = "";
- string OldValue = "";
- string NewStatus = "";
- string NewValue = "";
- string Move = "";
- };
- vector<Rule> Rules;
- void InputTape()
- {
- string Tmp;
- cout << "Введите файл с которого считывать данные ленты \n";
- getline(cin,Tmp);
- ifstream tape(Tmp);
- getline(tape, Tape);
- getline(tape, Tmp);
- Carriage = atoi(Tmp.c_str());
- tape.close();
- }
- Rule Split(string str)
- {
- Rule Res;
- int pos=0;
- string buf = "";
- for(size_t i = 0; i < str.size(); i++)
- {
- if(str[i] != ';')
- buf +=str[i];
- else if(Res.OldStatus == "")
- {
- Res.OldStatus = buf;
- buf = "";
- }
- else if(Res.OldValue == "")
- {
- Res.OldValue = buf;
- buf = "";
- }
- else if(Res.NewStatus == "")
- {
- Res.NewStatus = buf;
- buf = "";
- }
- else if(Res.NewValue == "")
- {
- Res.NewValue = buf;
- buf = "";
- }
- else if(Res.Move == "")
- {
- Res.Move = buf;
- buf = "";
- }
- }
- return Res;
- }
- void InputProgram()
- {
- string str;
- cout << "Введите файл с которого считывать программу \n";
- getline(cin,str);
- ifstream program(str);
- while(!program.eof())
- {
- getline(program, str);
- Rules.push_back(Split(str));
- }
- }
- bool Run()
- {
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
- for(size_t i = 0; i < Rules.size(); i++)
- if(Rules[i].NewStatus[0] != 'q' || Rules[i].OldStatus[0] != 'q')
- {
- SetConsoleTextAttribute(hConsole, (WORD) ((15 << 4) | 4+8));
- cout << "Строка: " << i << "\n";
- cout << "Ошибка вводва статуса машины, статус должен начинаться с символа q\n";
- Log << "Строка: " << i << "\n";
- Log << "Ошибка вводва статуса машины, статус должен начинаться с символа q\n";
- Log.close();
- return false;
- } else if (Rules[i].OldValue.size() >= 2 || Rules[i].NewValue.size() >= 2)
- {
- SetConsoleTextAttribute(hConsole, (WORD) ((15 << 4) | 4+8));
- cout << "Строка: " << i << "\n";
- cout << "Ошибка ввода значения машины, значение должно быть размером в один символ\n";
- Log << "Строка: " << i << "\n";
- Log << "Ошибка ввода значения машины, значение должно быть размером в один символ\n";
- Log.close();
- return false;
- }
- SetConsoleTextAttribute(hConsole, (WORD) ((15 << 4) | FOREGROUND_GREEN));
- //ofstream cout("output.txt", ios_base::out);
- cout << Tape << " Каретка: " << Carriage << " Статус: " << Status << "\n";
- Log << Tape << " Каретка: " << Carriage << " Статус: " << Status << "\n";
- while(Status != "qF") // пока состояние не qF продолжать работу
- {
- for(size_t i = 0; i < Rules.size(); i++)
- if(Rules[i].OldStatus == Status && Rules[i].OldValue[0] == Tape[Carriage])
- {
- Status = Rules[i].NewStatus;
- Tape[Carriage] = Rules[i].NewValue[0];
- switch (Rules[i].Move[0])
- {
- case 'L':
- Carriage--;
- break;
- case 'R':
- Carriage++;
- break;
- case 'N':
- break;
- }
- SetConsoleTextAttribute(hConsole, (WORD) ((15 << 4) | FOREGROUND_GREEN));
- cout << Tape << " Каретка: " << Carriage << " Статус: " << Status << "\n";
- Log << Tape << " Каретка: " << Carriage << " Статус: " << Status << "\n";
- break;
- }
- else if (i == Rules.size() - 1)
- {
- SetConsoleTextAttribute(hConsole, (WORD) ((15 << 4) | 4+8));
- cout << "Ошибка выполнения. Каретка: " << Carriage << " Статус: " << Status << "\n";
- Log << "Ошибка выполнения. Каретка: " << Carriage << " Статус: " << Status << "\n";
- Log.close();
- return false;
- }
- }
- return true;
- }
- int main()
- {
- setlocale(LC_ALL,"Rus");
- system("color F0");
- //cout.rdbuf(Log.rdbuf());
- cout << "Привет, это программа имитирует работу машины тьюринга, примеры синтаксиса содержатся в файлах HelpTape.txt и HelpInput.txt\n";
- cout << "Вывод работы и ошибок так же ведётся в файл Log.txt\n";
- cout << "Для продолжения введите любой символ и нажмите Enter \n";
- getchar();
- InputTape();
- InputProgram();
- while(!Run())
- {
- cout << "Ошибка, исправьте содержимое файлов tape.txt и program.txt и попробуйте снова \n";
- cout << "Для продолжения введите любой символ и нажмите Enter \n";
- Status = "q1";
- Rules.clear();
- cin.ignore();
- getchar();
- InputTape();
- InputProgram();
- }
- //Log << cout;
- Log.close();
- system("pause");
- //cout << "Hello World!" << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement