Делая машину Тьюринга, не очень разбираюсь в таблице действий - PullRequest
0 голосов
/ 01 октября 2019

Так что это фон для того, что мне нужно для решения этой проблемы.

Внедрение машины Тьюринга, соответствующей следующим требованиям. Государственный реестр должен быть объявлен как int. Лента должна быть объявлена ​​как переменная типа двусвязного списка, определенного как класс C ++, где каждый узел соответствует одной ячейке на ленте. Таблица действий должна быть объявлена ​​как переменная типа списка на основе массива, определенного как класс C ++, где каждый элемент соответствует структуре, состоящей из пяти членов, соответствующих: (1) текущему состоянию, (2) символу, считанному излента, (3) следующее состояние, (4) символ, который нужно записать на ленту, и (5) направление перемещения указателя чтения / записи, соответственно. Каждый элемент в таблице действий соответствует «команде» в следующем формате:

(текущее состояние, чтение символа) -> (следующее состояние, символ для записи) -> направление к следующей ячейке

Текущее состояние и следующие члены состояния должны иметь тип int. Символ для чтения и символ для записи членов должны иметь тип char. Значения текущего состояния, чтения символа, следующего состояния и символа для записи зависят от проблемы. Символ B является зарезервированным символом, используемым для указания того, что ячейка пуста (т.е. пуста). Направление к следующему элементу ячейки должно иметь тип char, где L, - (т.е. символ тире), R и H соответствуют перемещению указателя чтения / записи влево, без движения, перемещению вправо,и прекращение вычислений (т. е. проблема решена) соответственно. Ваши классы C ++ должны быть реализациями алгоритмов двусвязных списков, приведенных на веб-странице Алгоритмы CS210. Не тратьте свое время на реализацию каких-либо алгоритмов, которые вам на самом деле не нужны.

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

initial_state_register_value 
initial_tape_values
first_row_of_action_table_values
.  
.  
.  
last_row_of_action_table_values
-1 // action table terminator
initial_read_write_pointer_position

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

0 // initial state
B 0 0 0 0 B // initial cell values on tape
0 0 0 0 R // move right
0 1 0 1 R // move right
0 B 1 B L // when a blank at the right is found, change to state 1 and move left
1 0 0 1 R // if a 0 is changed to 1, change to state 0 and move right
1 1 1 0 L // if a 1 is changed to 0, move left
1 B 0 1 H // if a B is changed to 1, stop
-1 // end of action table
6 // initial position of read/write pointer

Ваша программа должна распечатать содержимое ленты (и положение указателя чтения / записи) слева направо: (1) после негоинициализируется, (2) после каждого промежуточного вычисления (т.е. после того, как отдельное действие завершено), и (3) после того, как вычисление останавливается. Например, начальные значения ячеек на ленте и начальная позиция указателя чтения / записи (представленного символом ^) будут выглядеть следующим образом:

B 0 0 0 0 B
          ^

Я понял, чтоТаблица действий принимает значения.

С чем я сейчас сталкиваюсь, так это с попыткой получить только первую строку, прочитанную в целочисленную переменную, вторую строку в классе связанного списка, третью строку «-1» в списке с помощьюкласс массива и последняя строка считываются в качестве аргумента для функции, которая устанавливает указатель в связанном списке.

По сути, мой вопрос: как я могу получить конец строки, а затем указать, где эта строка читается?

Большая часть того, что я знаю о чтении из файла, включает в себя чтение всего файла и затем чтение его в одну переменную.

...