图灵机的编程实现
一、題目分析:
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:
}
}
}
? ? ? ?本程序是以書上的圖靈機運行過程為最開始的模板,存在十進制數轉二進制數,二進制數轉化為圖靈機編碼的過程,整個過程比較流暢,但由于并非用字符串來完成會有一些在數組取之上的問題,在這個問題上必須嚴格把關,如果不注意,就會將機子上隨機產生的亂碼作為你前面數字輸入完成后的占位所用的數字。會對自己的整個程序結果造成影響。
??
總結
- 上一篇: 虚拟机中输入ifconfig不显示ip地
- 下一篇: 网站设计开发的步骤和方法!