Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<fstream>
- #include<iomanip>
- using namespace std;
- // МАШИНА ТЬЮРИНГА
- //alphabet {'_', '1'}
- //В ФАЙЛЕ tablica.txt ЗАПИСАНА ТАБЛИЦА В НУЖНОМ ФОРМАТЕ (СОСТОЯНИЕ ОЖИДАЕМЫЙСИМВОЛ СИМВОЛДЛЯВСТАВКИ НАПРАВЛЕНИЕДВИЖЕНИЯКАРЕТКИ СЛЕДУЮЩЕЕСОСТОЯНИЕ)
- //Для функции {3x, если 1<=x<=2
- // {2x, если x>2
- struct zap //характеристики записывающей головки, ее состояние и тд
- {
- int q;//состояние
- char ifsym;//символ требуемый
- char sym;//символ для вставки
- char insym[255];//индекс определяет максимальную длинну ленты. поскольку полагается, что лента бесконечна,//!!Вытащить с структуры.
- // необходимо задавать достаточный индекс, либо, соответственно, меньшее количество символов в ленте
- char move;//движение
- int nextq;//следующее состояние
- };
- int main()
- {
- zap instr[100];
- zap tablica;
- zap m;
- ifstream inlen("lenta.txt");//входной файл с лентой
- ifstream intab("tablica.txt");//входной файл с таблицей
- ofstream outlen("binlen.bin",ios::binary);//
- if (!inlen || !intab)
- {
- cout << "Check files" << endl;
- exit(-1);
- }
- int i=0;
- char x;
- while (inlen >> m.insym[i])//запись ленты в бинарный файл
- {
- x = m.insym[i];
- outlen.write((char*)&x,sizeof(char));
- i++;
- }
- int delta = 0;
- if (i < sizeof(m.insym)) //чтобы мы могли записать ленту как угодно (вплоть до одних только единиц)
- {
- delta= sizeof(m.insym) - i;
- for (int g = 0; g < delta; g++)
- {
- x = '_';
- outlen.write((char*)&x, sizeof(char));
- }
- }
- outlen.close();
- inlen.close();
- ifstream in("binlen.bin", ios::binary);
- ofstream out("outlenta.txt");
- int n = delta+i;
- for (i = 0; i < n; i++)
- {
- in.read((char*)&tablica.insym[i], sizeof(char)); //запись с бинарного файла в массив символов для простого считывания
- }
- int lex = 1;
- for (i = 0; i < n; i++) //проверка правильности записи
- {
- switch (lex)
- {
- case 1:
- {
- if (tablica.insym[i] == '_')
- { lex = 1; break; }
- else if (tablica.insym[i]=='1')
- { lex = 2; break; }
- }
- case 2:
- {if (tablica.insym[i] == '_')
- {
- lex = 3; break;
- }
- else if (tablica.insym[i] == '1')
- {
- lex = 2; break;
- }
- }
- case 3:
- {
- if (tablica.insym[i] == '1') { cout << "Lexical mistake!" << endl; exit(-1);}
- else if (tablica.insym[i] == '_') { lex = 3; break; }
- }
- default: {cout << "Lexical mistake!" << endl; exit(-1); }
- }
- }
- i = 0;
- m.q = 1; //начальное состояние
- int j = 0;
- for(i=0;(i<n)&&(tablica.insym[i]!='1');i++) //чтобы машина тьюринга начинала работу с нужного символа (в нашем случае единицы)
- j++;
- if (j==n)//если нет единиц
- {
- cout << "Empty lenta!" << endl;
- exit(1);
- }
- i = 0;
- while (intab >> tablica.q >> tablica.ifsym >> tablica.sym >> tablica.move >> tablica.nextq) //запись состояний, ожидаемых для каждого состояния символов и
- //соответственно команд (заменить на символ, движение, перейти в состояние) в массив
- {
- instr[i].q = tablica.q;
- instr[i].ifsym = tablica.ifsym; instr[i].sym = tablica.sym; instr[i].move = tablica.move; instr[i].nextq = tablica.nextq;
- i++;
- }
- int p = i;
- cout << setw(10) << "Sostoyanie" << setw(20) << "if symbol" << setw(30) << "enter sym" << setw(40) << "move" << setw(50) << "next sost" << endl;//вывод таблицы Машины Тьюринга
- for (i = 0; i < p; i++)
- {
- cout << instr[i].q << instr[i].ifsym << instr[i].sym << instr[i].move << instr[i].nextq << endl;
- }
- while (m.q!= 0) //собственно, действия по таблице.!!!конкретно для моего формата оформления таблицы!!!
- {
- for (i = 0; i < p; i++)
- {
- m.ifsym = instr[i].ifsym;//сделал для своего удобства, дабы не запутаться нигде
- m.sym = instr[i].sym; //
- m.move = instr[i].move; //
- if ((m.ifsym == tablica.insym[j]) && m.q == instr[i].q) //поиск нужного состояния и совместимости ожидаемого символа с полученным одновременно
- {
- tablica.insym[j] = m.sym; //перезапись символа в ленте
- if (m.move == 'r') { j++; }//движения по ленте (массиву)
- if (m.move == 'l') { j--; }
- if (m.move == 'h') { j = j;}
- m.q = instr[i].nextq; //установка следующего состояния
- }
- }
- i = 0;
- }
- for (i = 0; i < n; i++) //вывод изменной ленты в текстовый файл
- {
- out << tablica.insym[i];
- }
- cout << endl;
- system("pause");// пауза, чтобы точно ничего не пропустить :)
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement