myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)
1.Github项目地址
https://github.com/baiyexing/myapp.git
2.功能要求
题目:实现一个自动生成小学四则运算题目的命令行程序
功能(已全部实现)
- 使用 -n 参数控制生成题目的个数
- 使用 -r 参数控制题目中数值(自然数、真分数和真分数分母)的范围
- 生成的题目中计算过程不能产生负数,也就是说算术表达式中如果存在形如e1 − e2的子表达式,那么e1 ≥ e2
- 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数
- 每道题目中出现的运算符个数不超过3个
- 程序一次运行生成的题目不能重复,即任何两道题目不能通过有限次交换+和×左右的算术表达式变换为同一道题目
- 在生成题目的同时,计算出所有题目的答案,并存入执行程序的当前目录下的Answers.txt
- 程序应能支持一万道题目的生成
- 程序支持对给定的题目文件和答案文件,判定答案中的对错并进行数量统计,统计结果输出到文件Grade.txt
3.解题思路
大致思路为,随机生成操作符数目,调用方法递归生成式子,同时表示成二叉树,同时规范化二叉树(好查重)。数字,运算符都用方法随机生成。
4.设计实现过程
(1)Question类:生成式子,包括获得随机数,获得随机运算符,计算算式结果,将结果化简,规范化二叉树等方法。
(2)Parameter类:处理结果,包括获取命令行参数,查重,写入文件,判断答案等方法。
5.代码说明
只说明部分重要和难点代码
(1)生成式子的主要方法,采用递归方式,随机生成式子,存为二叉树形式,保存在字典中。
def expression2(self,count):#生成式子
if count == 1:
figure = self.getnumber()
return{
'expression_array': figure['figure'],
'expression': figure['figure_char'],
'answer': figure['figure_array']
}
else :
leftcount = self.getrandom(count -1)
rightcount = count - leftcount left = self.expression2(leftcount)
right = self.expression2(rightcount) operate = self.getrandom(4) if operate == 4 and right['answer'][0] == 0:
t = left
left = right
right = t
answer = self.Calculation(left['answer'],right['answer'],operate)
if answer[0] < 0:
t = left
left = right
right = t
answer = self.Calculation(left['answer'],right['answer'],operate) leftvalue = left['answer'][0]/left['answer'][1]
rightvalue = right['answer'][0]/right['answer'][1]
expression_array = [left['expression_array'],operate,right['expression_array']]
(2)规范化二叉树,按左右子树为数数,数树,树树来判定规范。
if type(left['expression_array'])!=list and type(right['expression_array'])!=list: #两个子树都为值
if (operate == 1 or operate == 3) and leftvalue < rightvalue:
expression_array = [right['expression_array'],operate,left['expression_array']]
elif type(left['expression_array'])==list and type(right['expression_array'])==list:# 两个子树都为树
if operate == 1 or operate == 3:
if leftvalue == rightvalue and left['expression_array'][1] < right['expression_array'][1]:#树的值相等时,运算符优先级高的在左边
expression_array = [right['expression_array'],operate,left['expression_array']]
elif leftvalue < rightvalue :
expression_array = [right['expression_array'],operate,left['expression_array']]
if operate in [3,4] :
if left['expression_array'][1] in [1,2]:
left['expression'] = '(' + left['expression'] + ')'
if right['expression_array'][1] in [1,2]:
right['expression'] = '(' + right['expression'] + ')'
else:#一边的子树为树
if operate == 1 or operate == 3:
if type(right['expression_array']) == list:
expression_array = [right['expression_array'],operate,left['expression_array']]
if operate in [3,4] :
if type(left['expression_array']) == list and left['expression_array'][1] in [1,2] :
left['expression'] = '(' + left['expression'] + ')'
if type(right['expression_array']) == list and right['expression_array'][1] in[1,2]:
right['expression'] = '(' + right['expression'] + ')'
(3)生成算式列表,判重。
def getexpression_list(self, expression_count, number_range, count, probability) :# 算式
List = []
i = 0
while i < expression_count:
expression = Question(number_range,count,probability)
while self.check(expression,List):
expression = Question(number_range,count,probability)
List.append({
'expression_array': expression.__dict__['expression_array'],#二叉树表示
'expression': expression.__dict__['expression'],#算式表达形式
'answer': expression.__dict__['answer'],#答案
'answer_char': expression.__dict__['answer_char']#答案表达形式 })
i += 1
return List def check(self,expression,List):#查重方法
expressionarray = expression.__dict__['expression_array']
for i in List:
if expressionarray == i['expression_array']:
return True
return False
6.测试运行
·全部功能

·-n,支持生成10000道题目

·-r 为100时

·答案文件

·答案判定

7.PSP表格
|
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
|
Planning |
计划 |
50 |
40 |
|
· Estimate |
· 估计这个任务需要多少时间 |
50 |
40 |
|
Development |
开发 |
1215 |
1300 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
80 |
85 |
|
· Design Spec |
· 生成设计文档 |
60 |
40 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
50 |
45 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
35 |
30 |
|
· Design |
· 具体设计 |
70 |
60 |
|
· Coding |
· 具体编码 |
800 |
820 |
|
· Code Review |
· 代码复审 |
55 |
50 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
65 |
70 |
|
Reporting |
报告 |
105 |
110 |
|
· Test Report |
· 测试报告 |
30 |
35 |
|
· Size Measurement |
· 计算工作量 |
25 |
30 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
50 |
45 |
|
合计 |
1370 |
1480 |
8.项目小结
这次的题目比上次的难得多,但收获也多得的多。我终于懂得结构化代码的重要性,不然代码过长乱成一团自己也看不懂。同时也学到了python语言许多新的知识。最重要的,这次是结对编程,第一次接触到这种编程方式,两个人坐在一起,一个人主要编写,另一个人在旁提意见,映像最深的一个好处就是嘉帆同学总是能很快的发现代码中的小错误小bug,别小看这些,有时候自己经常因为这些容易忽视的小错误,跑不了代码,而自己始终找不到bug而导致浪费许多时间。这时候队友常常可以轻而易举的指出错误,大大节省了时间。而且两个人一起讨论常常会有不一样的思路,讨论验证的过程能更好的增加我们对相关知识的理解。
myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)的更多相关文章
- 实现一个自动生成小学四则运算题目的命令行程序(java实现)
Github项目地址:https://github.com/xiaobaot/wordcount/tree/master/sizeyusuan 团队成员:谢家明(代码生成) 谢竣(测试完善) 项 ...
- 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序
1. 编写一个能自动生成小学四则运算题目的程序.(10分) 基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图. 本题发一篇随笔,内容包括: 题 ...
- Individual Project "写一个能自动生成小学四则运算题目的程序"
一.题目简介 写一个能自动生成小学四则运算题目的程序. 初步拟定要实现的功能后,估计一下自己需要花多长时间.编程过程中记录自己实际用了多长时间. 然后和同学们比较一下各自程序的功能.实现方法的异同等等 ...
- Python实现自动生成小学四则运算题目
Github地址: https://github.com/guoyuyi/gyy.github.io/blob/%E4%BD%9C%E4%B8%9A1/zy1.py 题目描述: 通过python语言编 ...
- C语言:一个能自动生成小学四则运算题目的程序
完成这个程序,半个小时内完成了,这个程序,可以自动生成小学简易的四则运算,提供菜单让用户选择,然后判断加减乘除,判断答对答错的题目个数,用户同时也可以重新选择继续答题或重新选择或退出程序. 源程序: ...
- python实现自动生成小学四则运算题目(软工第二次项目作业)
前言 软件工程 传送带 作业要求 传送带 作业目标 结对编程:代码实现.性能分析.异常处理说明.记录PSP表格 代码见: github 个人信息:朱育清 3118005437 信安二班 我的partn ...
- java实现自动生成小学四则运算——朱庭震,詹祺豪
组员:朱庭震,詹祺豪 Github地址:https://github.com/ztz1998/second/tree/master 1题目:实现一个自动生成小学四则运算题目的命令行程序. 2说明: 自 ...
- 使用MFC做一个简单的‘能自动生成小学生四则运算的软件’
这是软件工程的第一次作业!但由于我们python还没入门,所以这次的要求是‘语言不限’. 小学期做过一个关于MFC的‘资金管理系统’,也正好可以有界面,所以就选择了自己很熟悉的MFC来做这个作业! 1 ...
- 手写笔记变PDF-几行代码变命令行程序为图形化界面
前言 最近发现了一个非常不错的Python类库----Gooey, https://github.com/chriskiehl/Gooey 在它的帮助下我们可以非常方便的将一个命令行程序升级成一个图形 ...
随机推荐
- [Swift]LeetCode42. 接雨水 | Trapping Rain Water
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- [Swift]LeetCode554. 砖墙 | Brick Wall
There is a brick wall in front of you. The wall is rectangular and has several rows of bricks. The b ...
- [Swift]LeetCode924.尽量减少恶意软件的传播 | Minimize Malware Spread
In a network of nodes, each node i is directly connected to another node j if and only if graph[i][j ...
- ubuntu-18.04 设置开机启动脚本
ubuntu-18.04 设置开机启动脚本 参阅下列链接 https://askubuntu.com/questions/886620/how-can-i-execute-command-on-sta ...
- python-redistest
# !/usr/bin/python3.4 # -*- coding: utf-8 -*- import redis import time # 这里用来读取ip def getips(): ip = ...
- JDK1.8源码(二)——java.util.LinkedList
LinkedList定义 LinkedList 是链表实现的线性表(双链表),元素有序且可以重复. public class LinkedList<E> extends Abstrac ...
- Android中颜色透明度对应16进制值
透明度百分比对应的十六进制: (说明:百分比计算出来会有小数,按照常规的四舍五入处理,详情请往下查看) 百分比:0% HEX: 00 百分比:1% HEX: 30 百分比:2% HEX: 50 百分比 ...
- Error: Default interface methods are only supported starting with Android N (--min-api 24): java.io.InputStream org.apache.poi.sl.usermodel.ObjectShape.readObjectData()
项目运行的时候,如果报错 Error: Default interface methods are only supported starting with Android N (--min-api ...
- Kafka~Linux环境下的部署
概念 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素. 这些数据 ...
- XSS Stored 测试
dvwa存储型XSS 存储型XSS:会把用户输入的数据“存储”在服务器端,一般出现在需要用户可以输入数据的地方,比如网站的留言板.评论等地方,当网站这些地方过滤不严格的时候,就会被黑客注入恶意攻击代码 ...