2021-04-13

图灵机的实现
1.算法分析
首先将所给的十进制数转化为二进制,并将二进制数转化为收缩扩展的二进制编码,然后由初始内态0和输入,对应执行XN*2图灵机的指令,内态为0,输入为0时,内态和输入值不变,右移,输出输入值;内态为0,输入为1时,内态变为1,输入值变为0,右移,输出输入值;内态为1,输入为0时,内态变为0,输入值变为1,右移,输出输入值;内态为1,输入为1时,内态变为10,输入值变为0,右移,输出输入值;内态为10,输入为0时,内态变为11,输入值变为1,右移,输出输入值; 内态为11,输入为0时,内态变为0,输入值变为1,停止,输出输入,得到一个二进制数,最后将这个二进制数转化为十进制数。
2.概要设计
在这里插入图片描述
3.源代码

#include <iostream>
using namespace std;			//Xn*2的图灵机 

int BinarySystem(int z[],int p[],int x)		//将输入的十进制数转换为二进制输入到数组p[]
{
int num=0;                                          
 do//用除二求余法计算二进制
{
	z[num++]= x % 2;
           x= x / 2;
  }
while (x != 0);        
  for(int i = 0; i <= num - 1; i++)
          p[i]= z[num - 1 - i];
   for(int j=0; j<=num-1; j++)                     
           printf("%d",p[j]);
   printf("\n");
   return num-1;
}

int Binarynumber(int p[],int t[],int num)  //求扩展二进制,存在t[]中
{
   t[0]= 0;  
   int step=1;                                                                    
   for(int j=0;j<=num;j++)
   {
           if(p[j] == 1)
                    t[step++]= p[j];
           t[step++]= 0;
   }
   t[step++]=1;
   t[step++]=1;
   t[step]= 0;
   for(int k=0; k<=step; k++)     //检测此处是否正确
           printf("%d",t[k]);
   printf("\n");
   return step+1;  //记录拓展二进制的位数

}

int simulate_Turing(int t[],int count1)     //模拟过程
{
   int state=0,i=0,j=1;
   int count=count1;
   while(j)
   {
           if(state==0&&t[i]==0){
                    state=0;
                    t[i++]=0;}
           else	if(state==0&&t[i]==1){
                    state=1;
                    t[i++]=0;
           }
           else	if(state==1&&t[i]==0){
                    state=0;
                    t[i++]=1;
           }
           else	if(state==1&&t[i]==1){
                    state=10;
                    t[i++]=0;
           }
           else	if(state==10&&t[i]==0){
                    state=11;
                    t[i++]=1;
           }
          else if(state==11&&t[i]==0){
                    state=0;
                    t[i++]=1;
                    j=0;
           }
           if(i>=count)
                    count++;
           for(int k=0;k<count;k++)
                    printf("%d",t[k]);
           printf("\n");
   }
   return i+1;
}

int convert_Algorism(int p[],int t[],int count2)//将模拟后的拓展编码转换为二进制,存放在p[]中
{
   int m=0,n=0;
   int result=0;             //十进制结果
   int leap=1;                //二进制的位数
   while(m<count2-4)                  //最后三位是110,表逗号,不考虑
   {
           if(t[m]==t[m+1])             //相邻的俩个数相等是00的情况
           {
                    p[n]=0;             
                    n++;
                    m++;
           }
           else                                     //相邻的俩个数不相等是10或01的情况
           {
                    p[n]=1;                               
                    n++;
                    m=m+2;
           }
   }
   printf("\n");
   printf("模拟后的二进制为:");
   for(int i=1;i<n;i++)
           printf("%d",p[i]);
   printf("\n"); 
   for(int j=n-1;j>-1;j--)
   {
           if(p[j]==1)
           {
                    result+=leap;
                    leap*=2;
           }
           else
                    leap*=2;
   }
   return result;
}
int main() {
   int	x;                          // 模拟的数字 
   int	z[40]={0};             
   int	p[40]={0};           //存放二进制
   int	t[100]={0};          //存放拓展二进制 
   int	num;                    //求二进制时候的标志位 
   int	count1,count2;
   int	result;                  //使用图灵机模拟运算后的输出结果

   printf("请输入一个正整数x:");
   scanf("%d",&x);
   printf("该数字的二进制为:");
   num=BinarySystem(z,p,x);                               //返回数组下标
   printf("拓展编码:");
   count1=Binarynumber(p,t,num);                    //返回拓展二进位的数组下标
   printf("图灵机运行过程模拟:\n");
   count2=simulate_Turing(t,count1);                //返回每个运算后拓展二进制的位数
   result=convert_Algorism(p,t,count2);
   printf("计算结果为:%d",result);
   printf("\n");
   return 0;
}

``

4.测试结果

```mermaid
graph TD;
A-->B;
B-->C;

5.调试
6.心得体会
对于本次的课程设计,我们要完全了解XN*2图灵机的实现步骤,才能很好的对程序进行编写,运用了do while 等语句,解决问题的核心就在进制的转化,收缩拓展,以及内态输入指令的执行,其中还需要注意的是逗号转化为110,以及在程序设计中尽量使用简单函数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值