第二章上机
题目分析
题目:xn*2的图灵机实现
语言:Python 运行环境:pycharm
输入:十进制数
转换成二进制
转换成扩展形式
通过命令运算
转换成收缩形式
转换成十进制
输出:十进制数
算法构造
1>二进制转换成十进制:采用除二倒取余法
2>十进制转换成二进制:采用按权值展开求和的方法
3>二进制的扩展形式:将一个个二进制用0***0之间的1的数量来表示,并用2来作为两个数之间的分隔
4>二进制的收缩形式:将0***0之间的1的个数求出,并还原成二进制
5>图灵机的命令实现:根据当前内存和当前输入进行判断,改变内存状态和输出,一直到执行了stop命令停止
python代码实现
import math
print(“XN*2实现”)
print(“请输入数”)
num=int(input())
def Ejinz(x): #二进制转换
s=str()
while x!=0:
p=x%2
s=str§+s
x=x//2
return s
def shijinz(x):#十进制转换
sum=0
for i in range(len(x)):
sum+=int(x[i])*pow(2,len(x)-i-1)
return sum
def kuozhang(str1): #转换成扩展形式
str2=str()
for i in range(len(str1)):
if(str1[i]== “1”):
str2=str2+“10”
else:
str2=str2+“0”
str2+=“110”
return str2
def shoushuo(str3) :#转化成收缩模式
str4=str()
p=0
for j in range(len(str3)):
if(str3[j]“1”):
p=p+1
else:
if(p1):
p=0
str4+=“1”
else:
if(p==0):
str4+=“0”
else:
p=0
return str4
def minglin( str5 ):#命令实现
str5=“0”+str5
str5+=“00”
print(str5)
h=0 #当前的内存状态
for k in range(len(str5)):
if(h0 and str5[k]“0”):
h=0
str5=str5[:k]+“0”+str5[k+1:]
print(str5)
continue
if(h0 and str5[k]“1”):
h=1
str5 = str5[:k] + “0” + str5[k+1 :]
print(str5)
continue
if(h1and str5[k]“0”):
h=0
str5 = str5[:k] + “1” + str5[ k+1 :]
print(str5)
continue
if(h1and str5[k]“1”):
h=10
str5 = str5[:k] + “0” + str5[ k+1 :]
print(str5)
continue
if(h10and str5[k]“0”):
h=11
str5 = str5[:k] + “1” + str5[ k +1:]
print(str5)
if(h11and str5[k]“0”):
h=0
str5= str5[:k] + “1” + str5[k+1 :]
print(str5)
break
return str5
y=Ejinz(num) #y二进制
s=kuozhang(y) #s扩展形式
s1=minglin(s) #s1命令结果
s2=shoushuo(s1) #s2收缩形式
num1=shijinz(s2) #num1结果
print(“结果是”,num1)
测试,调试,运行结果
测试,调试
(1)测试二进制转换的准确性:
测试代码:num=int(input())
a=Ejinz(num)
print(a)
(2)测试十进制转换的准确性
测试代码:num=int(input())
a=shijinz(num)
print(a)
(3)测试扩展函数的准确性
测试代码:num=input()
a=kuozhang(num)
print(a)
(4)测试收缩代码的准确性
测试代码:num=input()
a=shoushuo(num)
print(a)
(5)测试命令结果的准确性
测试代码:num=input()
a=minglin (num)
print(a)
运行结果
总结
Python使用的不是很熟练,总是忘记在if和for后面忘记加:,所以编译老是错误。
对函数范围缩进的使用不是很熟练,习惯使用大括号,导致很多的if和for因为作用域的问题导致运行不出来。
字符串的使用,Python里面的字符串不可更改,无法使用是s[i]这种形式进行更改,经过百度,发现有两种方法,一是使用字符串序列切片方式,我采用的就是这种方法,二就是采用将字符串转换成列表后修改值,然后使用join函数组成新的字符串。