1.Github:https://github.com/S1mon-fq/S1mon
2. PSP2.1表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
30 |
25 |
· Estimate |
· 估计这个任务需要多少时间 |
30 |
25 |
Development |
开发 |
1140 |
1360 |
· Analysis |
· 需求分析 (包括学习新技术) |
60 |
55 |
· Design Spec |
· 生成设计文档 |
60 |
70 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 |
30 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 |
15 |
· Design |
· 具体设计 |
120 |
120 |
· Coding |
· 具体编码 |
600 |
720 |
· Code Review |
· 代码复审 |
120 |
150 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 |
200 |
Reporting |
报告 |
90 |
120 |
· Test Report |
· 测试报告 |
60 |
90 |
· Size Measurement |
· 计算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 |
20 |
合计 |
1260 |
1510 |
3.效能分析
生成10000条式子所用的时间:
4.设计实现过程
一共有四个类,Genera类有GeneralOneFormula和Fomulas函数,前者生成式子,后者将式子i写入文档,在Fomulas中需要调用前面GeneralOneFomulas函数。
Answer类有五个函数,其中实现加减乘除运算并返回结果,匹配括号,转换真分数,将答案写入文件
Verify类是对题目进行优化,生成题目序号,判断是否有除数为0,是否出现负数
Judge类实现对答案的核对功能,通过读取文件,按行匹配文件,输出结果
具体函数在代码说明
5.代码说明
Genera:利用rd()函数随机生成数字,运算符一共四个,同样用rd()函数随机选取,放到运算符列表中,然后采用列表,合并符号列表和数字括号列表
def GeneralOneFormula(self): Range = self.range # OperateNumbers = random.randint(1, 3) X1 = int(random.random() * 10000) X2 = int(random.random() * 10000) OperateNumbers = X1 % 3 + 1 CountNUmbers = OperateNumbers + 1 Ostyle = [‘+‘, ‘-‘, ‘*‘, ‘÷‘] # 生成符号list Operates = [] a = 0 while (a <= OperateNumbers): # Operates.append(random.choice(Ostyle)) if (a == 0): Operates.append(Ostyle[X1 % 4]) if (a == 1): Operates.append(Ostyle[X2 % 4]) if (a == 2): Operates.append(Ostyle[(X1 + X2) % 4]) a += 1
Answer:通过正则表达式匹配运算符的位置,不同的是,加减和乘除返回采用的方法不一样,calc函数匹配括号和集成加减乘除运算符的入口,转换成真分数时,如果存在小数点,取到小数点后三位,然后对小数部分四舍五入,然后生成一个真分数
def mul_divOperation(self, s): sub_str = re.search(‘(\d+\.?\d*[*/]-?\d+\.?\d*)‘, s) while sub_str: sub_str = sub_str.group() if sub_str.count(‘*‘): l_num, r_num = sub_str.split(‘*‘) s = s.replace(sub_str, str(float(l_num) * float(r_num))) else: l_num, r_num = sub_str.split(‘/‘) s = s.replace(sub_str, str(float(l_num) / float(r_num))) sub_str = re.search(‘(\d+\.?\d*[*/]\d+\.?\d*)‘, s) return s
Verify:提取每个式子中括号中的内容,用计算其结果,只要出现一次负数,即生成新的算式
提取过程中,先找到最左边的左括号,然后再找到最左边左括号右边的右括号,提取出来
def compute_c(self, e1): num_int = float() num_int = self.filt_num(e1) sym_int = self.filt_sym(e1) flag = self.int_compute(num_int, sym_int) if flag < 0: return ‘f‘ else: return str(flag)
Judge:读入文档,按行匹配,对比答案与所读取的文档,取答案中等号右边的数字与正确答案中空格后的字符串进行比较,输出结果correct,wrong的数目和题号
6.运行测试
生成10000条式子:
生成答案:
答案文档与自己进行-e 功能:
一个全部错误的文档与答案文档进行-e:
只输入-n指令,没有实例化变量:
只输入-n,-r指令:
7.项目小结
这次项目是我第一次用python来编写,python刚自学没多久,对写函数和函数直接的调用不太熟练,请教了班里的同学。跟第一次项目一样,在命令行传参的地方也反复修改了很久,最后才成功实现,大部分功能已经实现,排除重复式子的功能还没有实现,这次项目又大大提升了自己的动手能力。
原文地址:https://www.cnblogs.com/S1mon/p/11689626.html