1.算法分析
本课题由python编写,总共定义了zhaunhuan1()、zhuanhuan2()和yunxing()三个函数。Zhaunhuan1()用于将输入的十进制数字转换为二进制,并将二进制数转换为图灵机所需的二进制拓展码,yunxing()函数是(XN2)图灵机将1转换过来的二进制拓展码用if(elif)语句实现判断后的图灵机指令操作,zhuanhuan2()是将yunxing()函数操作后的二进制拓展码转换为标准的二进制码,并将二进制码转换为十进制码进行输出。最后调用这三个函数运行程序。
2.概要设计
图灵机(XN2)在拓展的二进位上实现运算的指令:
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()函数,实现将图灵机(XN2)运行的二进制拓展码转换为标准二进制码,并在将二进制码转换为十进制码并进行输出。但是测试的结果有错误,调试并参照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()