一、题目
对于任意给定的一台Turing机和任意给定的字符串w ( w不含空格),编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。
二、算法构造
3.算法实现
程序源代码(请写入必要的注释)
#include<stdio.h>
void main()
{
int a,b,length,k=0,i=0,j=0,m=0;
int remainder[40],n[40]; //定义了一个remainder数组,用来收集短除法除得的余数,栈倒序输出。
int choose=1;
printf("请输入该二进制数: ");
scanf("%d",&a);
while(a!=0)
{
b=a/2;
k++;
remainder[k]=a-b*2;
a=a/2;
};
printf("该十进制对应的二进制数为: ");
for (i=k;i>=1;i--) //栈倒序输出该二进制数
{
printf("%d",remainder[i]);
}
printf("\n");
printf("扩展后的二进制编码为:"); //扩展后的二进制编码,相邻两个零之间个数
m=0;
for(i=k;i>=1;i--)
{
if(remainder[i]==1)
{
if(i==k)
{ n[m]=0; //将扩展后的二进制存入数组中
m++;
n[m]=remainder[i];
m++;
n[m]=0;
}
else
{
n[m]=remainder[i];
m++;
n[m]=0;
}
m++;
}
else if(remainder[i]==0)
{
n[m]=remainder[i];
m++;
}
}
int l[4]={1,1,0}; //给扩展后的二进制加上110,结束标志,扩展后的编码存储在n[m]中
for(int c=0;c<3;c++)
{
n[m++]=l[c];
}
length=m+1;
for (m=0; m<length; m++)
{
if (n[m] == 0 || n[m] == 1)
{
printf("%d", n[m]);
}
}
printf("\n");
int inner=0; //初始内态为0
for(i=0;i<m-1;i++) //图灵机运算过程并输出
{
switch(inner) //00—>00R;01—>10R;10—>01R;11—>100R;100—>111R;110—>01STOP
{
case 0:
{if(n[i]==0)
{
inner=0;
n[i]=0;
}
else
{
inner=1;
n[i]=0;
}
break;
}
case 1:
{if(n[i]==0)
{
inner=0;
n[i]=1;
}
else
{
inner=10;
n[i]=0;
}
break;
}
case 10:
{if(n[i]==0)
{
inner=11;
n[i]=1;
}
break;
}
case 11:
{if(n[i]=0)
{
inner=0;
n[i]=1;
}
break;
}
}
for(j=0;j<m-1;j++)
{
printf("%d",n[j]);
}
printf("\n");
}
}
- 调试、测试及运行结果
运行结果:
- 经验归纳
通过此次上机更清晰的理解了图灵机的工作过程,刚开始在十进制转换为二进制数数遇到了问题,后来查了一下才写出来的转换,问题更多地出在后面的循环上面,一直不能跳进循环运行结果有错,后来才发现是数据存储和循环条件的问题。以后写循环一定要注意循环条件!!!
添加搜到的一个十进制转换为二进制的函数
#include<stdio.h>
#include<stdlib.h>
//注意必须调用stdlib.h函数库
int main(void){
int a=1000;
char str[30];
itoa(a,str,2);//2即是代表转换为2进制
printf("%s",str);
return 0;
}