码迷,mamicode.com
首页 > 其他好文 > 详细

结对编程:自动生成小学四则运算题目

时间:2019-10-17 01:01:52      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:总结   int   spec   pos   正则   令行   文件   文档   review   

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刚自学没多久,对写函数和函数直接的调用不太熟练,请教了班里的同学。跟第一次项目一样,在命令行传参的地方也反复修改了很久,最后才成功实现,大部分功能已经实现,排除重复式子的功能还没有实现,这次项目又大大提升了自己的动手能力。

 

结对编程:自动生成小学四则运算题目

标签:总结   int   spec   pos   正则   令行   文件   文档   review   

原文地址:https://www.cnblogs.com/S1mon/p/11689626.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!