所以这是我需要解决这个问题的背景。
实施符合以下要求的图灵机。状态寄存器应声明为
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
例如,包含以下值的文本文件将“编程”您的Turing机器以二进制形式计数到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”行读入数组类的列表中,最后一行作为函数的参数被读入,该函数在链接列表中设置了指针。
基本上,我的问题是如何获取一行的结尾,然后设置该行的读取位置?
我从文件中读取的大部分信息都涉及读取整个文件,然后将其读取到一个变量中。