此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11245]
结对对象:马艺明同学
coding地址:[https://e.coding.net/kaixindebenxiaohaiya/four-operations/four_operations.git]
一、代码说明:选择语言为python; 开发环境为PyCharm; python版本为:3.8.6
我们对作业中的功能一、二、三合并编程实现。
功能1. 四则运算 功能2. 支持括号
支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答 (提示:1/3 != 0.33333333333333333333333333333333,而是无限长)。
老师看了你的表演,大大赞赏了你。然后她说,"你的题库里怎么都是没有括号的题呢,我记得你当初括号就掌握得不好啊。"你的脸红了,对老师说,"给我2个小时时间,我给你一个新版本,有括号
主要代码如下:
def create_formula(): # 随机生成算式
equation = []
for i in range(3): # 随机生成前三个数字和操作符
equation.append(random.randint(0, 10)) # 随机生成0到100的整数型随机数
equation.append(operator[random.randint(0, 3)]) # 为随机生成操作符生成0到3的整数型随机数
equation.append(random.randint(0, 10)) # 随机在0到100内生成第四个数字
p = random.randint(1, 5) # 括号存在的位置
if p == 1: # 括号括前两位数字
equation.insert(0, "(")
equation.insert(4, ")")
elif p == 2: # 括号括前三位数字
equation.insert(0, "(")
equation.insert(6, ")")
elif p == 3: # 括号括二三位数字
equation.insert(2, "(")
equation.insert(6, ")")
elif p == 4: # 括号括后三位数字
equation.insert(2, "(")
equation.append(")")
elif p == 5: # 括号括后两位数字
equation.insert(4, "(")
equation.append(")")
return equation
功能一、二运行截图:
- 重点:通过使用random函数,随机生成四个整数作为运算数及三个四则运算符。
- 难点:难点主要是需要考虑括号的位置,怎么把括号随机插入到表达式中。
功能3. 限定题目数量,"精美"打印输出,避免重复
主要代码如下:
def function_three(n):
n = int(n)
i = 0
while i in range(n):
i = i+1
formula = create_formula() # 生成表达式
re_formula = inverse_polish(formula)
result = calculate(re_formula)
if result is False or len(str(result)) > 15:
i = i - 1
continue
if i == 1:
if os.path.exists("题目输出.txt"):
os.remove("题目输出.txt")
write_file(formula, result) # 将结果输入文件
功能三运行截图:
- 重点:功能三重点是是现在控制台输入,并且要确保输入的数是正整数。
- 难点:将结果输出到文件并且精美输出,输出格式是我们讨论了很久的问题。
功能4. 支持分数出题和运算
她的题目还要求支持分数运算,你不禁想到了功能1中你特意规避了一些题目不出。她想要的是下面的样子:
这个问题我们有参考往届学长的一部分代码,井进行修改。
主要代码如下:
priority = {"+": 1, "-": 1, "*": 2, "/": 2} # 对优先级的定义
while i < n:
i = i + 1
first_num = random.randint(1, 10)
second_num = random.randint(1, 10)
third_num = random.randint(1, 10)
fourth_num = random.randint(1, 10)
if second_num == 1:
x = first_num
else:
x = fractions.Fraction(first_num, second_num) # 第一个数是分子、第二个是分母
if fourth_num == 1:
y = second_num
else:
assert isinstance(fourth_num, object)
y = fractions.Fraction(second_num, fourth_num)
fifth_num = random.randint(1, 10)
sixth_num = random.randint(1, 10)
a = random.choice("+-*/")
b = random.choice("+-*/")
c = random.choice("+-*/")
list0 = [x, a, y, b, fifth_num, c, sixth_num]
equation = " ".join('%s' % id for id in list0)
stack = PyStack()
stack.push(x)
stack.push(y)
if priority[b] > priority[a]: # 先算第二个第三个数
stack.push(operate(stack.pop(), fifth_num, b))
if priority[c] > priority[a]: # 再算四个数字
stack.push(operate(stack.pop(), sixth_num, c))
stack.push(operate(stack.pop(), stack.pop(), a))
else: # 再算第一个数字
stack.push(operate(stack.pop(), stack.pop(), a))
# 再算最后一个
stack.push(operate(stack.pop(), sixth_num, c))
else: # 先算第一个第二个
stack.push(operate(stack.pop(), stack.pop(), a))
if priority[c] > priority[b]: # 再算第三第四个
if len(str(operate(fifth_num, sixth_num, c))) > 15:
i = i-1
continue
stack.push(operate(fifth_num, sixth_num, c))
stack.push(operate(stack.pop(), stack.pop(), b))
else:
stack.push(operate(stack.pop(), fifth_num, b))
stack.push(operate(stack.pop(), sixth_num, c))
print('%-30s %-30s' % (equation+'=', stack.pop()))
功能四运行截图:
- 重点:首先确保前两位是分数,后面两位是整数在根据运算符优先级进行计算
- 难点:在确保前两位是分数的前提下,再随机生成两位数和两个操作符,并根据运算符优先级进行计算得出结果
二、结对编程的体会(在编码、争论、复审等活动中花费时间较长,给你较大收获的事件)
(1)首先在语言选择上就讨论了挺久,一开始打算用C语言编写,毕竟现在对python还没有对C熟悉,但通过分析题目以及查阅资料,发现如果用C会比较麻烦,python中的一些功能可以直接实现,所以最后决定用python编写,同时也能提高我俩的python能力。
(2)在编码过程中,我之前没怎么有写注释的习惯,在这次编程过程中,马艺明同学一直提醒我要及时写注释,这样方便以后回来检查。我们对于怎样将列表中的元素组合成一个完整的算式问题讨论了很久,最后通过查阅资料发现可以用join函数可以连接起来。
(3)在处理括号问题的时候,考虑了括号的位置,一共有几种情况,然后再程序里逐一实现。
(4)在生成逆波兰表达式的时候,一开始不记得怎么写逆波兰表达式了,查阅资料先学习了什么是逆波兰表达式
(5)python中代码要求规范,比如数字和操作符之间有空格,不打空格就会给你波浪线提示。
三、结对开发的截图证据: