基于对话框的程序设计——计算器编程PPT课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CRect StandardRc;
//StandardRc表示标准型的范围
Operator m_operator;
//运算符标志
Func m_func;
//函数标志
CalcError m_errorState; //错误标志
BOOL m_bOperandAvail; //输入标志,输入为真
void ExpandToSentific(); //扩展成科学性计算器
i-=1;
}
}
UpdateData(FALSE);
}
.
7
4.在头文件Ccalc.h中添加消息响应代码:afx_msg
void OnOperandInput(UINT nID);
• 在实现文件Ccalc.cpp中添 加如下代码:
• ON_COMMAND_RANGE(ID C_0,IDC_9,OnOperandInput )
else m_accum /= m_operand; OpAdd) m_accum += m_operand;
else if(m_operator ==
else if(m_operator == OpSubtract) m_accum -= m_operand;
else if(m_operator == OpCm) m_accum=pow(m_accum,m_operand);
比如本程序中在定义枚举类型后在四则运算等号小数点开方去反倒数清零按钮的消息映射函数使用了定义的枚举类型中的常数在指数科学计数余弦函数正弦函数自然对数底数为10的对数正切函数阶乘的函数实现中也用到了枚举类型定义的变量的值而相关变量也只能使用所定义的常数
基于对话框的程序设计
——计算器编程
班级:环工1402 姓名:陈大川 学号:201405010201
//小数点标志, =1输入小数点
float m_coff;
//小数点后的权
float DtoR; //弧度与角度的交换值,弧度时为1,角度时
为(2*PI)/360
BOOL m_bIsExpand;
//m_bIsExpand=FALSE 是标准型,
=TRUE是扩展型
CRect SentificRc;
//SentificRc表示科学型的范围
12
(3)“标准型”、“科学型”按钮的消息映射
vo函id数CC的alc代Dlg码::O如nS下tan:dard()
{m_bIsExpand=0; m_sentific=0; ExpandToSentific();} void CCalcDlg::OnSentific() {m_bIsExpand=1; m_sentific=1; ExpandToSentific();}
void CCalcDlg::OnPoint()
//小数点
{m_bCoff=1;UpdateDisplay();}
void CCalcDlg::OnMinus()
//减法
{Calc();m_operator=OpSubtract;}
void CCalcDlg::OnMultiply()
//乘法
{Calc();m_operator=OpMultiply;}
m_bOperandAvail = FALSE;
m_bCoff=0;
m_coff=0.1;
UpdateDisplay();
}
.
9
6.完成消息映射:
(1)标准型计算器的消息映射函数。 1)按下数字键0~9的消息映射函数
OnOperandInput()的程序代码如下,该函数的功能 void CCalcDlg::OnOpe是ran得dIn到put输(U入INT的nI数D) 字。
else m_operand=m_operand+(nID-ID_0)*m_coff,m_coff*=0.1;
m_bOperandAvail=TRUE;
UpdateDisplay();
}
.
10
四则运 算、等 号、小 数点、 开方、 倒数、 清零的 消息映 射函数 的程序 代码如 下:
void CCalcDlg::OnEqual()
void CCalcDlg::ExpandToSentific()
{if(m_bIsExpand)
SetWindowPos(NULL,0,0,SentificRc.Width(),SentificRc.Height(),
SWP_NOMOVE|SWP_NOZORDER);
else
SetWindowPos(NULL,0,0,StandardRc.Width(),SentificRc.Height(),
else {
float lVal = (m_bOperandAvail) ? m_operand :
m_accum;
m_result.Format(_T("%f"),lVal);
int i=m_result.GetLength();
while(m_result.GetAt(i-1)=='0') {
m_result.Delete(i-1,1);
if(m_bOperandAvail) m_operand=pow(10,m_operand);UpdateDisplay();}
void CCalcDlg::OnCos()
//余弦函数
{if(m_errorState !=ErrNoห้องสมุดไป่ตู้e) return ;
if(m_bOperandAvail) m_operand=cos(m_operand*DtoR);UpdateDisplay();}
void CCalcDlg::OnClear()
//清零
{m_operator=OpNone;
m_operand=0; m_accum=0; m_bOperandAvail=FALSE;
void CCalcDlg::OnReciprocal() {if(m_errorState != ErrNone) return;
if(m_bOperandAvail) m_operand=log10(m_operand);UpdateDisplay();}
void CCalcDlg::OnTan()
//正切函数
{if(m_errorState !=ErrNone) return ;
if(m_bOperandAvail) m_operand=tan(m_operand*DtoR);UpdateDisplay();}
x的y次方运算。
.
3
3.本计算器通过单选按钮来实现 在科学型和标准型计算器界面的 转换和角度和弧度之间的转换。
.
4
二.实现过程介绍:
1.在CCalcDlg.h头文件中定义成员变量和成员函数
如下:
public:
float m_operand;
//运算数
float m_accum;
//运算结果
BOOL m_bCoff;
if(m_operator == OpNone) m_accum = m_operand;
else if(m_operator == OpMultiply) m_accum *= m_operand;
else if(m_operator == OpDivide)
if(m_operand == 0) m_errorState = ErrDivideByZero;
void CCalcDlg::OnDivid()
//除法
{Calc();m_operator=OpDivide;}
void CCalcDlg::OnSqrt()
//平方根
{if(m_errorState !=ErrNone) return ;
if(m_bOperandAvail) m_operand=sqrt(m_operand);UpdateDisplay();}
.
1
一.基本概况:
1.本计算器可以实现 在标准型和科学型计 算器之间的切换。在 标准型界面,完成一 些基本运算,如加、 减、乘、除、平方、 开方、取倒数的一些
基本运算。
.
2
2.在科学型界面时, 可以完成一些高级运 算,比如:取以e为底 的指数,取自然对数, 取以10为底的指数, 取以10为底的对数, 计算正弦,余弦,正 切,取n的阶乘运算,
//倒数
m_errorState=ErrNone;
if(m_bOperandAvail)
m_coff=0.1;
m_op.erand=1/m_operand;UpdateDisplay();} 11
UpdateDisplay();}
(2)科学型计算器的消息映射函数代码如下:
void CCalcDlg::OnExp()
void CCalcDlg::OnSin()
//正弦函数
{if(m_errorState !=ErrNone) return ;
if(m_bOperandAvail) m_operand=sin(m_operand*DtoR);UpdateDisplay();}
void CCalcDlg::OnLn()
注意: ON_COMMAND_RANGE的 函数原型 :ON_COMMAND_RANGE(id 1,id2,memberFxn);
• 与ID_DISPLAY、 IDC_SENTIFIC、 IDC_ANGLE相关的成员 变量的定义如下:
CString result; //显示 编辑框的内容
int m_sentific; //m_sentific=0是标准 型, =1是科学型
其中,id1制定多个的起始ID
值,id2制定多个控件的结
束ID值,memberFxn指定
消息映射函数名。
.
int m_isRad;
//m_isRad=1是弧度,
=0是角度
8
5.如果输入有错,则返回。否则,如果输入标志m_bOperandAvail为真,
则根据操作符m_operator的值进行四则运算,得到运算结果m_accum。将
void UpdateDisplay();
//更新显示
void Calc();
.//计算
5
2.根据m_bIdExpand的值来设置计 算器的类型。如果该值为FALSE,则 用SetWindowPos()函数将运算器 的窗口设置为标准型;如果该值 为TRUE,则用SetWindowPos()函数 将运算器的窗口设置为科学型。 实现代码如下:
//以e为底的指数
{if(m_errorState !=ErrNone) return ;
if(m_bOperandAvail) m_operand=exp(m_operand);UpdateDisplay();}
void CCalcDlg::OnSquar()
//以10为底的指数
{if(m_errorState !=ErrNone) return ;
//等于
{Calc();m_operator=OpNone;}
void CCalcDlg::OnAdd()
//加法
{Calc();m_operator=OpAdd;}
void CCalcDlg::OnBackspace()
//退格
{m_operand=(int)m_operand/10;UpdateDisplay();}
标志m_bOperandAvail置为真,小数点标志m_bCoff置为0,小数的权
m_coff置为0.1,最后调用UpdateDisplay()函数以更新对话框。代码如
void CCalcDlg::Calc()
下:
{
if(m_errorState != ErrNone) return ;
if(m_bOperandAvail) {
void CCalcDlg::OnRactorial()
//阶乘
{if(m_errorState !=ErrNone) return ;
if(m_bOperandAvail) for(int i=m_operand-1;i>=1;i--)
m_operand*=i;UpdateDisplay();}
.
{
if(m_errorState != ErrNone) return ;
if(m_func != FuncNone) m_func=FuncNone, Calc();
if(!m_bOperandAvail) m_operand = 0;
if(!m_bCoff) m_operand=m_operand*10+(nID-ID_0);
//自然对数
{if(m_errorState !=ErrNone) return ;
if(m_bOperandAvail) m_operand=log(m_operand);UpdateDisplay();}
void CCalcDlg::OnLog()
//底数为10 的对数
{if(m_errorState !=ErrNone) return ;
SWP_NOMOVE|SWP_NOZORDER);
UpdateData(FALSE);
}
.
6
3.最后调用UpdateDisplay() 函数更新对话框,代码如 下:
void CCalcDlg::UpdateDisplay()
{
if(m_errorState != ErrNone) m_result="除数不能为零";
相关文档
最新文档