一.问题描述
我所写的是利用图灵机实现XN2功能。它一共有6个指令:
00 → 00R
01 → 10R
10 → 01R
11 → 100R
100→ 111R
110→ 01STOP
所要表达的意思就是当左边内态与输入变化时,右边下一内态与输出就会有所变化。而且随着这个指令的变化,就会实现XN2的功能.例如:
输入***3→转化为(11,)→01010110
6→110,→0010100110***
我们的程序所要实现的就是将3后面的字符串转化为6后面的。
二…完整代码
#include <iostream>
#include<stdio.h>
using namespace std;
//将二进制数扩展为二进位
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;
}
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(flag==10&&b[m]==0)
{
flag=11;
b[m]=1;
}else if(flag==11&&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;
}
}
int main()
{
int a[100];
int b[100]={0};
int n,k,p,j=0,temp=0;
cout<<"请输入一个十进制的数:";
cin>>n; //将十进制转化为二进制
int i=-1;
while(n){
i++;
a[i]=n%2;
n=n/2;
}
cout<<"转化成扩展的二进位编码为:"<<endl; //转化成扩展的二进位编码
p=ChangeBinary(a,b,i);
Instruct(b,p);
return 0;
}
三.调试
一开始,只能输出一个十进制数的扩展位,例如,输入3,不能实现*2。
经过调试:
四.测试
五.总结
在我看到问题时,没有一点头绪,不知如何开始,我到现在都是懵的,因为我不会写,我就借鉴了别人的,看看人家是怎么想的,自己为啥想不出来。
然后在写的过程中,又不知道指令该怎么表达,于是不停的出现问题。指令与实际输出不符,而且在调试过程中发现有一部分数组的已经超过了整型变量的范围了。随后程序输出不能实现加一的功能,一开始想着可能是因为加一那部分代码程序没有读进去,但最后经过认真思考,实现了功能。我在写的过程中参考着别人的代码,然后结合自己的理解,虽然完成的不是很好,但我认真地思考了,也渔别人讨论了自己的想法。
在写的时候有同学给我说可以把每一部分的指令放进一个函数中,最终只需要调用几个函数就可以了,顿时豁然开朗。也觉得操作起来特别方便。
同时要反思为什么别人想到了而我没想到,什么方法用起来简单,处理问题方便呢?