GitHub地址:https://github.com/LYbear/calculate
PSP
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
Planning |
计划 |
10 |
· Estimate |
· 估计这个任务需要多少时间 |
10 |
Development |
开发 |
655 |
· Analysis |
· 需求分析 (包括学习新技术) |
30 |
· Design Spec |
· 生成设计文档 |
30 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
5 |
· Design |
· 具体设计 |
40 |
· Coding |
· 具体编码 |
5h*60 |
· Code Review |
· 代码复审 |
1h*60 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
3h*60 |
Reporting |
报告 |
290 |
· Test Report |
· 测试报告+博客 |
4h*60 |
· Size Measurement |
· 计算工作量 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
40 |
合计 |
955 |
项目要求
- √ 参与运算的操作数(operands)除了100以内的整数以外,还要支持真分数的四则运算。操作数必须随机生成。
- √ 运算符(operators)为 +, −, ×, ÷ 运算符的种类和顺序必须随机生成。
- √ 要求能处理用户的输入,并判断对错,打分统计正确率。
- √ 使用 -n 参数控制生成题目的个数。
附加要求
- √ 支持带括号的多元复合运算
- √ 运算符个数随机生成(考虑小学生运算复杂度,范围在2~10)
解题思路
这个题目可以被划分为以下三个问题:
- 运算符号和数字都要随机生成;
- 计算所列出四则运算的结果。
- 接受用户输入并比较结果是否正确,如不正确还要能自动给出正确结果。并在命令行中表现出来。
如何解决
问题1
- 随机操作数、随机运算符、随机括号、随机长度等随机变量可以利用random函数编写一个字函数。
- 需要考虑除数及分母为0时的情况,此时表达式不成立。
- 需要考虑随机生成括号的位置是否有意义的情况。例如:
expression: (1+2+5)-(3*4)=
问题2
该种方法一般思路为:
- 将中缀表达式转化成后缀表达式。
- 通过栈计算后缀表达式的值。
其中需要考虑运算符优先级问题以及栈的结构。查阅了网上的资料,参考了dragondove的博客以及yichudu的博客。其中都有关于该算法的的具体描述。
问题3
判断用户输入情况只需接受用户输入比较统计得分即可。由于要求采用命令行界面完成,该部分主要需要控制及美化命令行界面。
测试部分
由于四则运算的规则繁杂,随机生成的算式需要判断各种情况的产生,也就无形之中给测试部分增添了很大压力。看过了《构建之法》第二章的所有测试部分之后,利用其中单元测试的部分对项目进行了统一的测试。详细情况见后文测试部分。
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <time.h>
int main() //主函数
{
int n,a,right=0;
double percent;
cout<<"Please enter the number of the test:";
cin>> n >>endl;
for(int i=0;i<n;i++)
{
a=takeTest();
right=right+a;
}
cout<<"Powerful!"<<endl;
cout<<"The number of right:%d"+right<<endl;
percent=((double)right*100.00)/(double)n;
cout<<"The percent of right:%0.2f %%\n"+percent<<endl;
}
// 随机获取运算符函数
char getSignal()
{
char signal[4]={'+','-','*','/'};
srand((unsigned)time(NULL));
return signal[rand()%4];
}
//获取随机数函数
int random(double start, double end)
{
return (int)(start+(end-start)*rand()/(RAND_MAX+ 1.0));
}
//题目生成函数
int takeTest()
{
int get;
int num1,num2,a;
char signal;
srand((unsigned)time(NULL));
signal=getSignal();
num1=random(0,1000);
num2=random(1,1000);
if(signal=='-')
{
if(num1<num2)
{
int temp;
temp=num1;
num1=num2;
num2=temp;
}
}
if(signal=='/')
{
if(num2==0)
{
int temp;
temp=num1;
num1=num2;
num2=temp;
}
}
cout<<num1+signal+num2<<endl;
cin>>get<<endl;
fflush(stdin); //清空输入缓冲区
if(getResult(num1,num2,signal)==get)
{
cout<<"You're right!"<<endl;
a=1;
}
else
{
cout<<"It's wrong!\n"<<endl;
cout<<getResult(num1,num2,signal)<<endl;
a=0;
}
return a;
}
//获取运算结果函数
int getResult(int num1,int num2,char signal)
{
int res;
switch(signal)
{
case '+':
res=num1+num2;break;
case '-':
res=num1-num2;break;
case '*':
res=num1*num2;break;
case '/':
res=num1/num2;break;
default:
cout<<"运算符错误!"<<endl;
}
return res;
}
运行结果如图:
自我测评:
本程序由c++语言编写而成,在Visual C++6.0版本的编译器上测试执行成功。但是个人能力不够,花费时间也较多。
PSP2.1 |
Personal Software Process Stages |
实际耗时(分钟) |
Planning |
计划 |
20 |
· Estimate |
· 估计这个任务需要多少时间 |
0 |
Development |
开发 |
800 |
· Analysis |
· 需求分析 (包括学习新技术) |
120 |
· Design Spec |
· 生成设计文档 |
30 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
15 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
40 |
· Design |
· 具体设计 |
100 |
· Coding |
· 具体编码 |
7h*60 |
· Code Review |
· 代码复审 |
1.5h*60 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
2h*60 |
Reporting |
报告 |
330 |
· Test Report |
· 测试报告+博客 |
4.5h*60 |
· Size Measurement |
· 计算工作量 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
50 |
合计 |
1123 |
来源:https://www.cnblogs.com/lybear/p/8882424.html