Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ДЗ 2 МЛиТА (машина Тьюринга)

.docx
Скачиваний:
6
Добавлен:
07.06.2021
Размер:
38.8 Кб
Скачать

Задание

Разработать программу, реализующую машину Тьюринга. Пользователь должен иметь возможность задать алфавит машины, множество ее состояний и набор правил, по которым работает машина, а также начальное содержимое ленты. Машина должна выполнять переходы в соответствии с набором правил и остановиться при достижении конечного состояния. После остановки машина должна отобразить полученное содержимое ленты.

Краткое описание работы программы

Программа принимает на ввод названия состояний, правила перехода и содержимое ленты. Наименование каждого состояния должно содержать три символа (например, q01). Форма записи правил перехода: q01/q02*> (где '/' – символ в строке, который необходимо заменить, а '*' – символ, на который выполняется замена, '>' – маркер для направления движения курсора по строке). Символы из правил замены фиксируются, затем вводится содержимое ленты и выполняется замена. При прохождении по ленте символ, над которым производится действие, окрашивается красным цветом. После остановки машина отображает полученное содержимое ленты.

Код программы

using System;

using System.Collections.Generic; using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace T_

{

class Machine

{

private string[] states = new string[30]; private int statescount;

private string[] instructions = new string[100]; private int instructcount;

private char[] bandf = new char[999]; private string band;

private int cursor;

private string currstate; private int gflag; public Machine()

{

int i = 0; Console.Write("START STATE: ");

currstate = Console.ReadLine(); Console.WriteLine("Enter states: "); string b = "n";

while (b != "-")

{

Console.Write("Enter " + "{0} state: ", i + 1); b = Console.ReadLine();

Console.WriteLine(); if (b != "-")

{

i++;

states[i] = b;

}

}

statescount = i; i = 0;

Console.WriteLine("Enter instructions: "); b = "n";

while (b != "-")

{

Console.Write("Enter {0} instruction: ", i + 1); b = Console.ReadLine();

Console.WriteLine(); if (b != "-")

{

i++;

instructions[i] = b;

}

}

instructcount = i;

}

private void bandenter()

{

Console.WriteLine("Enter band: "); band = Console.ReadLine();

int i = 0;

for (i = 0; i < band.Length; i++)

{

bandf[i] = band[i];

}

}

private void shift(string a)

{

char b = a[8]; if (b == '<')

cursor--;

else

{

}

if (b == '>')

cursor++; else

gflag++;

}

private char replace(char a)

{

string c = Char.ToString(a); char b = 'n';

int i = 0; int flag = 0;

while (flag != 1)

{

== 3)

i++;

if (instructions[i].IndexOf(currstate) == 0 && instructions[i].IndexOf(c)

{

b = instructions[i][7]; shift(instructions[i]);

currstate = instructions[i].Substring(4); currstate = currstate.Substring(0, 3); flag++;

}

}

return b;

}

private void cursprint()

{

for (int i = 0; i < band.Length; i++)

{

if (i == cursor)

{

Console.ForegroundColor = ConsoleColor.Red; Console.Write(bandf[i]); Console.ResetColor();

}

else

{

Console.Write(bandf[i]);

}

}

}

public void doit()

{

bandenter(); cursor = 0;

gflag = 0; int i = 0; cursprint();

Console.WriteLine(); while (gflag != 1)

{

bandf[cursor] = replace(bandf[cursor]); cursprint();

Console.WriteLine();

}

Console.WriteLine(bandf);

}

}

class Program

{

static void Main(string[] args)

{

Machine mach = new Machine(); mach.doit();

Console.Read();

}

}

}

Результат работы программы

Рисунок 1 – Результат работы при корректной работе программы

Рисунок 2 – Результат работы при некорректной работе программы

Вывод

Разработать программу, реализующую машину Тьюринга. Пользователь вводит состояния, правила перехода и направление движения курсора, а затем – содержимое ленты. Для удобства и простоты реализации использованы методы вырезания части строки до и после определенного символы и возвращения индекса элемента и массивы строк.

1