Advertisement
Guest User

Untitled

a guest
Jul 12th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.07 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement