1.理解无符号数的识别过程
2.理解无符号数的状态矩阵变化过程,如下图:(图片引自老师PPT,仅供学习使用,侵权删)
1213ddas------>当前状态为1 时,添加判断条件是否为“ ”(一个空格),若为一个空格返回 w,其他返回"error"。
211e132dsf------>当前状态为6 时,添加判断条件是否为“ ”(一个空格),若为一个空格返回 (w * (10 ** (e * p - n))),其他返回"error"。
12.132dsd------>当前状态为2 时,添加判断条件是否为“ ”(一个空格),若为一个空格返回 (w * (10 ** (e * p - n))),
其他返回"error"。
基本步骤:
1.输入字符串(python中输入均为str),识别串是否为无符号数 数字字符串即可
2.在字符串后加一个空格,用来判断串是否结束
3.选取每一位,将状态和取到的字符通过上表进行变化
4.输出结论
源码:
"""
state: 0, 1, 2, 3, 4, 5, 6, error, 正确
"""
d = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
def zore(i, w, n, p, e):
"""
:param i: 当前取到的字符
:param w: 尾数累加器
:param n: 十进制数小数位数累加器
:param p: 指数累加器
:param e: 十进制指数的符号
:return: state, i, w, n, p, e
"""
state = 0
if i in d:
w = w * 10 + int(i)
state = 1
return state,i, w, n, p, e
elif i == ".":
state = 3
return state,i, w, n, p, e
else:
state = "error"
print("%s <---- %s" % (i, state))
return state, i, w, n, p, e
def one(i, w, n, p, e):
"""
:param i: 当前取到的字符
:param w: 尾数累加器
:param n: 十进制数小数位数累加器
:param p: 指数累加器
:param e: 十进制指数的符号
:return: state, i, w, n, p, e
"""
if i in d:
w = w * 10 + int(i)
state = 1
return state,i, w, n, p, e
elif i == ".":
state = 2
return state,i, w, n, p, e
elif i == "e" or i == "E":
state = 4
return state, i, w, n, p, e
elif i == " ":
print(w)
state = "正确"
return state, i, w, n, p, e
else:
state = "error"
print("%s <---- %s" % (i, state))
return state, i, w, n, p, e
def two(i, w, n, p, e):
"""
:param i: 当前取到的字符
:param w: 尾数累加器
:param n: 十进制数小数位数累加器
:param p: 指数累加器
:param e: 十进制指数的符号
:return: state, i, w, n, p, e
"""
if i in d:
n = n + 1
w = w * 10 + int(i)
state = 2
return state, i, w, n, p, e
elif i == "e" or i == "E":
state = 4
return state, i, w, n, p, e
elif i == " ":
print(w * (10 ** (e * p - n)))
state = "正确"
return state, i, w, n, p, e
else:
state = "error"
print("%s <---- %s" % (i, state))
return state, i, w, n, p, e
def three(i, w, n, p, e):
"""
:param i: 当前取到的字符
:param w: 尾数累加器
:param n: 十进制数小数位数累加器
:param p: 指数累加器
:param e: 十进制指数的符号
:return: state, i, w, n, p, e
"""
if i in d:
n = n + 1
w = w * 10 + int(i)
state = 2
return state, i, w, n, p, e
else:
state = "error"
print("%s <---- %s" % (i, state))
return state, i, w, n, p, e
def four(i, w, n, p, e):
"""
:param i: 当前取到的字符
:param w: 尾数累加器
:param n: 十进制数小数位数累加器
:param p: 指数累加器
:param e: 十进制指数的符号
:return: state, i, w, n, p, e
"""
if i in d:
p = p * 10 + int(i)
state = 6
return state,i, w, n, p, e
elif i == "+":
state = 5
return state,i, w, n, p, e
elif i == "-":
e = -1
state = 5
return state, i, w, n, p, e
else:
state = "error"
print("%s <---- %s" % (i, state))
return state, i, w, n, p, e
def five(i, w, n, p, e):
"""
:param i: 当前取到的字符
:param w: 尾数累加器
:param n: 十进制数小数位数累加器
:param p: 指数累加器
:param e: 十进制指数的符号
:return: state, i, w, n, p, e
"""
if i in d:
p = p * 10 + int(i)
state = 6
return state, i, w, n, p, e
else:
state = "error"
print("%s <---- %s" % (i, state))
return state, i, w, n, p, e
def six(i, w, n, p, e):
"""
:param i: 当前取到的字符
:param w: 尾数累加器
:param n: 十进制数小数位数累加器
:param p: 指数累加器
:param e: 十进制指数的符号
:return: state, i, w, n, p, e
"""
if i in d:
p = p * 10 + int(i)
state = 6
return state, i, w, n, p, e
if i == " ":
print(w * (10 ** (e * p - n)))
state = "正确"
return state, i, w, n, p, e
else:
state = "error"
print("%s <---- %s" % (i, state))
return state, i, w, n, p, e
if __name__ == "__main__":
w = 0 # 尾数累加器
p = 0 # 指数累加器
n = 0 # 十进制数小数位数累加器
e = 1 # 十进制指数的符号
str_float = input("请输入一个串(判断是否为无符号数):")
str_float_1 = str_float + " " # 字符串后加一个空格用来判断串已结束
d = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
state = 0 # state为状态
for i in str_float_1:
if state == 0:
state,i, w, n, p, e = zore(i, w, n, p, e)
elif state == 1:
state, i, w, n, p, e = one(i, w, n, p, e)
elif state == 2:
state, i, w, n, p, e = two(i, w, n, p, e)
elif state == 3:
state, i, w, n, p, e = three(i, w, n, p, e)
elif state == 4:
state, i, w, n, p, e = four(i, w, n, p, e)
elif state == 5:
state, i, w, n, p, e = five(i, w, n, p, e)
elif state == 6:
state, i, w, n, p, e = six(i, w, n, p, e)
print("%s<-----%s" % (str_float, state))
测试:
输出将原有的无符号数 数字字符串转换成 float输出,在python中float类型小数位数变多后会出现损失
出现损失,如下图:(第一行为输入,第二行为计算出来的值,出现损失,第三行为结论)