四则运算题目生成—基于控制台
项目托管在码云:飞机票
需求分析
-
根据控制台提示信息,输入题目生成相关配置参数
- 题目生成数量
- 数字范围
- 式子中是否有分数
- ....
-
程序支持
- 10000 题目生成
- 题目与答案的本地化存储
- 对生成的题目进行查重处理
- api接口生成
- 统计对错情况
- ....
功能实现
由于此项目是针对面向对象课程所开发,所以代码结构力求做到清晰明了。
结构图如下:
主要功能代码
判重
说明:将两个表达式生成的运算符二叉树进行比对根节点是否相同,若相同,则表示重复,否则,不重复
此项目主要完成3个主要部分
- 表达式生成
- generator.py
- 题目查重
- binary_tree.py
- 计算答案
- answer.py
其他模块辅助这3个主功能
设计到的基本数据结构及表达式有栈、二叉树、逆波兰表达式(后缀表达式)
表达式生成逻辑
首先可以很快想到用字符串列表来存储表达式,然后仔细分析下表达式具有的特点
- 运算数个数 = 运算符个数 + 1
- 具有2个操作数的式子不需要插入括号(在式子两侧括号为无意义括号)
- 如果运算符为除法且后面紧接的运算数为0,则将0重新替换成一个不为0的运算数。
由此可以想到可以新建个一个大小为(运算符个数+运算数)的列表,然后for循环遍历此列表,在偶数位置插入随机的运算数,奇数位置插入运算符。
如果配置参数需要生成分数,则先随机找一个分数可插入的位置,其他的运算数插入位置可插分数或者整数。
如果运算符为除法,并且后面紧跟着的运算数为0,则需要重新将0替换为一个不为0的其他运算数
括号的插入逻辑本人做的比较简陋,有些许bug,如果配置了需要括号,则从第0个操作数到第(操作数个数/2)
注意! 左括号的插入位置是从0到操作数个数的一半之间的一个随机数,不能加上运算符个数,因为运算符后不能跟括号。
去重的逻辑
- 首先将字符串表达式(中缀表达式)转换成二叉树
- 对转换得到的二叉树的左右子树进行自定义排序,不管式子和二叉树结构如何,都可以生成一个根据你定的规则的字符串序列,最后比较2个表达式生成的这个序列,如果一样,则说明这两个式子是重复的。
表达式答案计算逻辑
- 将中缀表达式转换为逆波兰表达式,然后利用一个自定义的栈结构对这个RPN进行计算
- 计算过程可以先设置一个栈,然后遍历RPN表达式,若遍历到操作数,就将其压栈,若是运算符,就出栈两个操作数进行计算(根据遇到的运算符),最后栈中剩余的最后一个元素即为答案结果
3.运行截图
控制台
web页面
作业感想: 锻炼了自己的模块化编码能力,提高逻辑严谨性。
4.项目的PSP图
PSP2.1 | PSPS | Time |
---|---|---|
Planning | 计划 | - |
· Estimate | · 估计这个任务需要多少时间 | 20h |
Development | 开发 | - |
· Analysis | · 需求分析 (包括学习新技术) | 3h |
· Design Spec | · 生成设计文档 | 0.5h |
· Design Review | · 设计复审 (和同事审核设计文档) | 1h |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 1h |
· Design | · 具体设计 | 2h |
· Coding | · 具体编码 | 3h |
· Test | · 测试(自我测试,修改代码,提交修改) | 5h |
Reporting | 报告 | - |
· Test Report | · 测试报告 | 1h |
· Size Measurement | · 计算工作量 | 1h |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划) | 0.5h |
- | 合计 | 18h |
事后总结:项目模块不是那么优雅,希望在之后的项目慢慢改正。