此作业的要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/7631
结对伙伴:罗杨美惠
- 开发环境是 windows
- 开发工具是 pycharm
- Python语言版本为 3.7
- 版本控制选用 Git
功能一:四则运算
支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答 (提示:1/3 != 0.33333333333333333333333333333333,而是无限长)。
为了快出成果,你快速造个控制台的版本,包括以后改版成更优秀界面的核心功能,并考虑到扩展。
1.1 重难点
能够列出随机的四则运算表达式,计算表达式的结果然后接收用户输入的答案并和正确结果比较。随机操作数和函数用python自带的随机函数获取,利用input()函数输入答案,再用eval和Fraction转成数字。
1.2 编程体会
在实现功能一时花费了极大的精力,因为各种随机函数都需要去查阅,边写边学python的状态,平常还是要多积累这样用到的时候就不会浪费太多精力。
1.3 重要代码展示
def integer(): ch = [] #存储表达式 number = random.randint(1, 5) #随机产生表达式的数量 for i in range(number): rand = random.randint(0, 1) a = func_integer(number) #调用表达式产生函数,产生表达式 if rand == 0: op = operation[random.randint(0,3)] rand = random.randint(0, 1) if i != number - 1: if rand == 0: ch.append('(') ch.append(a) ch.append(op) ch.append(random.randint(1,10)) ch.append(')') ch.append(operation[random.randint(0, 3)]) else: ch.append(a) ch.append(operation[random.randint(0, 3)]) else: ch.append(a) ch.append(operation[random.randint(0, 3)]) else: ch.append(a) ch.append(operation[random.randint(0, 3)]) kuohao = [] f = '' for k,i in enumerate(ch): if k != len(ch)-1: f += str(i) for i in f: if i.isdigit() == False: if i == '+': kuohao.append(0) elif i == '-': kuohao.append(1) elif i == '*': kuohao.append(2) elif i == '/': kuohao.append(3) else: kuohao.append(i) result_integer(f, ch, kuohao)
1.4 运行截图
功能2. 支持括号
老师看了你的表演,大大赞赏了你。然后她说,"你的题库里怎么都是没有括号的题呢,我记得你当初括号就掌握得不好啊。"你的脸红了,对老师说,"给我2个小时时间,我给你一个新版本,有括号的。"
2.1 重难点
生成括号,用函数随机生成括号,避免无用括号。
2.2 编程体会
对于生成括号,有很多问题需要解决,比如无效括号的解决即主要比较括号里的符号和右括号右边符号的优先级,括号里的优先级高于右括号右边符号的优先级,则为无用括号。
通过编程发现了许多问题,然后去解决问题不断优化。
2.3 代码片段
def judge(f, ch): p1 = -1 #左括号的左符号 p2 = -1 #右括号的右符号 que = [] #判断各组符号是否为有用,False为无用,True为有用 for k, i in enumerate(ch): p = [] if i == '(' and k == 0: for j in range(1, len(ch)): if ch[j] != '(' and ch[j] != ')' and ch[j] >= 0: p.append(ch[j]) elif ch[j] == ')': for n in range(j + 1, len(ch)): if ch[n] != ')' and ch[n] >= 0: p2 = ch[n] break else: continue break else: continue if len(p) == 1: if (p[-1] == 0 or p[-1] == 1) and (p2 == 0 or p2 == 1): que.append(False) elif (p[-1] == 2 or p[-1] == 3): que.append(False) else: que.append(True) if len(p) > 1: if p2 == 0 or p2 == 1: que.append(False) elif (p2 == 3 or p2 == 4) and (0 not in p or 1 not in p): que.append(False) else: que.append(True) if i == '(' and k != 0: p1 = ch[k - 1] for j in range(k + 1, len(ch)): if ch[j] != '(' and ch[j] != ')' and ch[j] >= 0: p.append(ch[j]) elif ch[j] == ')': if j != len(ch) - 1: for n in range(j + 1, len(ch)): if ch[n] != ')' and ch[n] >= 0: p2 = ch[n] # break else: continue break else: p2 = -1 else: continue if len(p) == 1: if p1 == 3: que.append(True) elif p1 == 2 and (0 == p[-1] or 1 == p[-1]): que.append(True) elif p1 == 1 and (0 == p[-1] or 1 == p[-1]): que.append(True) elif p1 == 0 and (0 == p[-1] or 1 == p[-1]) and (p2 == 3 or p2 ==2): que.append(True) else: que.append(False) else: if p1 == 3: que.append(True) elif p1 == 1 and (1 in p or 0 in p): que.append(True) elif p1 == 2 and (0 in p or 1 in p): que.append(True) elif p1 == 0 and (0 in p or 1 in p) and (p2 == 3 or p2 ==2): que.append(True) else: que.append(False) return que
2.4 运行截图
功能四
重难点:python中的函数eval可以计算表达式的结果,但结果可能会为分数,可以利用库fractons中的一个函数Fraction,把输出的结果全转成分数,所以整数的不变,小数的变分数。我们没有完全做出分数的运算只是可以解决真分数,可以把表达式的结果转成分数
代码截图:
def func_integer(number): f = '' ch = [] rand = random.randint(0, 1) if number != 1: if rand == 0: ch.append('(') op = operation[random.randint(0, 3)] ch.append(random.randint(1, 10)) ch.append(op) ch.append(random.randint(1, 10)) ch.append(')') else: op = operation[random.randint(0, 3)] if op == '/': a = random.randint(1, 10) ch.append(a) ch.append(op) ch.append(random.randint(a, 10)) else: ch.append(random.randint(1, 10)) ch.append(op) ch.append(random.randint(1, 10)) else: op = operation[random.randint(0, 3)] if op == '/': a = random.randint(1, 10) ch.append(a) ch.append(op) ch.append(random.randint(a, 10)) else: ch.append(random.randint(1, 10)) ch.append(op) ch.append(random.randint(1, 10))
n = eval(f) n = Fraction('{}'.format(n)).limit_denominator() # 把表达式的结果转成分数
五 花费较长的时间的事件
(1)我们在使用何种语言时产生了分歧,罗杨美惠同学善于使用Java语言,我认为python比较好用,虽然不如JAVA熟悉,但我们可以边学边敲代码。最后选择了python.
(2)我们在选取随机函数和应用时,因为不熟悉python的函数库,查找资料用了很长时间。
(3)我们在做括号功能时,发现许多无用括号,解决这个问题花费较长时间。
(4)对于结对编程,我们分工明确,提高了效率,让我收获了团结就是力量。
(5)找测试用例分析Bug花费了较长时间,考虑了很多情况。
六 照片
工作地点:星华公寓B320
计算机:徐丽君同学的笔记本
七 版本控制
https://e.coding.net/xulijun/sizeyunsuanzuizhongban.git