##模拟图灵机 XN*2的运算(文末源代码)
题目要求:
-
对XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。
用C或C++或java或python语言实现程序解决问题。1.程序风格良好(使用自定义注释模板)
2.提供友好的输入输出,并进行输入数据的正确性验证。
2.算法分析
对XN2图灵机进行模拟,给定一个任意的十进制数,首先应该将十进制数用二进制表示出来,将二进制数转换为收缩扩展二进制的编码;根据当前的内态和输入执行XN2图灵机的指令;将结果的二进制编码转换为二进制数; 将二进制数转换为十进制数,实现乘2运算功能。相应转换为二进制之后“1”对应变为10,“0”变为0,“,”变为110,然后根据图灵机指令进行运算得出结果,再输出结果即可,图灵机XN*2在拓展的二进位上实现这个运算的指令如下:
0 0 ->0 0 R,
0 1 ->1 0 R,
1 0 ->0 1 R,
1 1 ->10 0 R,
10 0 ->11 1 R,
11 0 ->0 1 STOP。
3.概要设计(包括数据结构及算法绘制流程图或伪代码表示)
转换为二进制之后“1”对应变为10,“0”变为0,“,”变为110
int ChangeBinary(int a[],int b[],int i)
{
int p=1;
while(i)
{
if(!a[i]){ //"0"表示为0
b[p++]=0;
}
else{
//"1"表示为10
b[p++]=1;
b[p++]=0;
}
i–;
}
//","表示为110
b[p++]=1;
b[p++]=1;
b[p++]=0;
return p;
}
XN*2图灵机指令代码实现:
void Instruct(int b[],int p)
{
int flag=0,m,y;
for(m=0;1;m++)
{
if(flag==0&&b[m]==0){
flag=0;
b[m]=0;
} else if(flag==0&&b[m]==1){
flag=1;
b[m]=0;
}
else if(flag==1&&b[m]==0){
flag=0;
b[m]=1;
}
else if(flag==1&&b[m]1)
{
flag=10;
b[m]=0;
}
else if(flag10&&b[m]0)
{
flag=11;
b[m]=1;
}else if(flag11&&b[m]==0)
{
flag=0;
b[m]=1;
for(y=0;y<p+2;y++){
cout<<b[y];
}
cout<<endl;
break;
}
for(y=0;y<p+2;y++){
cout<<b[y];
}
cout<<endl;
}
}
流程图如下:
4.测试(设计测试用例或测试代码的设计与实现,测试结果截屏)
测试实现结果如下,输入十进制数7,成功模拟了图灵机流程,并得到了正确的结论。
5.调试(对测试出的问题进行调试,界面截屏,调试修正编码)
一开始,只能输出一个十进制数的扩展位,例如,输入3,不能实现*2,它的扩展二进制是错误的。
经过调试后解决了问题:
6.心得体会(关键问题的解决思路及步骤总结)
不足:此次图灵机的实验对我来说还是有很大难度的,虽然开始理解了图灵机的思想,但是真正上机操作的时候还是有很多问题。例如十进制和二进制之间的转化,想的很简单,但是实际做起来有许多的问题,一个十进制中,整型,字符型和字符数组之间的转化,字符连接、替换等过程都有或多或少的问题,在上网查询了相关资料后才有了了解,但是程序依旧有很多不足需要完善。
7.收获:此次实验我也学到了许多知识。如:C++中ostringstream myos将int型转化为字符串,并且对循环计算十进制转换二进制有了更深的研究,同样细心还是非常重要的,“==”刚开始写成了“=”出现了错误,经过检查才发现,还有0,1要加单引号等等,总的来说本次题目讲解收入还是很大的。
#