本次实验采用结对编程方式,设计开发一个小学生四则运算练习软件,使之具有以下功能:
由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
题库自动生成;
程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
![](https://img-blog.csdnimg.cn/img_convert/a39515b5528a3fbea263c39b8d861e2a.png)
程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;
测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
二丶软件设计:使用类图
![](https://img-blog.csdnimg.cn/img_convert/43c29cf306946315ef58c9333b316e8d.png)
三丶核心功能代码
![](https://img-blog.csdnimg.cn/img_convert/8cf9d948459de0bf76d06ee22af576f6.png)
出题
![](https://img-blog.csdnimg.cn/img_convert/572eb8e1881a3d525d7b7ba8177dda2f.png)
界面
四丶程序运行
1.登陆页面
![](https://img-blog.csdnimg.cn/img_convert/4fc793fe2927c67db81bf8c922c5da28.png)
2.点击开始答题进行答题
![](https://img-blog.csdnimg.cn/img_convert/d793fbc098d2f557df4f3894f7c2b938.png)
![](https://img-blog.csdnimg.cn/img_convert/fe170ec77743cc06bd4af697779bc964.png)
![](https://img-blog.csdnimg.cn/img_convert/ea793e3f6da63160ef1d593dbe78d74f.png)
3.点击再来一次重新答题
.
五丶结对过程
六丶PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
Planning | 计划 | 30 | 20 |
Estimate | · 估计这个任务需要多少时间,并规划大致工作步骤 | 30 | 20 |
Development | 开发 | 1200 | 1100 |
Analysis | 需求分析 (包括学习新技术) | 50 | 50 |
Design Spec | 生成设计文档 | 50 | 50 |
Design Review | 设计复审 (和同事审核设计文档) | 100 | 100 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 50 | 50 |
Design | 具体设计 | 200 | 100 |
Coding | 具体编码 | 500 | 600 |
Code Review | 代码复审 | 50 | 50 |
Test | 测试(自我测试,修改代码,提交修改) | 200 | 100 |
Reporting | 报告 | 44 | 30 |
Test Report | 测试报告 | 14 | 2 |
Size Measurement | 计算工作量 | 10 | 8 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 20 | 20 |
七、题目要求
1、通过单元测试代码,测试加法是否能正确工作;
2、通过单元测试代码,测试加减乘除功能。
3、通过单元测试代码,测试计算类对于各种参数的支持:
a. 输入是有错误的,例如 “1 ++ 2”,
b. 在数值范围是 -1000 .. 1000 的时候,传进去 “10000 + 32768”,
c. 或者是 “ 248 / 0” 怎么办?
d. 怎么告诉函数的调用者 “你错了”? 把返回的字符串定义为 “-1” 来表示?
e. 那么如果真的计算结果是 “-1” 又怎么处理呢?
4、通过增量修改的方式,改进程序, 完成对各种错误情况的处理。
二、实验步骤
需求分析
通过单元测试代码,测试程序加减乘除功能是否正确工作,对于格式错误、数值溢出、除零异常是否能检测的到。
设计测试框架,模拟测试数据
测试加减乘除功能
TEST_METHOD(TestAdd) //测试加法
{
Test.CheckInput("1/2+4");
Assert::AreEqual(test11,Test.add());
}
TEST_METHOD(TestAdd1)
{
Test.CheckInput("3+1/3");
Assert::AreEqual(test12, Test.add());
}
TEST_METHOD(TestAdd2)
{
Test.CheckInput("2+4");
Assert::AreEqual(test13, Test.add());
}
TEST_METHOD(TestAdd3)
{
Test.CheckInput("1/2+1/4");
Assert::AreEqual(test14, Test.add());
}
TEST_METHOD(TestSub) //测试减法
{
Test.CheckInput("1/2-1/3");
Assert::AreEqual(test21, Test.sub());
}
TEST_METHOD(TestSub1)
{
Test.CheckInput("1/3-2");
Assert::AreEqual(test22, Test.sub());
}
TEST_METHOD(TestSub2)
{
Test.CheckInput("2-1/3");
Assert::AreEqual(test23, Test.sub());
}
TEST_METHOD(TestSub3)
{
Test.CheckInput("5-3");
Assert::AreEqual(test24, Test.sub());
}
TEST_METHOD(TestMul) //测试乘法
{
Test.CheckInput("1×2");
Assert::AreEqual(test31, Test.mul());
}
TEST_METHOD(TestMul1)
{
Test.CheckInput("1/2×2");
Assert::AreEqual(test32, Test.mul());
}
TEST_METHOD(TestMul2)
{
Test.CheckInput("2×1/3");
Assert::AreEqual(test33, Test.mul());
}
TEST_METHOD(TestMul3)
{
Test.CheckInput("1/3×1/2");
Assert::AreEqual(test34, Test.mul());
}
TEST_METHOD(TestDiv) //测试除法
{
Test.CheckInput("1/2÷2");
Assert::AreEqual(test41, Test.div());
}
TEST_METHOD(TestDiv1)
{
Test.CheckInput("4÷1/2");
Assert::AreEqual(test42, Test.div());
}
TEST_METHOD(TestDiv2)
{
Test.CheckInput("1/2÷2/3");
Assert::AreEqual(test43, Test.div());
}
TEST_METHOD(TestDiv3)
{
Test.CheckInput("1÷2");
Assert::AreEqual(test44, Test.div());
}
单元测试加法功能
string Calc::add()
{
size_t iPos = g_szInput.find('+');
g_szX = g_szInput.substr(0, iPos);
g_szY = g_szInput.substr(iPos+1, g_szInput.length()-1-iPos);
size_t iPosInX = g_szX.find('/');
g_iFirNer = stoi(g_szX.substr(0, iPosInX));
if (iPosInX == -1)
{
g_iFirDer = 1;
}
else
{
g_iFirDer = stoi(g_szX.substr(iPosInX+1, g_szInput.length() - 1 - iPosInX));
}
size_t iPosInY = g_szY.find('/');
g_iSecNer = stoi(g_szY.substr(0, iPosInY));
if (iPosInY == -1)
{
g_iSecDer = 1;
}
else
{
g_iSecDer = stoi(g_szY.substr(iPosInY+1, g_szInput.length() - 1 - iPosInY));
}
simplify(g_iFirNer, g_iFirDer, g_iSecNer, g_iSecDer);
g_iRusNer = g_iFirNer*g_iSecDer + g_iFirDer*g_iSecNer;
g_iRusDer = g_iFirDer*g_iSecDer;
init(g_iRusNer, g_iRusDer); //约分成真分数
g_szRusDer = "";
g_szRusNer = "";
if (g_iRusDer == 1)
{
g_szRusNer += to_string(g_iRusNer);
return g_szRusNer;
}
else{
g_szRusDer += to_string(g_iRusDer);
g_szRusNer += to_string(g_iRusNer);
return g_szRusNer + "/" + g_szRusDer;
}
}
测试结果
测试结果
![](https://img-blog.csdnimg.cn/img_convert/82129af24d554304a29534ae30bfef41.png)
八、PSP
PSP2.1 | Personal Software Process Stages | Estimated time(h) | actual time(h) |
Planning | 计划 | 1 | 1.5 |
Estimate | 估计这个任务需要多少时间 | 10 | 15 |
Development | 开发 | 8 | 10 |
Analysis | 需求分析 (包括学习新技术) | 0.5 | 1 |
Design Spec | 生成设计文档 | 2 | 2 |
Design Review | 设计复审 | 0.3 | 0.5 |
Coding Standard | 代码规范 | 0.5 | 0.4 |
Design | 具体设计 | 1.5 | 1.3 |
Coding | 具体编码 | 8 | 7 |
Code Review | 代码复审 | 0.5 | 1 |
Test | 测试(自我测试,修改代码,提交修改) | 0.2 | 0.5 |
Reporting | 报告 | 2 | 2 |
测试报告 | 0.5 | 0.5 | |
计算工作量 | 0.5 | 1 | |
并提出过程改进计划 | 2 | 4 |
完整代码:https://download.csdn.net/download/pythonyanyan/87390370