Advertisement
JouJoy

Untitled

May 7th, 2020
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.13 KB | None | 0 0
  1. #include<iostream>
  2. #include<fstream>
  3. #include<iomanip>
  4.  
  5. using namespace std;
  6. // МАШИНА ТЬЮРИНГА
  7. //alphabet {'_', '1'}
  8.  
  9. //В ФАЙЛЕ tablica.txt ЗАПИСАНА ТАБЛИЦА В НУЖНОМ ФОРМАТЕ (СОСТОЯНИЕ ОЖИДАЕМЫЙСИМВОЛ СИМВОЛДЛЯВСТАВКИ НАПРАВЛЕНИЕДВИЖЕНИЯКАРЕТКИ СЛЕДУЮЩЕЕСОСТОЯНИЕ)
  10. //Для функции {3x, если 1<=x<=2
  11. //            {2x, если x>2
  12. struct zap //характеристики записывающей головки, ее состояние и тд
  13. {
  14.     int q;//состояние
  15.     char ifsym;//символ требуемый
  16.     char sym;//символ для вставки
  17.     char insym[255];//индекс определяет максимальную длинну ленты. поскольку полагается, что лента бесконечна,//!!Вытащить с структуры.
  18.                     // необходимо задавать достаточный индекс, либо, соответственно, меньшее количество символов в ленте
  19.     char move;//движение
  20.     int nextq;//следующее состояние
  21. };
  22. int main()
  23. {
  24.  
  25.     zap instr[100];
  26.     zap tablica;
  27.     zap m;
  28.     ifstream inlen("lenta.txt");//входной файл с лентой
  29.     ifstream intab("tablica.txt");//входной файл с таблицей
  30.     ofstream outlen("binlen.bin",ios::binary);//
  31.     if (!inlen || !intab)
  32.     {
  33.         cout << "Check files" << endl;
  34.         exit(-1);
  35.     }
  36.     int i=0;
  37.     char x;
  38.     while (inlen >> m.insym[i])//запись ленты в бинарный файл
  39.     {
  40.         x = m.insym[i];
  41.         outlen.write((char*)&x,sizeof(char));
  42.         i++;
  43.     }
  44.     int delta = 0;
  45.     if (i < sizeof(m.insym)) //чтобы мы могли записать ленту как угодно (вплоть до одних только единиц)
  46.     {
  47.         delta= sizeof(m.insym) - i;
  48.         for (int g = 0; g < delta; g++)
  49.         {
  50.             x = '_';
  51.             outlen.write((char*)&x, sizeof(char));
  52.         }
  53.     }
  54.     outlen.close();
  55.     inlen.close();
  56.     ifstream in("binlen.bin", ios::binary);
  57.     ofstream out("outlenta.txt");
  58.     int n = delta+i;
  59.     for (i = 0; i < n; i++)
  60.     {
  61.         in.read((char*)&tablica.insym[i], sizeof(char)); //запись с бинарного файла в массив символов для простого считывания
  62.     }
  63.     int lex = 1;
  64.     for (i = 0; i < n; i++) //проверка правильности записи
  65.     {
  66.         switch (lex)
  67.         {
  68.         case 1:
  69.         {
  70.             if (tablica.insym[i] == '_')
  71.         { lex = 1; break; }
  72.               else if (tablica.insym[i]=='1')
  73.         { lex = 2; break; }
  74.         }
  75.         case 2:
  76.         {if (tablica.insym[i] == '_')
  77.         {
  78.             lex = 3; break;
  79.         }
  80.         else if (tablica.insym[i] == '1')
  81.         {
  82.             lex = 2; break;
  83.         }
  84.         }
  85.         case 3:
  86.         {
  87.             if (tablica.insym[i] == '1') { cout << "Lexical mistake!" << endl; exit(-1);}
  88.             else if (tablica.insym[i] == '_') { lex = 3; break; }
  89.         }
  90.         default: {cout << "Lexical mistake!" << endl; exit(-1); }
  91.         }
  92.     }
  93.     i = 0;
  94.     m.q = 1; //начальное состояние
  95.     int j = 0;
  96.     for(i=0;(i<n)&&(tablica.insym[i]!='1');i++) //чтобы машина тьюринга начинала работу с нужного символа (в нашем случае единицы)
  97.         j++;
  98.     if (j==n)//если нет единиц
  99.     {
  100.         cout << "Empty lenta!" << endl;
  101.         exit(1);
  102.     }
  103.     i = 0;
  104.     while (intab >> tablica.q >> tablica.ifsym >> tablica.sym >> tablica.move >> tablica.nextq) //запись состояний, ожидаемых для каждого состояния символов и
  105.                                                                                     //соответственно команд (заменить на символ, движение, перейти в состояние) в массив
  106.     {
  107.         instr[i].q = tablica.q;
  108.         instr[i].ifsym = tablica.ifsym; instr[i].sym = tablica.sym; instr[i].move = tablica.move; instr[i].nextq = tablica.nextq;
  109.         i++;
  110.     }
  111.    int p = i;
  112.    cout << setw(10) << "Sostoyanie" << setw(20) << "if symbol" << setw(30) << "enter sym" << setw(40) << "move" << setw(50) << "next sost" << endl;//вывод таблицы Машины Тьюринга
  113.     for (i = 0; i < p; i++)
  114.     {
  115.         cout << instr[i].q << instr[i].ifsym << instr[i].sym << instr[i].move << instr[i].nextq << endl;
  116.     }
  117.     while (m.q!= 0) //собственно, действия по таблице.!!!конкретно для моего формата оформления таблицы!!!
  118.     {
  119.         for (i = 0; i < p; i++)
  120.         {
  121.             m.ifsym = instr[i].ifsym;//сделал для своего удобства, дабы не запутаться нигде
  122.             m.sym = instr[i].sym;    //
  123.             m.move = instr[i].move;  //  
  124.             if ((m.ifsym == tablica.insym[j]) && m.q == instr[i].q) //поиск нужного состояния и совместимости ожидаемого символа с полученным одновременно
  125.             {
  126.                 tablica.insym[j] = m.sym; //перезапись символа в ленте
  127.                 if (m.move == 'r') { j++; }//движения по ленте (массиву)
  128.                 if (m.move == 'l') { j--; }
  129.                 if (m.move == 'h') { j = j;}
  130.                 m.q = instr[i].nextq; //установка следующего состояния
  131.             }
  132.         }
  133.         i = 0;
  134.     }
  135.  
  136.     for (i = 0; i < n; i++) //вывод изменной ленты в текстовый файл
  137.     {
  138.         out << tablica.insym[i];
  139.     }
  140.     cout << endl;
  141.     system("pause");// пауза, чтобы точно ничего не пропустить :)
  142.     return 0;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement