简单的四则运算题目生成及求值小程序
题目要求
除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
运算符为 +, −, ×, ÷
并且要求能处理用户的输入,并判断对错,打分统计正确率。
要求能处理用户输入的真分数, 如 1/2, 5/12 等
使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
Myapp.exe -n 10
需求分析
- 通过-n参数控制题目个数,通过-s参数执行对错检验输出正确率
- 生成max=10以内的随机的整数或真分数(分母比分子大),随机的 +, −, ×, ÷符号,组合成四则运算运算题目,输出到文本文件
- 读入文本文件,解析表达式求值,对比用户的答案,统计正确率
- 学习新技术
- 栈
- 文件的读写
- markdown
- string流,string与int的相互转换
设计文档
用户输入命令行,程序根据命令行执行相应功能,Myapp.exe -n 10生成10道随机四则运算题目并输出到文本,Myapp.exe -s读入文本统计正确率并输出到控制台。
具体定义:
- 运算符号只包含+, −, ×, ÷,=。没有括号。
- 题目类型:[整数][符号][整数][符号][整数] 和 [真分数][符号][真分数][符号][真分数]
操作数+运算符+操作数 - 运算:n1/d1+ (-)n2/d2 通分
n1/d1* (/)n2/d2 分子分母相乘
所得结果r统一化简
程序架构:
- 解析用户输入的命令行。Myapp.exe -n 10,Myapp.exe -s
- Myapp.exe -n 10 ,返回题目个数
- 循环生成题目直到满足题目数n
- 随机生成整数或真分数,运算符,组成一道题目string
- 一道题目加上 ’=’ 一行,输出到文本文件
- Myapp.exe -s ,表达式求值并统计正确率
- 从文本中逐行读入题目和答案string
- bool result(string one) 将string中算术表达式部分压入optr和opnd栈中计算出结果res,最后从string中解析出答案ans,比对答案,正确返回true,错误返回false。
-函数返回true则tc+1,false则fc+1。 - 统计结果tc/(tc+fc)并输出到控制台
代码规范
-随机生成low到high之间的数字的函数int random(int low ,int high)
-随机生成整数,分数,运算符的函数int rNat(low ,high),string rFra(int x),string rOpe(void)
-表达式比对并进行答案比对bool result(string one)
代码说明
//表达式求值并返回正确与否
bool result(string one) {
istringstream sin(one);
string ch;
string e1, e2, theta;
stack<string> optr, opnd;
optr.push("=");
sin >> ch;
while (ch!="=" || optr.top()!="=") {
if (!in(ch)) {
opnd.push(ch);
sin >> ch;
}
else {
switch (precede(optr.top(), ch)) {
case '>':
theta = optr.top(); optr.pop();
e2 = opnd.top(); opnd.pop();
e1 = opnd.top(); opnd.pop();
opnd.push(operate(e1, theta, e2));
break;
case '<':
optr.push(ch);
sin >> ch;
break;
case '=':
optr.pop();
sin >> ch;
break;
}
}
}
e1=opnd.top();
if (sin >> e2) {
if (e1 == e2)return true;
}
else return false;
}
软件测试
PSP
- 手动记录有错漏之处(我还是写个windows程序自动记录比较准确且轻松!)
PSP2.1 | PersonalSoftwareProcessStages | Time(%)SeniorStudent | Time(%) |
---|---|---|---|
Planning | 计划 | 8 | 0 |
·Estimate | 估计这个任务需要多少时间 | 8 | 0 |
Development | 开发 | 82 | 92 |
·Analysis | 需求分析(包括学习新技术) | 6 | 4 |
·DesignSpec | 生成设计文档 | 5 | 8 |
·DesignReview | 设计复审 | 4 | 0 |
·CodingStandard | 代码规范 | 3 | 2 |
·Design | 具体设计 | 10 | 11 |
·Coding | 具体编码 | 36 | 61 |
·CodeReview | 代码复审 | 7 | 8 |
·Test | 测试(自我测试,修改代码,提交修改) | 13 | 8 |
Reporting | 报告 | 9 | 8 |
· | 测试报告 | 3 | 0 |
· | 计算工作量 | 2 | 0 |
· | 并提出过程改进计划 | 3 | 0 |
总结
- 前期需求分析及设计文档 做的越详细越正确后期写代码就会越轻松。因为程序架构与流程有了,写代码时只需特定的地方写详细就好。如果一开始就写代码,没有架构后期调试就会很麻烦且代码臃肿。当然写好架构的前提是先学好一门语言。
- 学习看和查英文帮助文档。毕竟网上的大多个人博客写不是很详细(写这个小程序就有这种感觉了)。
- 认真学习C++一门。在各门语言之间转来转去实在混乱,通晓一门足以知晓其他语言的大体情况了。