作业所属课程 | 软件工程实践 |
---|---|
作业题目要求 | https://bbs.csdn.net/forums/ssynkqtd-05 |
作业目标 | 完成一个可视化计算器 |
其他参考文献 | 无 |
https://github.com/IT-zx/Calculator
实现录屏
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | 50 |
• Estimate | • 估计这个任务需要多少时间 | 20 | 15 |
Development | 开发 | 600 | 660 |
• Analysis | • 需求分析 (包括学习新技术) | 60 | 50 |
• Design Spec | • 生成设计文档 | 30 | 20 |
• Design Review | • 设计复审 | 15 | 20 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 10 |
• Design | • 具体设计 | 40 | 60 |
• Coding | • 具体编码 | 200 | 250 |
• Code Review | • 代码复审 | 60 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 80 | 100 |
Reporting | 报告 | 100 | 90 |
• Test Repor | • 测试报告 | 15 | 10 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 25 | 30 |
- | 合计 | 1315 | 1415 |
因为之前编程语言只学过C、C++,没有学过其他语言,也没有接触过可视化项目编程,在查阅资料后最终选择使用C++的MFC模块进行可视化计算器的编程
1、双目操作符的运算。
2、单目操作符的运算。
3、如何显示结果。
4、如何清除界面。
直接利用VS2019的MFC应用模块实现可视化界面,双击按钮为按钮添加操作
1.下载VS中的MFC应用插件,创建一个新的项目。
2.在项目的Dialog界面设计计算器界面并添加按钮,将按钮命名为相关操作术语。
3.在头文件定义两个函数:
void SaveFirstValue(); // 保存第一个输入值
void Calculator(); //实现计算功能
4.添加按钮操作命令。
5.完善函数实现代码。
void CCalculatorDlg::SaveFirstValue() {
UpdateData(TRUE);
mNum1 = _wtof(mStr);
mTempStr = mStr;
mStr = L"";
UpdateData(FALSE);
}
void CCalculatorDlg::Calculator() {
UpdateData(TRUE);
mNum2 = _wtof(mStr);
double result = 0.0f;
switch(mFlag) {
case FLAG_JIA: //加
result = mNum1 + mNum2;
mTempStr = mTempStr + _T("+") + mStr + _T("=");
break;
case FLAG_JIAN: //减
result = mNum1 - mNum2;
mTempStr = mTempStr + _T("-") + mStr + _T("=");
break;
case FLAG_CHENG: //乘
result = mNum1 * mNum2;
mTempStr = mTempStr + _T("*") + mStr + _T("=");
break;
case FLAG_CHU: //除
if (mNum2 == 0.0f) {
result = mNum1;
mTempStr = _T("---除数不能为0!!---");
break;
}
else {
result = mNum1 / mNum2;
mTempStr = mTempStr + _T("/") + mStr + _T("=");
}
break;
case FLAG_NFANG: //n方
result = pow(mNum1, mNum2);
mTempStr = mTempStr + _T("^") + mStr + _T("=");
break;
case FLAG_KAINFANG: //开n方
result = pow(mNum1,1.0/mNum2);
mTempStr = mStr + _T("√") + mTempStr + _T("=");
break;
case FLAG_MOD: //mod
result = (int)mNum1 % (int)mNum2;
mTempStr = mTempStr + _T("%") + mStr + _T("=");
break;
case FLAG_LOGNX: //lognx
result = log(mNum2) / log(mNum1);
mTempStr = _T("log") + mTempStr + _T("(") + mStr + _T(")=");
break;
case FLAG_PINGFANG: //平方
result = mNum2 * mNum2;
mTempStr = mTempStr + _T("^2=");
break;
case FLAG_KAIFANG: //开方
result = sqrt(mNum1);
mTempStr = _T("2√") + mTempStr + _T("=");
break;
case FLAG_LIFANG: //立方
result = mNum2 * mNum2 * mNum2;
mTempStr = mTempStr + _T("^3=");
break;
case FLAG_KAILIFANG: //开立方
result = pow(mNum1, 1.0 / 3);
mTempStr = _T("3√") + mTempStr + _T("=");
break;
default:
break;
}
//如果浮点数是整数就显示整数
if (result - int(result) <= 1e-5) {
mStr.Format(L"%d", (int)result);
}
else {
mStr.Format(L"%f", result);
}
mTempStr += mStr;
mStr8 = mStr7;
mStr7 = mStr6;
mStr6 = mStr5;
mStr5 = mStr4;
mStr4 = mStr3;
mStr3 = mStr2;
mStr2 = mStr1;
mStr1 = mTempStr;
UpdateData(FALSE);
mNum1 = result;
mNum2 = 0.0f;
}
1.在第一次项目生成时只能进行基本的加减乘除运算,经过对项目功能的添加实现幂运算和对数运算以及正余弦函数等运算。
2.在平方和根号运算中可以连续使用上一次运算结果继续运算。
以上为测试基础运算结果,科学计算由于未设置返回值没有进行单元测试,手动测试均已通过。
TEST_METHOD(TestMethod1)
{
CCalculatorDlg a;
double exp = 5 + 5;
a.OnBnClickedButton5();
a.OnBnClickedButtonjia();
a.OnBnClickedButton5();
Assert::AreEqual(exp, a.Calculator());
}
TEST_METHOD(TestMethod2)
{
CCalculatorDlg a;
double exp = 7 - 5;
a.OnBnClickedButton7();
a.OnBnClickedButtonjian();
a.OnBnClickedButton5();
Assert::AreEqual(exp, a.Calculator());
}
TEST_METHOD(TestMethod3)
{
CCalculatorDlg a;
double exp = 5 * 5;
a.OnBnClickedButton5();
a.OnBnClickedButtoncheng();
a.OnBnClickedButton5();
Assert::AreEqual(exp, a.Calculator());
}
TEST_METHOD(TestMethod4)
{
CCalculatorDlg a;
double exp = 5 / 5;
a.OnBnClickedButton5();
a.OnBnClickedButtonchu();
a.OnBnClickedButton5();
Assert::AreEqual(exp, a.Calculator());
}
1.在输入运算除数为0是显示提示;
2.限制只能有一位小数点;
3.根号下不能为负数,若为负数产生提示。
这是第一次做项目,刚收到老师任务时脑袋一片空白。在经过上网查询资料后逐渐有了思路,如何通过视频学习使用了VS的MFC应用。在项目过程中我回顾复习了单目运算符和双目运算符的代码实现,从一开始的加减乘除基本运算添加至科学运算。由于本人编程基础薄弱,大部分实现都是通过现场学习编写,错误状况百出,不过好在慢慢调试以后bug得以修复。
对于单元测试,网上对于MFC单元测试的教程偏少,选择还没有掌握单元测试的具体方法,只能测试简单的运算。
最终实现的成果虽然比较简陋,只能实现单步运算不能进行复合运算,但这已经是我水平的极限,在接下来的学习中我也会继续加油,不断进步,学习更多有关知识。