这个作业属于哪个课程 | 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表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 10 |
• Estimate | • 估计这个任务需要多少时间 | 20 | 15 |
Development | 开发 | 200 | 220 |
• Analysis | • 需求分析 (包括学习新技术) | 100 | 120 |
• Design Spec | • 生成设计文档 | 50 | 40 |
• Design Review | • 设计复审 | 10 | 10 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 5 | 10 |
• Design | • 具体设计 | 30 | 40 |
• Coding | • 具体编码 | 180 | 150 |
• Code Review | • 代码复审 | 30 | 20 |
• Test | • 测试(自我测试,修改代码,提交修改) | 60 | 80 |
Reporting | 报告 | 120 | 120 |
• Test Repor | • 测试报告 | 20 | 10 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 20 | 30 |
合计 | 865 | 885 |
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,遇到了许多问题,测试时也总是弹出“不支持尝试执行的操作”来中断测试,目前还未解决,但是测试能够通过。
可惜的是这次作业没能完成其他计算功能,计算器设计也比较简陋。但也算是有所收获,通过这次作业,对可视化界面的设计有了初步的认识和经验。希望我能在接下来的学习中做的更好,解决这次遇到的问题。