2019软件工程结对项目-1120172176

## 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)|重复

发布了5 篇原创文章 · 获赞 3 · 访问量 2669

猜你喜欢

转载自blog.csdn.net/SaltyFishLu/article/details/104032365