目录
一.设计题目。 (1)
二.设计目的和内容。 (1)
三.基本功能描述。 (2)
四.设计思路。 (2)
五.软件设计:设计步骤、界面设计、关键功能的实现。 (3)
a)设计步骤。 (3)
b)界面设计。 (4)
c)关键功能的实现。 (5)
六.附录。 (8)
一.设计题目。
小型计算器程序的编写.
二.设计目的和内容。
【设计目的】
1学习Visual C++的MFC开发程序的步骤。
2综合运用所学的类、继承和多态的知识。
3进一步掌握程序的调试方法。
【设计内容】
1利用MFC的向导,创建基于对话框的应用程序,添加按钮、编辑框等控件;
第1页
2实现算术加、减、乘、除等运算;
3选做:三角函数的运算、对数运算、指数运算、进制转换等。
三.基本功能描述。
具备整型数据、浮点型数据的算术(加、减、乘、除)运算功能。依次输入第一个运算数、运算符(+,-,*,/)、第二个运算数,然后输出结果,按‘C E’键清屏。
四.设计思路。
a)首先考虑对所有按键分为两类,数字类和符号类。0,1,2,3,4,5,6,7,8,9为
数字类,+,-,*,/为符号类。数字在计算过程中最多需要保存两个,所以定义了两个double型变量num1和num2来进行存储,符号需要一个char型变量cal来存储。
b)为显示数字的编辑框设立一个double型的关联变量m_Num,为显示符号的编
辑框设立一个CString型的关联变量m_result,设立一个int型的小数点标志dotflag,设立一个int型的键入数字标志numflag,设立一个long型的小数部分权值quan,最后为了防止用户输入错误,设立一个判断输入是否为数字的int型标志mark。
c)然后考虑到在计算过程中num1和num2的储存状态有三种,num1==0和
num2==0,也就是程序开始运行还没有开始录入数字的状态;num1!=0和num2==0,也就是第一个数字已经录入,第二个数字还没有录入的状态这时候把m_Num的值赋给num1,m_Num归零;num1!=0和num2!=0,把m_Num的值赋给num2,m_Num归零,令m_Num等于num1和num2合并后的值。
五.软件设计:设计步骤、界面设计、关键功能的实现。
a)设计步骤。
1.添加头文件。
将test.cpp改为test.h将其添加到计算器Dlg.cpp : implementation file中,如下:#include "test.h"。
2.成员函数及其释义。
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestDlg::IDD, pParent)
{
m_Num =0.0;
m_result = _T("");
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_DISPLAY, m_Num);
DDX_Text(pDX, IDC_EDIT2_SIGNS, m_result);}
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_NUM1, OnButtonNum1)
ON_BN_CLICKED(IDC_BUTTON_NUM2, OnButtonNum2)
ON_BN_CLICKED(IDC_BUTTON_NUM3, OnButtonNum3)
ON_BN_CLICKED(IDC_BUTTON_NUM4, OnButtonNum4)
ON_BN_CLICKED(IDC_BUTTON_NUM5, OnButtonNum5)
ON_BN_CLICKED(IDC_BUTTON_NUM6, OnButtonNum6)
ON_BN_CLICKED(IDC_BUTTON_NUM7, OnButtonNum7)
ON_BN_CLICKED(IDC_BUTTON_NUM8, OnButtonNum8)
ON_BN_CLICKED(IDC_BUTTON_NUM9, OnButtonNum9)
ON_BN_CLICKED(IDC_BUTTON_ZHENGFU, OnButtonZhengfu)
ON_BN_CLICKED(IDC_BUTTON_DENGYU, OnButtonDengyu)
ON_BN_CLICKED(IDC_BUTTON_NUM0, OnButtonNum0)
ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
ON_BN_CLICKED(IDC_BUTTON_MULTIPLY, OnButtonMultiply)
ON_BN_CLICKED(IDC_BUTTON_DIVIDE, OnButtonDivide)
ON_BN_CLICKED(IDC_BUTTON_PLUS, OnButtonPlus)
ON_BN_CLICKED(IDC_BUTTON_MINUS, OnButtonMinus)
ON_BN_CLICKED(IDC_BUTTON_DOT, OnButtonDot)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
b)界面设计。
1.仿照Windows附件里面的计算器,在资源视图中画好界面,如图1:
图1
2.修改每个button的属性,如图2:
图2
3.修改每个button的处理机制,如图:
在类向导Classwizard窗口中进行,如下图3:
图3其他button按钮的修改类似。
4.修改每个edit的类型和名称,如图4:
在类向导Classwizard窗口中进行:
图4单击Add Variable按钮,在如下窗口中进行修改,如图5:
图5
另一个edit的修改类似。
c)关键功能的实现。
1.OnButtonNum8()按钮的处理函数。
void CTestDlg::OnButtonNum8()
{
if(dotflag==1)
{
quan= quan*10;
m_Num += 8 / (double)quan;
}
else
{
if(numflag==1)
{
m_Num = m_Num * 10 + 8;
}
else m_Num = 8;
}
numflag = 1;
mark=1;
UpdateData(FALSE);
}
其他数字按钮的处理函数均与其类似。2.OnButtonMultiply()按钮的处理函数。
void CTestDlg::OnButtonMultiply()
{
UpdateData();
num1 = m_Num;
cal = '*';
numflag = 0;
dotflag = 0;
quan = 1;
m_result='*';
mark=0;
UpdateData(FALSE);
}
其他符号按钮的处理函数均与其类似。3.OnButtonDot()按钮的处理函数。
void CTestDlg::OnButtonDot()
{
UpdateData();
dotflag = 1;
m_Num += 0.0;
m_result='.';
}
4.OnButtonClear()按钮的处理函数。
void CTestDlg::OnButtonClear()
{
UpdateData();
m_Num =0;
m_result=' ';
num1 = 0;
num2 = 0;
numflag=0;
dotflag=0;
quan=1;
mark=0;
UpdateData(FALSE);
}
5.OnButtonDengyu()按钮的处理函数。
void CTestDlg::OnButtonDengyu()
{
if(mark==1){
num2 = m_Num;
switch(cal)
{
case '+': m_Num = num1 + num2;cal=0;break;
case '-': m_Num = num1 - num2;cal=0; break;
case '*': m_Num = num1 * num2;cal=0;break;
case '/': m_Num = num1 / num2;cal=0; break;
}
numflag = 0;
dotflag = 0;
quan = 1;
UpdateData(FALSE);
}
else
MessageBox("error");
}
6.OnButtonZhengfu()按钮的处理函数。
void CTestDlg::OnButtonZhengfu()
{
UpdateData();
m_Num = 0-m_Num;
}
六.附录。
1.调试。
图6
图7
24/6
2.测试结果。
图8结果=4.
3.关键源代码。
void CTestDlg::OnButtonNum1()
{
if(dotflag==1)
{
quan=10*quan;
m_Num += 1 / (double)quan;
}
else
{
if(numflag==1)
{
m_Num = 10*m_Num+ 1;
}
else m_Num =1;
}
numflag = 1;
mark=1;
UpdateData(FALSE);
}
void CTestDlg::OnButtonNum2()
{
if(dotflag==1)
{
quan = quan*10;
m_Num += 2 / (double)quan;
}
else
{
if(numflag==1)
{
m_Num = m_Num * 10 + 2;
}
else m_Num = 2;
}
numflag = 1;
mark=1;
UpdateData(FALSE);
}
void CTestDlg::OnButtonNum3()
{
if(dotflag==1)
{
quan= quan*10;
m_Num += 3 / (double)quan;
}
else
{
if(numflag==1)
{
m_Num = m_Num * 10 + 3;
}
else m_Num = 3;
}
numflag = 1;
mark=1;
UpdateData(FALSE);
}
void CTestDlg::OnButtonNum4()
{
if(dotflag==1)
{
quan= quan*10;
m_Num += 4 / (double)quan;
}
else
{
if(numflag==1)
{
m_Num = m_Num * 10 + 4;
}
else m_Num = 4;
}
numflag = 1;
mark=1;
UpdateData(FALSE);
}
void CTestDlg::OnButtonNum5()
{
if(dotflag==1)
{
quan= quan*10;
m_Num += 5 / (double)quan;
}
else
{
if(numflag==1)
{
m_Num = m_Num * 10 + 5;
}
else m_Num = 5;
}
numflag = 1;
mark=1;
UpdateData(FALSE);
}
void CTestDlg::OnButtonNum6()
{
if(dotflag==1)
{
quan= quan*10;
m_Num += 6 / (double)quan;
}
else
{
if(numflag==1)
{
m_Num = m_Num * 10 + 6;
}
else m_Num = 6;
}
numflag = 1;
mark=1;
UpdateData(FALSE);
}
void CTestDlg::OnButtonNum7()
{
if(dotflag==1)
{
quan= quan*10;
m_Num += 7 / (double)quan;
}
else
{
if(numflag==1)
{
m_Num = m_Num * 10 + 7;
}
else m_Num = 7;
}
numflag = 1;
mark=1;
UpdateData(FALSE);
}
void CTestDlg::OnButtonNum8()
{
if(dotflag==1)
{
quan= quan*10;
m_Num += 8 / (double)quan;
}
else
{
if(numflag==1)
{
m_Num = m_Num * 10 + 8;
}
else m_Num = 8;
}
numflag = 1;
mark=1;
UpdateData(FALSE);
}
void CTestDlg::OnButtonNum9()
{
if(dotflag==1)
{
quan= quan*10;
m_Num += 9 / (double)quan;
}
else
{
if(numflag==1)
{
m_Num = m_Num * 10 + 9;
}
else m_Num = 9;
}
numflag = 1;
mark=1;
UpdateData(FALSE);
}
void CTestDlg::OnButtonNum0()
{
if(dotflag==1)
{
quan= quan*10;
m_Num += 0 / (double)quan;
}
else
{
if(numflag==1)
{
m_Num = m_Num * 10 + 0;
}
else m_Num = 0;
}
numflag = 1;
mark=1;
UpdateData(FALSE);
}
void CTestDlg::OnButtonZhengfu()
{
UpdateData();
m_Num = 0-m_Num;
UpdateData(FALSE);
}
void CTestDlg::OnButtonDengyu()
{
if(mark==1){
num2 = m_Num;
switch(cal)
{
case '+': m_Num = num1 + num2;cal=0;break;
case '-': m_Num = num1 - num2;cal=0; break;
case '*': m_Num = num1 * num2;cal=0;break;
case '/': m_Num = num1 / num2;cal=0; break;
}
numflag = 0;
dotflag = 0;
quan = 1;
UpdateData(FALSE);
}
else
MessageBox("error"); }
void CTestDlg::OnButtonClear() {
UpdateData();
m_Num =0;
m_result=' ';
num1 = 0;
num2 = 0;
numflag=0;
dotflag=0;
quan=1;
mark=0;
UpdateData(FALSE);
}
void CTestDlg::OnButtonMultiply() {
UpdateData();
num1 = m_Num;
cal = '*';
numflag = 0;
dotflag = 0;
quan = 1;
m_result='*';
mark=0;
UpdateData(FALSE);
}
void CTestDlg::OnButtonDivide() {
UpdateData();
num1 = m_Num;
cal = '/';
numflag = 0;
dotflag = 0;
quan = 1;
m_result='/';
mark=0;
UpdateData(FALSE);
}
void CTestDlg::OnButtonPlus() {
UpdateData();
num1 = m_Num;
cal = '+';
numflag = 0;
dotflag = 0;
quan = 1;
m_result='+';
mark=0;
UpdateData(FALSE);
}
void CTestDlg::OnButtonMinus() {
UpdateData();
num1 = m_Num;
cal = '-';
numflag = 0;
dotflag = 0;
quan = 1;
m_result='-';
mark=0;
UpdateData(FALSE);
}
void CTestDlg::OnButtonDot() {
UpdateData();
dotflag = 1;
m_Num += 0.0;
m_result='.';
UpdateData(FALSE);
}
class CTestDlg : public CDialog {
public:
int mark;
long quan;
int numflag;
int dotflag;
char cal;
double num2;
double num1;
CTestDlg(CWnd* pParent = NULL); // standard constructor enum { IDD = IDD_TEST_DIALOG };
double m_Num;
CString m_result;
protected:
virtual void DoDataExchange(CDataExchange* pDX);
// Implementation
protected:
HICON m_hIcon;
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButtonNum1();
afx_msg void OnButtonNum2();
afx_msg void OnButtonNum3();
afx_msg void OnButtonNum4();
afx_msg void OnButtonNum5();
afx_msg void OnButtonNum6();
afx_msg void OnButtonNum7();
afx_msg void OnButtonNum8();
afx_msg void OnButtonNum9();
afx_msg void OnButtonZhengfu();
afx_msg void OnButtonDengyu();
afx_msg void OnButtonNum0();
afx_msg void OnButtonClear();
afx_msg void OnButtonMultiply();
afx_msg void OnButtonDivide();
afx_msg void OnButtonPlus();
afx_msg void OnButtonMinus();
afx_msg void OnButtonDot();
DECLARE_MESSAGE_MAP()
};