daily pastebin goal
48%
SHARE
TWEET

Untitled

a guest Jul 12th, 2018 63 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <fstream>
  5. #include <stdlib.h>
  6. #include <Windows.h>
  7. using namespace std;
  8.  
  9. string Tape;
  10. int Carriage=0;
  11. string Status = "q0"; // стартовое состояние
  12. ofstream Log("Log.txt");
  13.  
  14. struct Rule
  15. {
  16.     string OldStatus = "";
  17.     string OldValue = "";
  18.     string NewStatus = "";
  19.     string NewValue = "";
  20.     string Move = "";
  21. };
  22.  
  23. vector<Rule> Rules;
  24.  
  25. void InputTape()
  26. {
  27.    
  28.     string Tmp;
  29.     cout << "Введите файл с которого считывать данные ленты \n";
  30.     getline(cin,Tmp);
  31.     ifstream tape(Tmp);
  32.     getline(tape, Tape);
  33.     getline(tape, Tmp);
  34.     Carriage = atoi(Tmp.c_str());
  35.     tape.close();
  36. }
  37.  
  38. Rule Split(string str)
  39. {
  40.     Rule Res;
  41.     int pos=0;
  42.     string buf = "";
  43.     for(size_t i = 0; i < str.size(); i++)
  44.     {
  45.         if(str[i] != ';')
  46.             buf +=str[i];
  47.         else if(Res.OldStatus == "")
  48.         {
  49.             Res.OldStatus = buf;
  50.             buf = "";
  51.         }
  52.         else if(Res.OldValue == "")
  53.         {
  54.             Res.OldValue = buf;
  55.             buf = "";
  56.         }
  57.         else if(Res.NewStatus == "")
  58.         {
  59.             Res.NewStatus = buf;
  60.             buf = "";
  61.         }
  62.         else if(Res.NewValue == "")
  63.         {
  64.             Res.NewValue = buf;
  65.             buf = "";
  66.         }
  67.         else if(Res.Move == "")
  68.         {
  69.             Res.Move = buf;
  70.             buf = "";
  71.         }
  72.     }
  73.     return Res;
  74. }
  75.  
  76. void InputProgram()
  77. {
  78.     string str;
  79.     cout << "Введите файл с которого считывать программу \n";
  80.     getline(cin,str);
  81.     ifstream program(str);
  82.     while(!program.eof())
  83.     {
  84.         getline(program, str);
  85.         Rules.push_back(Split(str));
  86.     }
  87. }
  88.  
  89.  
  90. bool Run()
  91. {
  92.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);  
  93.     for(size_t i = 0; i < Rules.size(); i++)
  94.         if(Rules[i].NewStatus[0] != 'q' || Rules[i].OldStatus[0] != 'q')
  95.         {
  96.            
  97.             SetConsoleTextAttribute(hConsole, (WORD) ((15 << 4) | 4+8));
  98.             cout << "Строка: " << i << "\n";
  99.             cout << "Ошибка вводва статуса машины, статус должен начинаться с символа q\n";
  100.             Log << "Строка: " << i << "\n";
  101.             Log << "Ошибка вводва статуса машины, статус должен начинаться с символа q\n";
  102.             Log.close();
  103.             return false;
  104.         } else if (Rules[i].OldValue.size() >= 2 || Rules[i].NewValue.size() >= 2)
  105.         {
  106.             SetConsoleTextAttribute(hConsole, (WORD) ((15 << 4) | 4+8));
  107.             cout << "Строка: " << i << "\n";
  108.             cout << "Ошибка ввода значения машины, значение должно быть размером в один символ\n";
  109.             Log << "Строка: " << i << "\n";
  110.             Log << "Ошибка ввода значения машины, значение должно быть размером в один символ\n";
  111.             Log.close();
  112.             return false;
  113.         }  
  114.     SetConsoleTextAttribute(hConsole, (WORD) ((15 << 4) | FOREGROUND_GREEN));
  115.     //ofstream cout("output.txt", ios_base::out);
  116.     cout << Tape << " Каретка: " << Carriage << " Статус: " << Status << "\n";
  117.     Log << Tape << " Каретка: " << Carriage << " Статус: " << Status << "\n";
  118.     while(Status != "qF") // пока состояние не qF продолжать работу
  119.     {
  120.         for(size_t i = 0; i < Rules.size(); i++)
  121.             if(Rules[i].OldStatus == Status && Rules[i].OldValue[0] == Tape[Carriage])
  122.             {
  123.                 Status = Rules[i].NewStatus;
  124.                 Tape[Carriage] = Rules[i].NewValue[0];
  125.                 switch (Rules[i].Move[0])
  126.                 {
  127.                 case 'L':
  128.                     Carriage--;
  129.                     break;
  130.                 case 'R':
  131.                     Carriage++;
  132.                     break;
  133.                 case 'N':
  134.                     break;
  135.                 }
  136.                 SetConsoleTextAttribute(hConsole, (WORD) ((15 << 4) | FOREGROUND_GREEN));
  137.                 cout << Tape << " Каретка: " << Carriage << " Статус: " << Status << "\n";
  138.                 Log <<  Tape << " Каретка: " << Carriage << " Статус: " << Status << "\n";
  139.                 break;
  140.             }
  141.             else if (i == Rules.size() - 1)
  142.             {
  143.                 SetConsoleTextAttribute(hConsole, (WORD) ((15 << 4) | 4+8));
  144.                 cout << "Ошибка выполнения. Каретка: " << Carriage << " Статус: " << Status << "\n";
  145.                 Log << "Ошибка выполнения. Каретка: " << Carriage << " Статус: " << Status << "\n";
  146.                 Log.close();
  147.                 return false;
  148.             }
  149.     }
  150.     return true;
  151. }
  152.  
  153. int main()
  154. {
  155.  
  156.     setlocale(LC_ALL,"Rus");
  157.     system("color F0");
  158.     //cout.rdbuf(Log.rdbuf());
  159.     cout << "Привет, это программа имитирует работу машины тьюринга, примеры синтаксиса содержатся в файлах HelpTape.txt и HelpInput.txt\n";
  160.     cout << "Вывод работы и ошибок так же ведётся в файл Log.txt\n";
  161.     cout << "Для продолжения введите любой символ и нажмите Enter \n";
  162.     getchar();
  163.     InputTape();
  164.     InputProgram();
  165.     while(!Run())
  166.     {
  167.         cout << "Ошибка, исправьте содержимое файлов tape.txt и program.txt и попробуйте снова \n";
  168.         cout << "Для продолжения введите любой символ и нажмите Enter \n";
  169.         Status = "q1";
  170.         Rules.clear();
  171.         cin.ignore();
  172.         getchar();
  173.         InputTape();
  174.         InputProgram();
  175.     }
  176.     //Log << cout;
  177.     Log.close();
  178.     system("pause");
  179.     //cout << "Hello World!" << endl;
  180.     return 0;
  181. }
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