Так что это фон для того, что мне нужно для решения этой проблемы.
Внедрение машины Тьюринга, соответствующей следующим требованиям. Государственный реестр должен быть объявлен как 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» в списке с помощьюкласс массива и последняя строка считываются в качестве аргумента для функции, которая устанавливает указатель в связанном списке.
По сути, мой вопрос: как я могу получить конец строки, а затем указать, где эта строка читается?
Большая часть того, что я знаю о чтении из файла, включает в себя чтение всего файла и затем чтение его в одну переменную.