使用c++ MFC组件实现可视化计算器

文章目录

    • 作业基本信息
    • 项目地址及项目展示
      • 项目地址
      • 项目展示
    • PSP表格
    • 解题思路描述
      • 问题1:使用什么语言进行开发
      • 问题2:如何实现计算器功能
    • 接口设计和实现过程
      • 接口设计
      • 实现过程
    • 关键代码展示
    • 性能改进
    • 单元测试
      • 测试代码
    • 异常处理
    • 心得体会

作业基本信息

作业所属课程 软件工程实践
作业题目要求 https://bbs.csdn.net/forums/ssynkqtd-05
作业目标 完成一个可视化计算器
其他参考文献

项目地址及项目展示

项目地址

https://github.com/IT-zx/Calculator

项目展示

实现录屏

PSP表格

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

解题思路描述

问题1:使用什么语言进行开发

因为之前编程语言只学过C、C++,没有学过其他语言,也没有接触过可视化项目编程,在查阅资料后最终选择使用C++的MFC模块进行可视化计算器的编程

问题2:如何实现计算器功能

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.在平方和根号运算中可以连续使用上一次运算结果继续运算。

单元测试

使用c++ MFC组件实现可视化计算器_第1张图片

以上为测试基础运算结果,科学计算由于未设置返回值没有进行单元测试,手动测试均已通过。

测试代码

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是显示提示;
使用c++ MFC组件实现可视化计算器_第2张图片
2.限制只能有一位小数点;
3.根号下不能为负数,若为负数产生提示。
使用c++ MFC组件实现可视化计算器_第3张图片

心得体会

这是第一次做项目,刚收到老师任务时脑袋一片空白。在经过上网查询资料后逐渐有了思路,如何通过视频学习使用了VS的MFC应用。在项目过程中我回顾复习了单目运算符和双目运算符的代码实现,从一开始的加减乘除基本运算添加至科学运算。由于本人编程基础薄弱,大部分实现都是通过现场学习编写,错误状况百出,不过好在慢慢调试以后bug得以修复。
对于单元测试,网上对于MFC单元测试的教程偏少,选择还没有掌握单元测试的具体方法,只能测试简单的运算。
最终实现的成果虽然比较简陋,只能实现单步运算不能进行复合运算,但这已经是我水平的极限,在接下来的学习中我也会继续加油,不断进步,学习更多有关知识。

你可能感兴趣的:(c++,mfc,开发语言)