软件工程作业——实现一个简易计算器

本文详细描述了一个使用C++和MFC实现的可视化简易计算器项目,涉及界面设计、功能实现、PSPP表格、单元测试以及性能改进等内容,展示了作者的心路历程和学习收获。
摘要由CSDN通过智能技术生成

这个作业属于哪个课程https://bbs.csdn.net/forums/ssynkqtd-05
这个作业要求在哪里https://bbs.csdn.net/topics/617294583
这个作业的目标实现一个可视化界面简易计算器
其他参考文献https://www.cnblogs.com/xinz/archive/2011/11/20/2255830.html

目录

1.项目地址

2.界面及功能展示

3.PSP表格

4.解题思路描述

5.设计与实现过程

6.单元测试

7.性能改进

8.心路历程及收获


1.项目地址

项目地址

2.界面及功能展示

3.PSP表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划1010
• Estimate• 估计这个任务需要多少时间2015
Development开发200220
• Analysis• 需求分析 (包括学习新技术)100120
• Design Spec• 生成设计文档5040
• Design Review• 设计复审1010
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)510
• Design• 具体设计3040
• Coding• 具体编码180150
• Code Review• 代码复审3020
• Test• 测试(自我测试,修改代码,提交修改)6080
Reporting报告120120
• Test Repor• 测试报告2010
• Size Measurement• 计算工作量1010
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划2030
合计865885

4.解题思路描述

题目要求实现一个可视化界面的计算器

1.编程语言:我选择的是c++语言。

2.界面设计:我使用的是visual stdio中的MFC类库进行界面设计,使用MFC能自动生成框架,设计完界面后,点击对应按键即可生成对应的函数进行编写

3.实现功能:由于个人水平不足,我只实现了加,减,乘,除,模等功能,另外还设计了个Ans按键,能够对前一个运算结果进行运算。通过编写对应按钮的函数,实现文本框与输入字符的关联,输入算式的过程中记录操作数,最后由“=”运算并输出结果。

5.设计与实现过程

这是对话框实现文件的头文件,其中是通过枚举定义了操作符类型。还有一个对话框类,其中设计几个关键函数。SaveFirstValue()在二元运算中记录第一个操作数,在输入操作符后执行。Calculate()和PutResult()则是计算和打印结果至文本框。OnBnClickedButton()就是对应按键的相应函数。

enum Calculator_Flag//运算符标志
{
	FLAG_JIA,
	FLAG_JIAN,
	FLAG_CHEN,
	FLAG_CHU,
	FLAG_MO

};


// CcalculatorDlg 对话框
class CcalculatorDlg : public CDialogEx
{
// 构造
public:
	CcalculatorDlg(CWnd* pParent = nullptr);	// 标准构造函数
	void SaveFirstValue();	//保存第一个输入值
	double Calculate();		//计算
	void PutResult(double result);

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_CALCULATOR_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()

private:
	CString str1;//对话框字符串1
	CString str2;//对话框字符串2
	CString tmpstr;
	double num1;
	double num2;
	Calculator_Flag FU;//运算符


public:
	
	afx_msg void OnBnClickedButton0();
	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedButton2();
	afx_msg void OnBnClickedButton3();
	afx_msg void OnBnClickedButton4();
	afx_msg void OnBnClickedButton5();
	afx_msg void OnBnClickedButton6();
	afx_msg void OnBnClickedButton7();
	afx_msg void OnBnClickedButton8();
	afx_msg void OnBnClickedButton9();
	afx_msg void OnBnClickedButtonDian();
	afx_msg void OnBnClickedButtonClearentry();
	afx_msg void OnBnClickedButtonClearall();
	afx_msg void OnBnClickedButtonJia();
	afx_msg void OnBnClickedButtonJian();
	afx_msg void OnBnClickedButtonChen();
	afx_msg void OnBnClickedButtonChu();
	afx_msg void OnBnClickedButtonCalculate();
	afx_msg void OnBnClickedButtonAns();
	afx_msg void OnBnClickedButtonMo();
};

将定义的字符串与文本框关联

void CcalculatorDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	//将文本框与定义的字符串关联
	DDX_Text(pDX, IDC_EDIT1, str1);
	DDX_Text(pDX, IDC_EDIT2, str2);
}

