一.实验目的
1 .掌握图灵机的概念和基本结构,理解图灵机的基本指令和编码方式;
2 .掌握图灵机的编程方法。
二.实验内容
3. 对于任意给定的一台Turing机和任意给定的字符串w ( w不含空格),编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。
三.算法设计
1.题目分析
对于XN*2 Turing机,输入正整数,执行完操作后,输出正整数。
step1:输入一个正整数,将正整数转化为二进制码;
step2:将二进制码转化成Turing机可执行的编码,在最后加上‘,’(0110);
step3:按内态规则执行编码,输出执行完成后的编码;
step4:将编码转化成二进制数;
step5:将二进制数转化为整数;
2.算法设计
a.输入一个整数
b.用数组b储存二进制数
c.历数组b,遇见0,数组c内存0,遇见1,给数组c存1,c的下一位存0,当b遍历完 在c的最后面加上110(‘,’的码)
d.设一个初始内态flag,遍历c时的数做为输入,根据规则判断输出,将输出重新放入c
e.将编码 转化为二进制码
f.将二进制码转化为整数
3.算法实现
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
int n,m,a[20],i=0,j,b[20],sum=0,x;
printf("请输入一个正整数:"); //将十进制转化为二进制
scanf("%d",&n);
memset(a,0,sizeof(a)); //初始化a,b
memset(b,0,sizeof(b));
while(n)
{
a[i++]=n%2;
n/=2;
}
for(j=i,m=0;j>=0;j--)
{
b[m]=a[j];
m++;
}
b[i+1]=3; //将3设置为逗号
printf("转化为二进制数:\n");
for(j=0;j<i+1;j++)
{
printf("%d",b[j]);
}
printf("\n");
int f,c[20],k=1; //将二进制数转化为图灵机可识别的编码
memset(c,0,sizeof(c));
for(i=0,j=0;i<20;i++)
{
if(b[i]==0)
{
c[j]=0;
j++;
}
else if(b[i]==1)
{
c[j]=1;
c[j+1]=0;
j+=2;
}
else if(b[i]==3) //将逗号 改为0110
{
c[j]=1;
c[j+1]=1;
c[j+2]=0;
j+=3;
}
}
printf("对二进制数进行再次的转化:\n");
for(i=0;i<20;i++)
{
printf("%d",c[i]);
}
printf("\n");
int flag=0; //进行图灵机的乘法运算
for(i=0;i<20;i++)
{
if(flag==0&&c[i]==0)
{
c[i]=0;
}
else if(flag==0&&c[i]==1)
{
flag=1;
c[i]=0;
}
else if(flag==1&&c[i]==0)
{
flag=0;
c[i]=1;
}
else if(flag==1&&c[i]==1)
{
flag=10;
c[i]=0;
}
else if(flag==10&&c[i]==0)
{
flag=11;
c[i]=1;
}
else if(flag==11&&c[i]==0)
{
flag=0;
c[i]=1;
}
}
printf("进行图灵乘法运算后的编码:\n");
for(i=0;i<20;i++)
{
printf("%d",c[i]);
}
printf("\n");
for(i=0;i<20;i++) //将编码转化为二进制
{
if(c[i]==1&&c[i+1]==1) //将0110 改为逗号
{
c[i]=3;
c[i+1]=0;
break;
}
}
for(f=0;f<20;f++)
{
if(c[f]==1&&c[f+1]==0)
{
for(m=f+1;m<20;m++)
{
c[m]=c[m+1];
}
}
if(c[f]==3) //x为数组长度
{
x=f;
}
}
printf("将运算结果转化为二进制:\n");
int d[20],s=0;
for(i=0;i<20;i++)
{
if(c[i]!=3) //将重新编号的二进制编码放入数组d
{
d[i]=c[i];
s++;
}
else if(c[i]=3)
{
break;
}
}
for(i=0;i<s;i++)
printf("%d",d[i]);
printf("\n");
printf("将二进制转化为十进制得到最后的结果:\n");
int leap=1; // 二进制转化为十进制
for(j=s-1;j>-1;j--)
{
if(d[j]==1)
{
sum+=leap;
leap*=2;
}
else
leap*=2;
}
printf("%d\n",sum);
return 0;
}
4.调试、测试及运行结果
测试数据:3
输出数据:6
5.经验归纳
通过这次上机实验,理解了图灵机的基本运作,巩固了二进制和十进制之间的互相转化,实现了XN*2时运用了很多的语句,学会了用数组的长度去控制二进制数的位数。总的来说,程序不难,但是要认真仔细,态度要端正。程序不是特别完善,会加以改进。