实验内容:对于任意给定的一台Turing机和任意给定的字符串w ( w不含空格),编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果:
#include<stdio.h>
#include<math.h>
#define N 100
typedef struct {
int data[N];
int length;
}Data;
int main()
{
Data A,B; //二进制数组,XN×2数组
int y=0,i=0,x,c[2];//存放内态和输入值
int sum=0;
A.length=0;
B.length=0;
printf("*****输入一个十进制的数*****\n");
scanf("%d",&x);
while(x!=0){
y=x%2;
B.data[i]=y;
i++;
x=x/2;
B.length++;
}
i--;
printf("转化为二进制:");
for(;i>=0;--i){
A.data[A.length++]=B.data[i];
}
//输出二进制数
for(i=0;i<A.length;i++){
printf("%d",A.data[i]);
}
printf("\n");
//扩展二进制
B.length=0;
for(i=0;i<A.length;i++){
if(A.data[i]==1){
B.data[B.length++]=0;
B.data[B.length++]=1;
}else if(A.data[i]==0){
B.data[B.length++]=0;
}
}
B.data[B.length++]=0;
B.data[B.length++]=1;
B.data[B.length++]=1;
B.data[B.length++]=0;
//转换二进制数输出
printf("扩展后二进制输出为:\n");
for(i=0;i<B.length;i++){
printf("%d",B.data[i]);
}
printf("\n");
c[0]=0;
//图灵机执行命令,开始遍历
for(i=0;i<B.length;i++){
c[1]=B.data[i];
if(c[0]==0&&c[1]==0){
c[0]=0;
B.data[i]=0;
printf("执行命令结果为:%d\n",B.data[i]);
}
else if(c[0]==0&&c[1]==1){
c[0]=1;
B.data[i]=0;
printf("执行命令结果为:%d\n",B.data[i]);
}
else if(c[0]==1&&c[1]==0){
c[0]=0;
B.data[i]=1;
printf("执行命令结果为:%d\n",B.data[i]);
}
else if(c[0]==1&&c[1]==1){
c[0]=10;
B.data[i]=0;
}
else if(c[0]==10&&c[1]==0){
c[0]=11;
B.data[i]=1;
printf("执行命令结果为:%d\n",B.data[i]);
}
else if(c[0]==11&&c[1]==0){
c[0]=0;
B.data[i]=1;
printf("执行命令结果为:%d\n",B.data[i]);
}
if(c[0]==11&&c[1]==0){
break;
}
}
//遍历结束,不满足停止条件,补0继续
while(c[0]!=11&&c[1]!=0){
B.data[B.length]=0;
c[1]=B.data[B.length];
B.length++;
if(c[0]==0&&c[1]==0){
c[0]=0;
B.data[i]=0;
}else if(c[0]==0&&c[1]==1){
c[0]=1;
B.data[i]=0;
}
else if(c[0]==1&&c[1]==0){
c[0]=0;
B.data[i]=1;
}else if(c[0]==1&&c[1]==1){
c[0]=10;
B.data[i]=0;
}else if(c[0]==10&&c[1]==0){
c[0]=11;
B.data[i]=0;
}else if(c[0]==11&&c[1]==0){
c[0]=0;
B.data[i]=1;
}
}
//满足停止条件,将该位置变1,再加0
B.data[B.length++]=1;
B.data[B.length++]=0;
printf("图灵机计算结果为:");
for(i=0;i<B.length;i++){
printf("%d",B.data[i]);
}
printf("\n");
//转换为二进制
A.length=0;
for(i=0;i<=B.length-3;i++){
if(B.data[i]==0&&B.data[i+1]==1&&B.data[i+2]==0){
A.data[A.length++]=1;
}else if(B.data[i]==0&&B.data[i+1]==0){
A.data[A.length++]=0;
}
}
i=0;
while(A.data[i]==0){
i++;
}
printf("转化为二进制数为:");
for(i;i<A.length;i++){
printf("%d",A.data[i]);
}
//转换为十进制,输出
for(i=A.length-1;i>=0;i--){
sum+=A.data[i]*(int)pow(2,(A.length-1-i));
}
printf("\n");
printf("******输出的十进制为:%d *****\n",sum);
printf("\n");
return 0;
}