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

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Задание

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

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

Программа принимает на ввод названия состояний, правила перехода и содержимое ленты. Наименование каждого состояния должно содержать три символа (например, 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

Источник: https://studfile.net/preview/16463884/