在点击数字按键后进行如下响应,1.获取文本框内容 2.修改获取的字符串 3.返回字符串

void CcalculatorDlg::OnBnClickedButton0()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);
	str1 += L"0";
	UpdateData(FALSE);
}

最后按下“=”后调用计算和输出

void CcalculatorDlg::OnBnClickedButtonCalculate()
{
	// TODO: 在此添加控件通知处理程序代码
	double result;
	result= Calculate();
	PutResult(result);
}

6.单元测试

本次作业第一次接触单元测试,花了大量时间,仍有部分问题没有解决

单元测试代码展示

#include "pch.h"
#include "CppUnitTest.h"
#include "../calculator/calculatorDlg.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{
	TEST_CLASS(UnitTest1)
	{
	public:
		
		TEST_METHOD(TestMethod1)//3+5
		{
			double a = 3;
			double b = 5;
			double exp = a + b;
			CcalculatorDlg c;
			c.OnBnClickedButton3();
			c.OnBnClickedButtonJia();
			c.OnBnClickedButton5();
			Assert::AreEqual(exp,c.Calculate());
		}

		TEST_METHOD(TestMethod2)//6-1
		{
			double a = 6;
			double b = 1;
			double exp = a - b;
			CcalculatorDlg c;
			c.OnBnClickedButton6();
			c.OnBnClickedButtonJian();
			c.OnBnClickedButton1();
			Assert::AreEqual(exp, c.Calculate());
		}
		TEST_METHOD(TestMethod3)//3.8+5.4
		{
			double a = 3.8;
			double b = 5.4;
			double exp = a + b;
			CcalculatorDlg c;
			c.OnBnClickedButton3();
			c.OnBnClickedButtonDian();
			c.OnBnClickedButton8();
			c.OnBnClickedButtonJia();
			c.OnBnClickedButton5();
			c.OnBnClickedButtonDian();
			c.OnBnClickedButton4();
			Assert::AreEqual(exp, c.Calculate());
		}


		TEST_METHOD(TestMethod4)//4.2*7
		{
			double a = 4.2;
			double b = 7;
			double exp = a * b;
			CcalculatorDlg c;
			c.OnBnClickedButton4();
			c.OnBnClickedButtonDian();
			c.OnBnClickedButton2();
			c.OnBnClickedButtonChen();
			c.OnBnClickedButton7();
			Assert::AreEqual(exp, c.Calculate());
		}
		
		TEST_METHOD(TestMethod5)//  7/3
		{
			double a = 7;
			double b = 3;
			double exp = a / b;
			CcalculatorDlg c;
			c.OnBnClickedButton7();
			c.OnBnClickedButtonChu();
			c.OnBnClickedButton3();
			Assert::AreEqual(exp, c.Calculate());
		}

	};
}

测试结果

均通过测试

7.性能改进

在输出处理时,对一些非法操作用FLAG_ERROR记录,然后会输出“ERROR!”

另外在精度考虑时,如果与整数差值小于1e-6,则视为整数输出

void CcalculatorDlg::PutResult(double result)
{
	UpdateData(TRUE);
	str1 = L"";
	if (FLAG_ERROR)
	{
		str2 = L"ERROR!";
	}
	else
	{
		if (result - int(result) < 1e-6)
		{
			str2.Format(L"%d", (int)result);
		}
		else
		{
			str2.Format(L"%f", result);
		}
	}
	UpdateData(FALSE);
}

8.心路历程及收获

在开始作业之前,先是去查了些资料,发现实现可视化界面有很多方式,一开始是选择了python语言,因为有很多库函数便于理解和实现,但碍于对语言的不熟悉,最后还是选择了vs上的MFC用c++实现,还有一个好处是它提供了代码框架,可以较多时间放在设计和函数实现上。

关于单元测试,由于是基于MFC,遇到了许多问题,测试时也总是弹出“不支持尝试执行的操作”来中断测试,目前还未解决,但是测试能够通过。

可惜的是这次作业没能完成其他计算功能,计算器设计也比较简陋。但也算是有所收获,通过这次作业,对可视化界面的设计有了初步的认识和经验。希望我能在接下来的学习中做的更好,解决这次遇到的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值