图灵机(XN*2)的转换(python编写)

1.算法分析
本课题由python编写,总共定义了zhaunhuan1()、zhuanhuan2()和yunxing()三个函数。Zhaunhuan1()用于将输入的十进制数字转换为二进制,并将二进制数转换为图灵机所需的二进制拓展码,yunxing()函数是(XN2)图灵机将1转换过来的二进制拓展码用if(elif)语句实现判断后的图灵机指令操作,zhuanhuan2()是将yunxing()函数操作后的二进制拓展码转换为标准的二进制码,并将二进制码转换为十进制码进行输出。最后调用这三个函数运行程序。
2.概要设计
图灵机(XN
2)在拓展的二进位上实现运算的指令:
0 0 0 0 R,
0 1 1 0 R,
1 0 0 1 R,
1 1 10 0 R,
10 0 11 1 R,
11 0 0 1 STOP。
3.测试
1、构建zhuanhuan()函数,将输入的十进制数转换为二进制,并将其再转换为用于图灵机计算的二进制拓展码,将此函数完成后并调用此函数进行测试,测试结果如下:
在这里插入图片描述
在这里插入图片描述

2、构建yunxing()函数,其功能是将转换过来的二进制拓展码利用图灵机(XN2)的指令进行转换,并将每一步骤转换的二进制拓展码输出。但测试后发现结果错误,根据pycharm提示的错误进行改正,并输出正确结果如下:
在这里插入图片描述
在这里插入图片描述
3、构建zhuanhuan2()函数,实现将图灵机(XN
2)运行的二进制拓展码转换为标准二进制码,并在将二进制码转换为十进制码并进行输出。但是测试的结果有错误,调试并参照pycharm给的提示之后改正代码,测试的正确结果如下:
在这里插入图片描述
在这里插入图片描述
4、所有函数测试完成之后,调用这三个函数运行测试程序,结果如下:
在这里插入图片描述

4.调试(对测试出的问题进行调试,界面截屏,调试修正编码)
在这里插入图片描述

1、测试zhuanhuan2()函数时,去除0时,第一次将转换后的二进制拓展码的0全部清除了,后面测试时发现最终结果与手算的结果不一样,于是进行调试并修改,但是运行之后发现还是错的,在之后的步骤中再一步调试。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、当测试zhuanhuan2()函数的时候,在运行界面上输入值时,发现转换后的二进制拓展码左侧的零都在,而右侧的零也在,但我已经编写了去除0的代码,于是调试之后,发现问题出现在我编写的那个去除0的代码上,我把去除左侧(lstrip())的0写成了右侧(rstrip()函数)。于是改正后调试后的代码如下:
在这里插入图片描述
5.心得体会(关键问题的解决思路及步骤总结)
遇到问题:十进制转换为二进制以及二进制拓展码老是测试错误,例如把‘,’转换为110时为了方便计算应该再给后面补上00,要不然算到最后总是出现错误。还有就是对python语句的掌握不是很熟悉,例如把去除二进制拓展码右边的0写成左边的0了,导致转换错误。定义全局变量list1(存放二进制编码的列表)和list2(存放内态),起初没有定义这两个全局变量,直接应用了,但当在其他函数中调用时出现问题,而添加了global关键字之后,就可以使全局变量的值改变,不然会成局部变量。
步骤总结:本课题是图灵机(XN2)的转换,用到了三个函数模块:1、输入的十进制转换为二进制拓展码。2、利用图灵机(XN2)在拓展的二进位上实现运算的指令对其二进制拓展码进行运算。3、第二个函数执行完之后,第三步对其转换后的拓展码还原成十进制并输出。
源代码:

def zhuanhuan1():
    global list1
    x=int(input("请输入一个正整数:\n"))
    y=bin(x).replace("0b",'0')  #将正整数x转换为二进制 并将0b替换为0
    print('二进制的编码为',end="")
    print(y)
    z=y+','   #在二进制数后面加上','
    a=z.replace('1','10')   #将1转换为10
    b=a.replace(',','11000')    #将','转换为110
    list1=list(b)    #将字符串转换为列表
    print("XN*2所需二进制拓展编码列表为:",end="")
    print(list1)    #输出二进制拓展码
def yunxing():    #图灵机的运行过程
    global list2
    list2=0 #内态
    for i,j in enumerate(list1):
        print("XN*2图灵机第%d次运行结果:"%(i+1),end="")
        if j=='0' and list2==0:
            list1[i]='0'
            list2=0
            print(list1)
        elif j=='1' and list2==0:
            list1[i]='0'
            list2=1
            print(list1)
        elif j=='0' and list2==1:
            list1[i]='1'
            list2=0
            print(list1)
        elif j=='1' and list2==1:
            list1[i]='0'
            list2=10
            print(list1)
        elif j=='0' and list2==10:
            list1[i]='1'
            list2=11
            print(list1)
        elif j=='0' and list2==11:
            list1[i]='1'
            list2=0
            print(list1)
    print("STOP")
def zhuanhuan2():
    s="".join(list1)   #将列表转换为字符串
    s1=s.replace('110',',')
    s2=s1.replace(',','')
    #s3=s2.replace('0','')   #error:去除所有的0
    s3=s2.lstrip('0')  #去除左侧所有的0
    print("XN*2运行完成后的编码:")
    print(s3)
    s4=s3.replace('10','1')
    print("转换为二进制编码为:",end="")
    print(s4)
    n=int(s4,base=2)
    print("最终结果为:",end="")
    print(n)
zhuanhuan1()
yunxing()
zhuanhuan2()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值