实验目的:掌握图灵机的概念和基本结构,理解图灵机的基本指令和编码方式;
掌握图灵机的编程方法。
实验内容:对于任意给定的一台Turing机和任意给定的字符串w ( w不含空格),编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。
源代码如下(最终并没有实现图灵机过程):`
#include "pch.h"
#include <iostream>
using namespace std;
typedef struct node {
int data;
struct node *next;
}*LinkList;
void insert(LinkList a, LinkList b, int r) { //两节点间插入一个值为r的新结点
LinkList c;
c = (LinkList)malloc(sizeof(node));
c->data = r;
c->next = b;
a->next = c;
}
LinkList sze(int n, LinkList L) { //十进制转化为二进制
void insert(LinkList, LinkList, int);
int x;
LinkList p, a;
L = (LinkList)malloc(sizeof(node));
L->data = 0;
a = L;
p = NULL;
L->next = p;
while (n >= 1) {
if (n == 1) {
insert(L, L->next, 1);
break;
}
else
x = n % 2;
insert(L, L->next, x);
x = x / 2;
}
return L;
}
LinkList zhuanma(LinkList L) { //二进制转化为机器码
LinkList s;
s = L;
while (L) {
if (L->data == 1) {
insert(L, L->next, 0);
L = L->next;
}
L = L->next;
}
L = s;
while (L->next) {
L = L->next;
}
insert(L, L->next, 1);
L = L->next;
insert(L, L->next, 1);
L = L->next;
insert(L, L->next, 0);
L = L->next;
insert(L, L->next, 0);
L = L->next;
return L;
}
LinkList rule(LinkList L) { //图灵规则转码
LinkList q = L;
int flag = 0;
while (L) {
if (flag == 0 && L->data == 0)
L = L->next;
else if (flag == 0 && L->data == 1) {
flag = 1;
L->data = 0;
L = L->next;
}
else if (flag == 1 && L->data == 0) {
flag = 0;
L->data= 1;
L = L->next;
}
else if (flag == 1 && L->data == 1) {
flag = 10;
L->data = 0;
L = L->next;
}
else if (flag == 10 && L->data == 0) {
flag = 11;
L->data = 1;
L = L->next;
}
else if (flag == 11 &&L->data == 0) {
flag = 0;
L->data = 1;
break;
}
}
return L;
}
int main() {
LinkList L, m,a;
int n;
L = NULL;
cout<< "请输入n:";
cin >> n;
L = sze(n, L);
LinkList s = L;
while (L) {
cout << (L->data);
L = L->next;
}
cout << endl;
L = s;
m = zhuanma(L);
a = rule(m);
cout << "XN*2的机器码为:" << endl;
cout << m << endl;
cout << "经过图灵规则后:" << endl;
cout << a << endl;
return 0;
}
只能起到一点参考作用。