作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/7631。
代码地址:https://e.coding.net/wangkefei/f4.git。
结对伙伴:徐姗姗
功能1. 四则运算:支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答。
重点:导入 random 模块,运用random()函数,随机生成数字和运算符号。eval()函数实现计算运算式正确答案,与用户输入的结果进行比较,相等即回答正确,否则错误。
定义变量k用于计算回答正确数目。
代码:
import random def generate(): ope = ['+', '-', '*', '/'] num1 = random.randint(1, 10) # 随机生成1-10之间的数字 num2 = random.randint(1, 10) num3 = random.randint(1, 10) num4 = random.randint(1, 10) ope1 = random.choice(ope) # 随机生成运算符 ope2 = random.choice(ope) ope3 = random.choice(ope) exp = str(num1) + str(ope1) + str(num2) + str(ope2) + str(num3) + str(ope3) + str(num4) return exp ret = [] for i in range(20): ret.append(generate()) k = 0 for el in ret: print(el) print('?', end="") answer = float(input()) if answer == eval(el): # eval()计算表达式的值 k += 1 print('答对啦,你真是个天才!') else: print('再想想吧,答案似乎是%d喔!' % (eval(el))) print('你一共答对%d道题,共20道题。' % k)
运行截图:
功能2. 支持括号。
重点:定义一个括号列表,随机生成列表的下标,表示生成左括号、右括号或不生成括号。生成括号的位置利用多层判断进行表示。
代码:
ope = ['+', '-', '*', '/'] bra = ['(', '', ')'] # 0:生成左括号 1:不生成括号 2:生成右括号 num1 = random.randint(1, 10) num2 = random.randint(1, 10) num3 = random.randint(1, 10) num4 = random.randint(1, 10) ope1 = random.choice(ope) ope2 = random.choice(ope) ope3 = random.choice(ope) left1 = random.randint(0, 1) left2 = random.randint(0, 1) left3 = random.randint(0, 1) right1 = random.randint(1, 2) right2 = random.randint(1, 2) right3 = random.randint(1, 2) if left1 == 0: # 括号成对出现的情况 left2 = 1 left3 = 1 if right1 == 2: right2 = 1 right3 = 1 else: right2 = 2 right3 = 1 else: if left2 == 0: left3 = 1 right1 = 1 if right2 == 2: right3 = 1 else: right3 = 2 else: left3 = 0 right1 = 1 right2 = 1 right3 = 2 exp = bra[left1] + str(num1) + str(ope1) + bra[left2] + str(num2) + # 在功能一的算术式中加入括号可能出现的位置 bra[right1] + str(ope2) + bra[left3] + str(num3) + bra[right2] + str(ope3) + str(num4) + bra[right3] return exp
运行截图:
功能3. 限定题目数量,"精美"打印输出,避免重复。
重点:argparse()模块,用于用于解析命令行参数和选项。
重点代码:
if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument("-c", "--cin") args = parser.parse_args() if args.cin is None: f4().unlimited() else: f4().limited(args.cin)
运行截图:
功能4. 支持分数出题和运算。
重点:运用fractions 模块,用来执行包含分数的数学运算。
重点代码:
num1 = random.uniform(0, 1) num1 = random.Fraction(num1).limit_denominator(10) num2 = random.uniform(0, 1) num2 = random.Fraction(num2).limit_denominator(10)
def answer(self, eq): from fractions import Fraction as f answer = f(eval(eq)).limit_denominator(1000) answer = str(answer) return answer
运行截图:
总结与体会:
1.结对编程的体会
第一次进行两个人组队编程,比本科期间的多人组队更加直接,效率更高。两个人坐在一起使用同一台电脑这种方式沟通起来更快,尤其是自己不好理解的问题,两个人可以互通有无。首先现有整体思路很重要,两个人商量后决定用python语言编写。以往自己编写代码的时候,经常会有bug改不过来,或者功能无法实现却找不出原因的情况。两个人共同编写就会多了一个思路,在一个人“走进死胡同”的时候能多提供一条路。这次作业对我来说有些困难,一开始思路不够清晰,python也是初学的一门语言,但好在比较简洁易懂,不是很复杂,但也花费了比想象长很多的时间。
2.至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件
(1)了解python函数花费时间较长但是收获最大。python有很多内置函数能实现很多功能,例如这次作业中的eval()、random()等,通过上网查找函数及其语法,将函数运用到程序中,比较方便。
(2)刚开始浏览完题目后认为重点在于逆波兰,于是直接搜索了python逆波兰相关的知识,理解了中缀转后缀,括号及运算符压栈和弹栈的原理,也花费了较长时间。但是后来发现python自带的eval()函数可以让电脑自动运算带有括号的运算式,不需要逆波兰也可以算出正确的结果。虽然逆波兰没有应用到代码中,但是了解了原理,也有很大收获。
(3)功能二添加括号很难实现,花费时间很长。开始没有思路,师兄提示了思路,我俩又参考了师兄的过去的代码,修改并结合到功能一中才得以实现。
(4)在编程过程中,将脑中的思路变成实际的代码对我来说是最困难的事。由于编程能力太弱,即使有了思路,也很难用双手实践出来。还好结对编程的过程中,同伴能够给予帮助,虽然花费时间长,但有很大收获。
(5)功能四中添加了argparse()模块,用于用于解析命令行参数和选项,在了解模块和加以运用上花费了较长时间,但同时也是收获最大的事件。
3、给出照片1张,包括结对的2位同学、工作地点、计算机,可选项包括其他能表达结对编程工作经历的物品或场景。
工作地点:计算机楼410室
计算机:实验室电脑
照片: