C语言模拟图灵机XN*2

一.实验目的
1 .掌握图灵机的概念和基本结构,理解图灵机的基本指令和编码方式;
2 .掌握图灵机的编程方法。
二.实验内容
3. 对于任意给定的一台Turing机和任意给定的字符串w ( w不含空格),编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。
三.算法设计
1.题目分析
对于XN*2 Turing机,输入正整数,执行完操作后,输出正整数。
step1:输入一个正整数,将正整数转化为二进制码;
step2:将二进制码转化成Turing机可执行的编码,在最后加上‘,’(0110);
step3:按内态规则执行编码,输出执行完成后的编码;
step4:将编码转化成二进制数;
step5:将二进制数转化为整数;
2.算法设计
a.输入一个整数
b.用数组b储存二进制数
c.历数组b,遇见0,数组c内存0,遇见1,给数组c存1,c的下一位存0,当b遍历完 在c的最后面加上110(‘,’的码)
d.设一个初始内态flag,遍历c时的数做为输入,根据规则判断输出,将输出重新放入c
e.将编码 转化为二进制码
f.将二进制码转化为整数
3.算法实现

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    int n,m,a[20],i=0,j,b[20],sum=0,x;
    printf("请输入一个正整数:");        //将十进制转化为二进制 
    scanf("%d",&n);
    memset(a,0,sizeof(a));     //初始化a,b
    memset(b,0,sizeof(b));
    while(n)
    {
        a[i++]=n%2;
        n/=2;
     }
    for(j=i,m=0;j>=0;j--)
    {
        b[m]=a[j];
        m++;
    }
    b[i+1]=3;             //将3设置为逗号
    printf("转化为二进制数:\n"); 
    for(j=0;j<i+1;j++)
    {
        printf("%d",b[j]);
    }
    printf("\n");
    int f,c[20],k=1;        //将二进制数转化为图灵机可识别的编码 
    memset(c,0,sizeof(c));
    for(i=0,j=0;i<20;i++)
    {
        if(b[i]==0)
        {
            c[j]=0;
            j++;
        }
        else if(b[i]==1)
        {
            c[j]=1;
            c[j+1]=0;
            j+=2;
        }
        else if(b[i]==3)    //将逗号 改为0110
        {
            c[j]=1;
            c[j+1]=1;
            c[j+2]=0;
            j+=3;
        }
    }
    printf("对二进制数进行再次的转化:\n");
    for(i=0;i<20;i++)
    {
        printf("%d",c[i]);
    }
    printf("\n");
    int flag=0;                    //进行图灵机的乘法运算 
    for(i=0;i<20;i++)
    {
        if(flag==0&&c[i]==0)
        {
        c[i]=0;
        }
        else if(flag==0&&c[i]==1)
        {
            flag=1;
            c[i]=0;
        }
        else if(flag==1&&c[i]==0)
        {
            flag=0;
            c[i]=1;
        }
        else if(flag==1&&c[i]==1)
        {
            flag=10;
            c[i]=0;
        }
        else if(flag==10&&c[i]==0)
        {
            flag=11;
            c[i]=1;
        }

        else if(flag==11&&c[i]==0)
        {
            flag=0;
            c[i]=1;
        }
    }
    printf("进行图灵乘法运算后的编码:\n");
    for(i=0;i<20;i++)
    {
        printf("%d",c[i]); 
    } 
    printf("\n");

    for(i=0;i<20;i++)            //将编码转化为二进制 
    {
        if(c[i]==1&&c[i+1]==1)    //将0110 改为逗号
        { 
            c[i]=3;
            c[i+1]=0;
            break;
        }
    }
    for(f=0;f<20;f++)
    {
        if(c[f]==1&&c[f+1]==0)    
        {
            for(m=f+1;m<20;m++)
            {
                c[m]=c[m+1];
            }
        }
        if(c[f]==3)        //x为数组长度
        {
            x=f;
        }
    }

    printf("将运算结果转化为二进制:\n");
    int d[20],s=0;
    for(i=0;i<20;i++)
    {
        if(c[i]!=3)          //将重新编号的二进制编码放入数组d
        {
            d[i]=c[i];
            s++;
        }
        else if(c[i]=3)
        {
            break;
        }
    }

    for(i=0;i<s;i++)
            printf("%d",d[i]);
        printf("\n");
    printf("将二进制转化为十进制得到最后的结果:\n");
    int leap=1;                     //   二进制转化为十进制
    for(j=s-1;j>-1;j--)
        {
            if(d[j]==1)
            {
                sum+=leap;
                leap*=2;
            }
            else
                leap*=2;
        }
    printf("%d\n",sum);
    return 0;
    }

4.调试、测试及运行结果
测试数据:3
输出数据:6
在这里插入图片描述

5.经验归纳
通过这次上机实验,理解了图灵机的基本运作,巩固了二进制和十进制之间的互相转化,实现了XN*2时运用了很多的语句,学会了用数组的长度去控制二进制数的位数。总的来说,程序不难,但是要认真仔细,态度要端正。程序不是特别完善,会加以改进。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值