一、题目分析:
1.题目:对于任意给定的一台Turing机和任意给定的字符串w ( w不含空格),编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。
2.分析:
第一步:十进制数转化为二进制数;
第二步:给转化好的十进制数上识别’0’或’1’,并将0转化为0,1转化为10,并加上逗号,其用数字表示为110.
第三步:利用for循环以及if条件语句,将每一种内态和输入的结果表示出来,并有最终的运行操作。
二、算法构造:
流程图:
三、算法实现:
整体代码:
#include<iostream>
#include<string>
using namespace std;
void main()//转化函数,十进制数转化为二进制数,并将更改后的编码输出(包括逗号)
{
int m,i,j,k,a[30];
int s=0;
cout<<"请输入想要转化的十进制数:"<<endl;
cin>>m;
for(i=15;i>=0;i--)
{
k=m%2;
j=m/2;
m=j;
a[i]=k;
}//用数组记录除以二的余数
for(i=0;i<16;i++)
{
cout<<a[i];//将除二余数倒序输出。
}
cout<<" ";
for(i=0;i<18;i++)
{ if(a[i]==1)
{
for(j=18;j>=i;j--)
{
a[j+1]=a[j];
}
a[i+1]=0;
}
cout<<a[i];
}
a[18]=1;a[19]=1;a[20]=0;
cout<<a[18]<<a[19]<<a[20]<<endl;//输出逗号所代表的值
a[21]=0,a[22]=0,a[23]=0,a[24]=0,a[25]=0;
for(i=13;i<25;i++)//根据不同的内态,不同的输入,会对图灵机上的输出造成的结果
{
if(s==0&&a[i]==0)
{
a[i]=0;
s=0;
for(j=0;j<21;j++)
{
cout <<a[j];
}
cout<<" ";
continue;//内态为0,输入为0时,输出为0,下一内态也为0
}
if(s==0&&a[i]==1)
{
a[i]=0;
s=1;
for(j=0;j<21;j++)
{
cout <<a[j];
}cout<<" ";
continue;//内态为0,输入为1时,输出为0,下一内态为1
}
if(s==1&&a[i]==0)
{
a[i]=1;
s=0;
for(j=0;j<21;j++)
{
cout <<a[j];}cout<<" ";
continue;
}//内态为1,输入为0时,输出为1,下一内态为0
if(s==1&&a[i]==1)
{
s=10;a[i]=0;
for(j=0;j<21;j++)
{
if(j==i)
{
a[j]=0;
}
cout <<a[j];}
cout<<" ";
continue;
}//内态为1,输入为1时,输出为0,下一内态为10
if(s==10&&a[i]==0)
{ a[i]=1;
s=11;
for(j=0;j<22;j++)
{
cout <<a[j];}
cout<<" ";
continue;
}//内态为10,输入为0时,输出为1,下一内态为11
if(s==11&&a[i]==0)
{
a[i]=1;
s=0;
for(j=0;j<23;j++)
{
cout <<a[j];
}//内态为11,输入为0时,输出为1,下一内态为0
cout<<" ";
break:
}
}
}
本程序是以书上的图灵机运行过程为最开始的模板,存在十进制数转二进制数,二进制数转化为图灵机编码的过程,整个过程比较流畅,但由于并非用字符串来完成会有一些在数组取之上的问题,在这个问题上必须严格把关,如果不注意,就会将机子上随机产生的乱码作为你前面数字输入完成后的占位所用的数字。会对自己的整个程序结果造成影响。