20180925-6 四则运算试题生成
本作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2148
本次代码地址:https://git.coding.net/y45777704/f4final.git
其中f41文件夹,dist中f4.exe为功能1代码(原始功能)地址:https://coding.net/u/y45777704/p/f4final/git/tree/11/f41/dist
f42文件夹,dist中f4为功能2代码(加括号功能)地址:https://coding.net/u/y45777704/p/f4final/git/tree/11/f42/dist
f4final文件夹,dist中f4为功能3、4代码。地址:https://coding.net/u/y45777704/p/f4final/git/tree/11/f4final/dist
功能1. 四则运算要求随机生成四则运算包括加减法。
结对编程对象:杨磊
功能:随机生成运算式。
代码部分:定义函数f4,重点是用random随机生成数字,并把运算符赋值给operator1。
class f4(object): def __init__(self): pass def _f4(self): from random import randint from random import uniform from fractions import Fraction operator1 = ['+', '-', '*', '/']
#定义等式equal
equal = str(a) + operator1[x]+ str(b)+ operator1[y] + str(c) + \
operator1[z] + str(d)
#定义正确答案answer_right,用此变量对比输入(input),如果相等就证明答案正确,输出答对了;如果相比不相等则说明答案错误,输出:再想想吧,答案似乎是_。
for i in range(20): equal_1 = f4()._f4() print(equal_1, "=") answer_right = f4()._f4_answer(equal = equal_1) _ans = input("?") if _ans == answer_right: print("答对啦,你真是个天才!") m = m + 1 else: print("再想想吧,答案似乎是", answer_right, "喔!") n = n + 1 print("你一共答对", m, "道题,一共20道题。")
功能测试:
功能: 加括号
代码部分
#在4个数字之间分别判断是否加入括号,定义left_1,left_2,left_3,right_1,right_2,right_3,共6个变量
left_1 = randint(0, 1) left_2 = randint(0, 1) left_3 = randint(0, 1) right_1 = randint(1, 2) right_2 = randint(1, 2) right_3 = randint(1, 2) if left_1 == 0: left_2 = 1 left_3 = 1 if right_1 == 2: right_2 = 1 right_3 = 1 else: right_2 = 2 right_3 = 1 else: if left_2 == 0: left_3 = 1 right_1 = 1 if right_2 == 2: right_3 = 1 else: right_3 = 2 else: left_3 = 0 right_1 = 1 right_2 = 1 right_3 = 2
因此,表达式也更新为:
equal = operator2[left_1] + str(a) + operator1[x] + operator2[left_2] + str(b) + \ operator2[right_1] + operator1[y] + operator2[left_3] + str(c) + operator2[right_2] + \ operator1[z] + str(d) + operator2[right_3]
测试图片:
功能:数量及打印txt
代码:
if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument("-c", "--cin") args = parser.parse_args() if args.cin == None: f4()._f4_input() else: f4()._f4_integer_parser(args.cin)
测试结果
功能:加分数 此方法借鉴了网上的其他大神的想法,就是随机生成浮点数,再用Python中limit_denominator(10)函数强制转换为分母不大于10的分数,代码:
a = randint(1, 15) a = Fraction(a).limit_denominator(10) b = randint(1, 15) b = Fraction(b).limit_denominator(10) c = randint(1, 15) c = Fraction(c).limit_denominator(10) d = randint(1, 15) x = randint(0, 2) y = randint(0, 3) z = randint(0, 3)
测试图片:
编程体会:刚开始我们两个人对程序没有任何思路,只是想到把运算符赋值给变量,再生成等式在运算符中随机抽取,重点是找到了随机生成函数,于是开始展开编程工作。其中最大的难点在于括号的问题,刚开始在这个问题上面两个人的想法很不一样,杨磊是想用后缀表达式编写,但是这部分他尝试失败了,只能用我的笨方法——每生成一个数字之前都要判断是否出现括号。当然,结对编程最大的好处就是可以融合两个人的想法,从而实现优化程序的目的。反复争论及耗时的事件:1语言选择(C语言与Python的选择)2是否使用后缀表达式。3命令行参数处理。4借鉴他人方法实现分数功能。5运行过程中编译失败,找语法错误。