## 1. 项目成员及Github项目地址
| 项目成员 | 博客地址 | github地址 |
|--|--|--|
| 陆俊奇 | |https://github.com/SaltyFishL/AutoCal |
| 吴大伟 | | https://github.com/AmnesiaWu/AutoCal |
## 2. PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟)| 实际耗时(分钟)
|:--|:--|--|--|
| Planning | 计划 | 30 | |
| · Estimate | · 估计这个任务需要多少时间 | 30 | |
| Development | 开发 | 1980 |
| · Analysis | 需求分析(包括学习新技术) | 90 | |
| · Design Spec | · 生成设计文档 | 90 | |
| · Design Review| · 设计复审(和同事审核设计文档)| 60| |
|· Coding Standard |· 代码规范(为目前的开发制定合适的规范) |30 | |
|· Design |· 具体设计 |120 | |
|· Coding | · 具体编码 |1200 | |
|· Code Review | · 代码复审 |90 | |
|· Test | · 测试(自我测试,修改代码,提交修改) | 300| |
|Reporting | 报告 | 200| |
|· Test Report | · 测试报告| 120| |
| · Size Measurement| · 计算工作量| 10| |
|· Postmortem & Process Improvement Plan | · 事后总结,并提出过程改进计划| 70| |
| | 合计 | 2210 | |
## 3. 解题思路描述
### 3.1 项目要求
#### 3.1.1 第一阶段
* 写一个能自动生成小学四则运算题目的命令行“软件”
* 用-i num实现一次性生成的题目个数
* 实现对一个最多10个运算符表达式的求值
* 支持真分数的四则运算
* 实现判定对错,并最后给出总共对/错数量。
#### 3.1.2 第二阶段
* 支持乘方运算,命令行参数-m 1为^表示乘方,命令行参数-m 2为**表示乘方。
#### 3.1.3 第三阶段
* 把程序编程一个Windows上的电脑图形界面程序
* 增加倒计时功能,每道题必须要20s内完成,否则得0分并开始下一题
* 增加历史记录功能,把用户做题的成绩记录下来并可以展现历史记录
### 3.2 思考过程
题目主要有几个难点:
* 生成**不同的**表达式
* 求解表达式
* 命令行参数的设置
* 图形界面,倒计时和历史记录
#### 3.2.1 生成表达式
需要生成随机数,随机运算符,随机括号,还要保证表达式的正确性和唯一性。
#### 3.2.2 求解表达式
求解整数表达式将原表达式转化为逆波兰表达式,然后用栈按优先级规则操作即可。问题在于真分数的处理。
#### 3.2.3 图形界面,倒计时,历史记录
图形界面暂时考虑用qt进行实现;倒计时需要多线程;历史记录要么写文件,要么连接数据库,看到时候时间充裕与否。
## 4. 设计实现过程
### 4.1 类模块说明
#### 4.1.1 Num类
属性:
* bool isProperFraction //是否是真分数类型
* int numerator //分子
* int denominator //分母
方法:
* 友元函数运算符重载,加减乘除
* 随机的实例化操作
#### 4.1.2 ExpressionBuilder类
属性:
* int num; //生成的题目的数量
* enum powerMark; //乘方标志
方法:
* GenerateExp() //给定题目数量,生成表达式
* BuildExp() //生成一道题
* PrintExp() //将生成的题写入文件中
* 实例化
#### 4.1.3 Expression类
属性:
* String expression; //可打印的表达式
* 视算法而定求解表达式所需要的数据结构(栈)
* Num ans; //答案
方法:
* Solve() //计算表达式
* Check() //检查答案正误
#### 4.1.4 Main
解析输入参数,调用其他类,实现与用户的交互
### 4.2 程序执行流程图
```mermaid
flowchat
st=>start: 开始
e=>end: 结束
main=>operation: main()
c=>condition: 输入是否合法
ExpressionBuilder.Generate=>operation: 生成表达式
User=>operation: 用户交互
ExpressionBuilder.Check=>operation: 判断答案正误(Lazy模式)
output=>inputoutput: 错误
st->main->c
c(yes)->ExpressionBuilder.Generate->User->ExpressionBuilder.Check->e
c(no)->output->e
```
## 5. 单元测试
* 单元测试用例设计如下
1.输入测试
主要测试程序的合法输入以及不合法输入情况。
编号 | 输入格式 | 预期输出
-------- | -------| -------
1 |简单模式 + max_num |整数运算式
2 |中等模式 + max_num |分数、整数运算式
3 |困难模式 + max_num |分数、整数乘方运算式
2.输入测试
检测四则运算器中每一种算符的运算正确性
编号 | 操作数1 | 操作数2|运算符|预测结果
-------- | -------| -------|--------|-------
1 |2|1/2|+|5/2
2 |2|1/2|-|3/2
3 |2|3/2|*|3
4 |2|1/2|/|4
5 |3|3|^|27
6 |3|0|^|1
7 |1/2|1|^|1/2
3.题目查重测试
编号 | 算式1 | 算式2|预测结果
-------- | -------| ------|-------
1 |2+3+4|4+(2+3)|重复
2 |1+2+3|3+2+1|不重复
3 |2*3|3*2|重复
4 |(1 + 2) * 3|3* (1 + 2)|不重复
5 |(1+2)*(3+4)|(3+4)*(1+2)|不重复
6 |(2-1)/(5-3)|(5-3)/(2-1)|不重复
7 |(3+6)/(5-3)|(6+3)/(5-3)|重复
8 |(1/2+2/3)+3/4|1/2+(2/3+3/4)|重复
9 |(1/2+2/3)* 3/4|3/4 *(1/2+2/3)|重复