此作业要求参见:[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/f4/git/tree/11/f41/dist
f42文件夹,dist中f4为功能2代码(加括号功能)地址:https://coding.net/u/y45777704/p/f4/git/tree/11/f42/dist
f4final文件夹,dist中f4为功能3、4代码。地址:https://coding.net/u/y45777704/p/f4/git/tree/11/f4final/dist
本次作业用python实现
结对编程对象:杨金铭
需求分析:
功能一:支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答 ;
功能二:支持括号,所出题包含括号;
功能三:限定题目数量,"精美"打印输出,避免重复;
功能四:支持分数出题和运算;
要求1 参考《构建之法》第4章两人合作,结对编程上述功能。 (1) 给出每个功能的重点、难点、编程收获。(2)给出结对编程的体会,以及 (3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。
功能一:
重点难点:看到题目后首先想到的就是如何能够实现生成随机数,因为基础比较差所以通过了大量的资料查阅,最后选择了random.randint()方法,在python中的random.randint(a,b)用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b。然后生成表达式,随机生成数的范围取得是[0,15]
部分代码如下:
def _f4(self): from random import randint operator1 = ['+', '-', '*', '/'] 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 a = randint(1, 15) b = randint(1, 15) c = randint(1, 15) d = randint(1, 15) x = randint(0, 2) y = randint(0, 3) z = randint(0, 3) equal = str(a) + operator1[x]+ str(b)+ operator1[y] + str(c) + operator1[z] + str(d) return (equal)
实现截图:
功能二:
重点难点:在试题中添加括号,保证括号得成对出现,以及在正确的位置出现,运用了枚举的方法
部分代码如下:
operator2 = ['(', '', ')'] 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]
实现截图:
功能三:
重点难点:运用argparse模块来处理命令行参数,加入判断输入题目数必须是正整数,根据输入的参数输出试题的数量,并写入txt文件,运用ljust()方法,返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串,使得表达式左对齐,答案对齐
部分代码如下:
def _f4_integer_parser(self,x): _p = "题目数量必须是正整数。" try: x = int(x) if x >= 0: for i in range(x): _eq = f4()._f4() _right = f4()._f4_answer(eq = _eq) _eq = _eq + "=" print(_eq.ljust(40), _right) else: print(_p) except: print(_p) return(0) 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)
实现截图:
功能四:
重点难点:为实现分数出题运用random.uniform() 方法生成随机浮点数,uniform() 方法随机生成一个实数(浮点数),它在[a,b)范围内。然后运用fractions.Fraction()方法生成分数形式,可以同时提供分子和分母给构造函数用于实例化Fraction类,但两者必须同时是int类型或者numbers.Rational类型,否则会抛出类型错误。通过运用limit_denominator()来减小舍入误差的问题。这个方法本来是为了通过限制分母来得到一个近似值,但是在出现舍入误差的时候反倒使得结果更加精确了。
部分代码如下:
from fractions import Fraction a = uniform(0,1) a = Fraction(a).limit_denominator(10) b = uniform(0,1) b = Fraction(b).limit_denominator(10) c = uniform(0,1) c = Fraction(c).limit_denominator(10)
实现截图:
结对编程的体会:通过本次结对编程深刻体会到了人多力量大,相比较一个人编程,两个人结对能够提供更多的思路和想法,虽然过程中也有分歧,但是我们最终愉快地解决了,本次结对编程总体来说是一次不错的体会。
5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件:
1、语言选择(C语言与Python的选择)
2、是否使用后缀表达式。
3、命令行参数处理。
4、借鉴他人方法实现分数功能。
5、运行过程中编译失败,找语法错误。
要求2 给出照片1张,包括结对的2位同学、工作地点、计算机,可选项包括其他能表达结对编程工作经历的物品或场景。
工作地点:冬华公寓B603(我和杨金铭在同一个寝室)
照片: