可视化编程MFC计算器
简单MFC程序设计(编写一个小型计算器)
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()
m_Num = m_Num * 10 + 8; } else m_Num = 8; } numflag = 1; mark=1; UpdateData(FALSE); } void CTestDlg::OnButtonNum9()
5
{ 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);
是否为数字的 int 型标志 mark。
c) 然后考虑到在计算过程中 num1 和 num2 的储存状态有三种,num1==0 和
num2==0,也就是程序开始运行还没有开始录入数字的状态;num1!=0 和
num2==0,也就是第一个数字已经录入,第二个数字还没有录入的状态这时
基于MFC简易计算器
上机指导书一、对话框编程1、建立一个基于对话框的应用程序Calculator;2、为CCalculatorDlg建立对话框资源,如下图所示3、为CCalculatorDlg添加成员变量:char m_buffer[100];//用来存贮需要显示的数字CString m_StrBegin;//记录初始操作数的字符串double m_end;//记录结果操作数double m_begin;//记录初始操作数int m_bit;//记录运算符int m_IsCheckPoint;//判断是否按下了小数点符号,当其为0时,表示没有按下4、为应用程序添加CEdit类的派生类CAdvEdit,并为该类添加三个成员函数:其中OnPaint()为虚函数。
这三个函数的函数体如下:void CAdvEdit::OnDisplay(LPCTSTR lpszStr){m_Caption=lpszStr; OnDraw();}void CAdvEdit::OnDraw(){CRect rect; GetClientRect(&rect);CDC *pDC=GetDC(); pDC-> SetBkMode(TRANSPARENT);CBrush *pBrush=new CBrush(RGB(255,255,255));pDC-> FillRect(&rect,pBrush); pDC-> SetTextColor(RGB(92,92,92));pDC-> DrawText(m_Caption,rect,DT_SINGLELINE|DT_VCENTER|DT_RIGHT);}void CAdvEdit::OnPaint(){CPaintDC dc(this); // device context for paintingOnDraw();}5、对话框资源中的编辑框添加控件类型的成员变量:CAdvEdit m_DspEdit;6、为应用程序CCalculatorDlg类添加成员函数Result()/,来处理运算符操作:void CCalculatorDlg::Result()//用来处理按下符号键时的函数,是计算的核心函数{m_IsCheckPoint = false;m_begin = atof(m_StrBegin);switch(m_bit){ case 1: m_end += m_begin; break; //处理+号case 2: m_end -= m_begin; break; //处理-号case 3: m_end *= m_begin; break; //处理*号,即乘法case 4: //处理/号,即除法if (m_begin==0) { m_DspEdit.OnDisplay("除数不能为零!"); return; }m_end /= m_begin; break;case 5: //处理sqrt号,即开方if (m_end<0) { m_DspEdit.OnDisplay("函数输入无效!"); return; }m_end = sqrt(m_end); break;case 6: //处理1/x号,即求倒数m_end = 1/m_end; break;default: m_end = m_begin; break;}m_begin = 0.0; m_bit = 0; m_StrBegin = "";int i = sprintf(m_buffer,"%10.12f",m_end);//将结果转换为字符串TrimZero(m_buffer,i); //去掉字符串尾部多余的零m_DspEdit.OnDisplay(m_buffer);}7、为对话框的运算符按钮添加消息处理函数:void CCalculatorDlg::AdvButtonPoint() //按下.键时的处理函数{ if (!m_IsCheckPoint && m_StrBegin != ""){ m_StrBegin = m_StrBegin+"."; m_DspEdit.OnDisplay(m_StrBegin);m_IsCheckPoint = true; } }void CCalculatorDlg::AdvButtonAdd(){ Result(); m_bit = 1; }void CCalculatorDlg::AdvButtonSub(){ Result(); m_bit = 2; }void CCalculatorDlg::AdvButtonMul(){ Result(); m_bit = 3; }void CCalculatorDlg::AdvButtonDiv(){ Result(); m_bit = 4; }void CCalculatorDlg::AdvButtonClear(){ m_IsCheckPoint = false; m_StrBegin = "";m_begin = 0.0; m_end = 0.0; m_bit = 0; m_DspEdit.OnDisplay("0."); }void CCalculatorDlg::AdvButtonSqrt(){ Result(); m_bit = 5; }void CCalculatorDlg::AdvButtonReverse(){ Result(); m_bit = 6; }void CCalculatorDlg::AdvButtonEqu() //按下=键时的处理函数{ Result(); m_bit = 7; }8、为对话框的数字按钮添加消息处理函数:void CCalculatorDlg::Button0()//按下0键时的处理函数{ m_StrBegin = m_StrBegin+"0";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button1(){ m_StrBegin = m_StrBegin+"1";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button2(){ m_StrBegin = m_StrBegin+"2";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button3(){ m_StrBegin = m_StrBegin+"3";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button4(){ m_StrBegin = m_StrBegin+"4";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button5(){ m_StrBegin = m_StrBegin+"5";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button6(){ m_StrBegin = m_StrBegin+"6";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::Button7(){ m_StrBegin = m_StrBegin+"7";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::vButton8(){ m_StrBegin = m_StrBegin+"8";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }void CCalculatorDlg::vButton9(){ m_StrBegin = m_StrBegin+"9";if (!m_IsCheckPoint) m_DspEdit.OnDisplay(m_StrBegin+"."); else m_DspEdit.OnDisplay(m_StrBegin); }9、为应用程序CCalculatorDlg类添加成员函数TrimZerot()/,来去掉字符串尾部多余的零:void CCalculatorDlg::TrimZero(char *pStr,int iLen)//用于去掉字符串尾部多余的零。
用MFC制作简易计算器
面向对象编程技术课程设计课题名称:用VC++制作简单计算器用VC++制作简单计算器简述:该课程设计将实现一个简单计算器。
其类似于Windows附件中自带的计算器。
这个计算器可以实现简单的四则运算功能,而且具有简洁大方的图文外观。
系统具有良好的界面和必要的交互信息。
即时准确地获得需要的计算的结果,充分降低了数字计算的难度,从而节约了时间,对人们的生活有一定的帮助。
在课程设计中,程序设计设计语言采用Visual C++,在程序设计中,采用了面向对象解决问题的方法。
课题背景计算器是日常生活中十分便捷有效的工具,能实现加、减、乘、除简单运算的工具。
要实现计算功能,可以用VC++的知识编写程序来解决此问题。
该计算器大大的降低了数字计算的难度及提高了计算的准确度和精确度。
该计算器使用非常简单和方便,对广大中小学生的学习有巨大帮助作用,也对在职人员的工作有点帮助作用。
功能说明系统具有良好的界面;必要的交互信息;简约美观的效果。
使用人员能快捷简单地进行操作。
可单机按钮进行操作即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。
(1)包含的功能有:加、减、乘、除;(2)计算器上数字分为显示区,可以显示用户所点击的按键,最后显示结果;按键区,可以让用户选择所需的数字以及小数点;功能区,该区域提供用户所需的运算按钮;(3)计算功能基本上是用系统内部函数;(4)“AC”按钮可以清除所有已输入的数据从头计算;(5)“DEL”按钮可以删除所输入的最后以为数字;编辑资源创建步骤新建一个MFC基于对话框的工程VC++对话框界面右击按钮,修改按钮的属性建立类向导最后点击Edit Code就可以添加代码对其它按钮的操作与之类似,对编辑框的“建立类向导”有点区别,这里不附详细步骤代码展示“1”按钮对应的代码void CMyDlg::OnButton1(){UpdateData(1);if(pass1==1 )m_str="1";else m_str+="1";pass1=0;UpdateData(0);}“2”按钮对应的代码void CMyDlg::OnButton2(){UpdateData(1);if(pass1==1 )m_str="2";else m_str+="2";pass1=0;UpdateData(0);}“3”按钮对应的代码void CMyDlg::OnButton3(){UpdateData(1);if(pass1==1 )m_str="3";else m_str+="3";pass1=0;UpdateData(0);}“4”按钮对应的代码void CMyDlg::OnButton3(){UpdateData(1);if(pass1==1 )m_str="4";else m_str+="4";pass1=0;UpdateData(0);}“5、6、7、8、9、0”按钮对应的代码与“1、2、3、4”按钮对应的代码相近“=”按钮对应的代码void CMyDlg::Onresult(){UpdateData(1);int i,z,s,j,x=0,y=1,t,m=1;char b[10];double rate=10.0,itemp=0.0,a[20];for(i=0;i<20;i++)a[i]=1000000.0;for(i=0;i<10;i++)b[i]=' ';z=0;for(i=0;i<m_str.GetLength();i++) {if(isdigit(m_str.GetAt(i))){if(rate==10.0){ itemp=itemp*rate+(m_str.GetAt(i)-'0');if(i==m_str.GetLength()-1)a[z]=itemp;}else{itemp=itemp+rate*(m_str.GetAt(i)-'0');rate=rate/10;if(i==m_str.GetLength()-1)a[z]=itemp;}}else if(m_str.GetAt(i)=='.')rate=0.1;else if(m_str.GetAt(i)=='+') {a[z]=itemp;itemp=0;z++;b[z]='+';z++;rate=10.0;}else if(m_str.GetAt(i)=='-') {a[z]=itemp;itemp=0;z++;b[z]='-';z++;rate=10.0;}else if(m_str.GetAt(i)=='*')a[z]=itemp;itemp=0;z++;b[z]='*';z++;rate=10.0;}else if(m_str.GetAt(i)=='/'){a[z]=itemp;itemp=0;z++;b[z]='/';z++;rate=10.0;}}s=z;for(j=0;j<=s;j++){if(b[j]=='/'){a[j+1]=1/a[j+1];b[j]='*';}}for(j=0;j<=s;j++){if(b[j]=='*'){if(j-t==2){a[t-m]=a[t-m]*a[j+1];m=m+2;}elsea[j-1]=a[j-1]*a[j+1];a[j+1]=1000000.0;b[j]=' ';t=j;}}for(j=0;j<=s;j++){if(a[j]!=1000000.0) //如果a[i]的值不为0.0a[x]=a[j]; //把a[i]的值赋给a[x] x+=2; //x自加2}if(b[j]!=' ') //如果b[i]的值不为空格{b[y]=b[j]; //把b[i]的值赋给b[y]y=y+2; //y自加2}}for(j=0;j<=y-2;j++) {if(b[j]=='+') //如果b[i]等于加号a[0]=a[0]+a[j+1];else if(b[j]=='-') //如果b[i]等于减号a[0]=a[0]-a[j+1];}m_str.Format("%1f",a[0]);UpdateData(0);}“+”按钮对应的代码void CMyDlg::Onadd(){UpdateData(1);m_str+="+";UpdateData(0);}“-”按钮对应的代码void CMyDlg::Onjian(){UpdateData(1);m_str+="-";UpdateData(0);}“*”按钮对应的代码void CMyDlg::Oncheng(){UpdateData(1);m_str+="*";UpdateData(0);}“/”按钮对应的代码void CMyDlg::Onchu(){UpdateData(1);m_str+="/";UpdateData(0);}“AC”按钮对应的代码void CMyDlg::Onac(){UpdateData(1);m_str="0";pass1=1;UpdateData(0);}“DEL”按钮对应的代码void CMyDlg::Ondel(){UpdateData(1);if(m_str!="0" && m_str.GetLength()>1)m_str=m_str.Left(m_str.GetLength()-1);else{m_str="0";}UpdateData(0);}“.”按钮对应的代码void CMyDlg::Onpoint(){UpdateData(1);if(pass1==1)m_str=".";elsem_str+=".";pass1=0;UpdateData(0);}效果图。
可视化编程课程设计(含源码)计算器系统实现
设计题目:计算器系统实现1.分别用API与MFC编程来实现计算器的以下功能。
2.实现计算器的基本功能:连续数据的无优先级混合运算(加减乘除)3.可以实现其他附加功能:优先级运算,加入括号,加入其他函数运算功能等。
(不在要求范围之内)4.要求界面良好,功能完整。
一.基于MFC的简单计算器1.设计思路打开MFC应用操作界面,布局计算器界面,利用组框将计算器界面分为三个部分,一个是编辑输入,一个是数字界面,一个是功能键部分。
利用布局参考线对齐按钮,使界面美观。
然后就是对各个按钮进行属性设置,关联类设置,接着对各个按钮进行源代码编程。
最后,调试找出问题,解决问题,运行MFC成品计算器。
2.简单操作以及功能说明由于本人技术有限,所以本程序只能按照正确的计算运算顺序进行,该简单计算器能进行四则混合运算,除了加减乘除外,添加了一个括号,对于有些未知的错误,由于时间有限,并未来得及全面测试使用。
该简单计算器能实现四则运算,退格运算,清零运算,并且支持输出的结果保留给直接的下一个运算。
3.系统实现的各个模块1)编辑框模块由于编辑框模块需要连续输入字符串,所以在给编辑框建立类向导时,给编辑框定义的成员变量应该是字符串(String)变量。
编辑框模块用于运算算式的输入,以及结果的输出。
2)数字键模块数字键模块比较简单,该简单计算器数字键模块设置有0~9数字,还设置有小数点,以及正负数转换实现按钮。
数字键模块按钮在建立类向导时无需定义成员变量,但是需要定义按钮响应链接,用于实现点击按钮,在编辑框上显示点击按钮信息。
3)功能键模块功能键模块包括加减乘除基本按钮,以及一个输入错误是后能用于退格功能的退格键按钮,还有一个用于区别优先级运算的括号功能,当然有最重要的计算结果输入按钮,等于号按钮。
在编辑框附近还有一个功能键,就是清除功能键,用于清除编辑框,以便实现下一轮输入。
4.设计过程1)设计总流程图2)界面的设计3)建立的变量,控件的命名,对应的消息处理函数对应表ID CAPTION MessageHandler IDD_JISUANQI_DIALOG 简易计算器N/AIDC_NUM0 0 OnNum0IDC_NUM1 1 OnNum1IDC_NUM2 2 OnNum2IDC_NUM3 3 OnNum3IDC_NUM4 4 OnNum4IDC_NUM5 5 OnNum5IDC_NUM6 6 OnNum6IDC_NUM7 7 OnNum7IDC_NUM8 8 OnNum8IDC_NUM9 9 OnNum9IDC_OPER_ADD + OnOperAdd IDC_OPER_SUB - OnOperSub IDC_OPER_MULTI * OnOperMulti IDC_OPER_DIV / OnOperDiv IDC_ADD_SUB +/- OnAddSubIDC_POINT . OnPointIDC_EQUAL = OnEqualIDC_LBRACKET ( OnLbracket1)数字键模块void CJiSuanQiDlg::OnNum0(){if(calculated == TRUE) //已经按了等号,不让其再接受字符return;UpdateData(TRUE);//刷新编辑框界面calcutateString += "0";//存储输入的数字m_data += "0";//显示输入的数字UpdateData(FALSE);}2)功能键模块①加法功能键源程序void CJiSuanQiDlg::OnOperAdd(){if(calculated == TRUE)///其前一步按了= 号{calculated = FALSE;m_data = oldResult;double temp = atof(oldResult);//定义临时变量存储上一步结果if(temp < 0){calcutateString = "0" + oldResult;}else{calcutateString = oldResult;}calcutateString += "+";//存储做完该功能后的结果m_data += "+";//显示该步骤完成的结果UpdateData(FALSE);}else ///前一步不是={UpdateData(TRUE);calcutateString += "+";//直接存储此步操作m_data += "+";//直接显示此步操作UpdateData(FALSE);}}②退格功能键源程序void CJiSuanQiDlg::OnBackspeace(){if(calculated == FALSE){UpdateData(TRUE);int count = m_data.GetLength();if(count >= 1)//判断是否能执行退格操作{m_data = m_data.Left(count -1);count = calcutateString.GetLength();calcutateString = calcutateString.Left(count -1);UpdateData(FALSE);}}}③清除功能键源程序void CJiSuanQiDlg::OnClear(){// TODO: Add your control notification handler code herem_data = "";oldResult = "";calcutateString = "";calculated = FALSE;UpdateData(FALSE);}④括号功能键源程序void CJiSuanQiDlg::OnLbracket(){// TODO: Add your control notification handler code hereif(calculated == TRUE) ///已经按了等号,不让其再接受字符return;UpdateData(TRUE);calcutateString += "(";m_data += "(";UpdateData(FALSE);}⑤正负转换功能键源程序void CJiSuanQiDlg::OnAddSub(){// TODO: Add your control notification handler code hereif(calculated == FALSE){UpdateData(TRUE);calcutateString = calcutateString + "0" + "-";m_data += "-";UpdateData(FALSE);}}6.运行结果界面截图7.制作过程中所遇问题以及解决方法过程1)源代码编写错误通过查阅资料,请教同学,逐步一一解决。
MFC编程简单计算器
第一步:设置界面,变量及函数首先打开VC,选择MFC AppWizard[exe],设定好路径和工程名(这里我设置工程名为为“My”)。
这里要注意的是在创建向导步骤1的时候,我们选择“基本对话框”。
之后我们可以点击完成便看到以下界面此时我们把当前页面上原配的控件按Delete全部清除(如下图)1、设置界面接着我们按照MFC自带的控件选项进行我们本次计算器的控件添加(以下是控件)我们在原先清空的界面中依次用上图控件画出一个基本的计算器页面(如下图)。
上图我们用按钮控件添加一共15个按钮,分别是数字“ 0 ~ 9”以及“+ - * /”。
每个控件“属性”都有属于它自己的ID,默认的按钮按键为IDC_BUTTON0,而且Cap当然我们为了“顾名思义”,对控件ID进行修改成我们容易辨认的(也可以不改),添加完控件并修改ID之后。
(如下图)这里我们把数字按钮0 设置ID为IDC_BUTTON14_NUM0,其他的依次类推2、添加变量添加3个成员变量和一个CEdit类的变量具体添加方法,就是右键主对话框CMyDlg->Add Member Variable 也可以是在菜单栏中选择“查看”->“建立类向导”这里我们把3个编辑框控件内的变量都改变为double型的(因为进行四则运算难免出现小数点)之后再在控件IDC_EDIT3中选择"Add Variable"并且数据类型选择 Control类型此时变量自动改为了 CEdit类这步的意思是说我们把编辑框控件3的设置为CEdit类并且设置一个成员对象是m_CResult。
3、添加消息相应函数完成修改ID后,就需给控件添加消息响应了,基本操作可以是直接双击控件,便会有向导提示。
MFC默认下了的响应信息都为On_开头,而且以下显示的是数字5的消息响应.之后所有的依次类推,这步骤一般不对成员函数名称做任何修改,直接点击OK即可到此为止我们基本上完成了计算器页面的前半部分预备工作,下来是我们的对控件具体实现代码的添加第2步:添加代码1、基本控件代码首先从加法开始void CMyDlg::OnButton1(){// TODO: Add your control notification handler code hereUpdateData();double n_result;n_result = m_num1 + m_num2;m_result = n_result;char sz[20];sprintf(sz,"%f",m_result);m_CResult.SetWindowText(sz);}UpdateData() 是MFC的窗口函数,用来刷新数据的由于我们进行基本运算需要更新数据所以必须添加这个函数。
mfc编写计算器程序
计算器的介绍(1)在运行程序后,系统会弹出一个基于对话框的计算器界面,如下图所示:图1.1 计算器界面(2)在计算器程序中,主要通过一个编辑框来获取表达式和显示计算结果,表达式可以通过键盘和单击按钮2种方式输入,输入后的结果如下图所示:图1.2 输入表达式后的界面(3)在输入完表达式后,单击“=”后,开始对表达式进行计算,计算完成后,在编辑框中显示计算的结果。
图1.3 计算后的结果(4)计算器可以实现十进制转化为十六进制或二进制,其实现的操作为先输入一个十进制整数,再单击按钮“转化为二进制”或“转化为十六进制。
图1.4 输入一个十进制数100图1.5 100转化为二进制后的结果图1.6 100转化为十六进制后的结果(4)另外,计算器还可以实现一些简单的函数运算,实现的操作和十六进制/二进制转化类似,是先输入一个数字,在单击想要进行的函数的按钮,单击后就会在编辑框中显示运算的结果。
1算法的实现2.1把字符串转化为数字和运算符的算法(1)如果字符串中只有数字。
这个情况用来实现一些简单函数的运算。
在进行简单函数的运算时,都是先输入一个数字,再单击要进行运算的按钮,然后编辑框显示运算的结果。
程序用了一个函数double GetaStr(CString str)来实现这个功能,该函数以编辑框变量m_strResult为实参,再得到m_strResult的值后,调用GetAt函数,一个字符一个字符的读取,如果碰到整数,执行“itemp=itemp*rate+(str.GetAt(i)-'0');”,其中变量itemp初始值为0,变量rate初始值为10,如果碰到了小数点,改变rate的值,使其等于0.1,再向后继续读取,再碰到整数时执行“itemp=itemp+rate*(str.GetAt(i)-'0');rate=rate/10;”,函数的最后确定返回值为itemp。
以下是这个函数的代码[2]:double CMyDlg::GetaStr(CString str){int i=0;double rate=10.0,itemp=0.0;for(;i<str.GetLength();i++){if(isdigit(str.GetAt(i))) //如果字符串str.GetAt(i)的内容是整数{if(rate==10.0) //整数部分itemp=itemp*rate+(str.GetAt(i)-'0');//获得整数else //小数部分{itemp=itemp+rate*(str.GetAt(i)-'0');//获得小数rate=rate/10; //每次让rate小10倍}}else if(str.GetAt(i)=='.') //如果str.GetAt(i)是小数点rate=0.1; //让rate=0.1,开始计算小数部分 }return (itemp);}(2)如果字符串中有运算符和数字,但是没有括号。
MFC入门教程之简易计算器制作
MFC入门之简易计算器制作最近自学MFC,入门的时候走了不少弯路,所以特做此教程,希望能帮助一些人能够快速入门,少走一些弯路。
这个教程就是通过一个简易计算器的制作让大家了解MFC界面编程的基本步骤和几个常用控件的使用方法。
使用软件Visual C++ 6.0.首先,新建一个MFC基于对话框的工程。
点击文件-新建,在工程选项卡里选择MFC AppWizard[exe],给工程命名Jisuan。
点击确定。
在接下来的向导里选择基于对话框,其他选项使用默认即可,之间点击完成。
先给大家介绍一下Visual C++ 6.0的界面。
左边框起来的是文件资源控制区,默认有三个选项卡,分别是ClassView、ResourceView和FileView。
分别用来显示类、资源和文件。
中间这个主要操作区呢,就是我们用来设计界面和编程的窗口了。
现在这个是IDD_JISUAN_DIALOG资源,如图所示。
右边那个是控件工具箱,如果没有显示的话可以右击菜单栏空白区域,把控件前打上对号即可。
然后给大家介绍一下今天需要用到的控件。
如左图所示,今天主要需要用到四个控件。
第一个是静态文本控件,就是可以往对话框上放一些静态的文字。
第二个是编辑框,它是可以往里面输入文字的。
第三个是组合框,它是把用来给对话框分区,使界面更加美观明了。
第四个是按钮控件,是用来点一下产生某个操作的。
上面那个是编辑框,下面这个是按钮控件。
点一下控件,拖到对话框上,即可使用。
下面我们可以这样布局:上面两个编辑框里输入数字,中间四个按钮分别是+ - * /,然后下面编辑框里显示数字。
下面开始给大家介绍第一个最重要的操作,就是属性操作。
我们想让这些控件的显示文字改变,就需要修改它的属性。
选定某个控件,右击,选择属性,即可来改变它们的属性了。
我们挨个控件介绍。
首先是组合框。
组合框的属性,我们看到有一个ID,一个标题。
首先说明一点,每个控件都必须有一个ID值,而且一般每个控件的ID值不能相同。
mfc计算器实验报告
C++程序设计设计性实验报告实验项目名称:高级计算器设计与开发专业班级:;姓名:;学号:实验起止日期:起于年月日止于年月日实验目的:学会用C++语言和数据结构知识实现表达式的解析与计算;学会使用动态链接库技术进行编程;学会编辑、编译、运行MFC应用程序的基本过程.学会MFC可视化编程技术。
实验要求:1.能完成双精度型数值的加、减、乘、除计算;编程中使用了动态连接库技术.2.能完成双精度型数值的加、减、乘、除计算;编程中使用了动态连接库技术;能实现表达式的输入,解析与计算实验内容:1.C++语言的顺序结构,分支结构,循环结构,函数,结构体,指针,MFC可视化编程技术。
2.数据结构中的二叉树数据组织、存贮、后序遍历及其操作。
3. 使用动态链接库进行函数模块的设计,实现计算功能。
实验具体方案:按照系统设计要求,用Visual C++设计和开发一个MFC应用程序---高级计算器。
计算器的界面设计、计算功能实现、算式计算和动态链接库的使用等。
提交由需求分析:系统设计说明、系统技术文档、系统使用说明书和源程序代码为附录构成的实验报告。
需求分析:系统设计说明1.计算器界面计算器界面包括主题“高级计算器”和背景图片以及电子日历。
在计算区上有显示文本框和数字按钮以及运算符按钮。
在计算区上部分有运算模式选择模块和小提示语句。
2.模块功能简介系统分为多个模块,分别为计算模块、错误分析模块、界面显示模块和模式选择模块。
其中计算模块用来进行各种基本的加、减、乘、除的运算并且显示运算结果;错误分析模块用来进行错误处理;界面显示模块用来美化计算器界面;模式选择模块用来进行运算模式的选择和切换,以实现不同的运算要求。
3.系统结构图系统技术文档1.系统各模块主要流程图(1) 单步运算流程图(2) 算式运算流程图2.软件总体测试方案与测试记录运行程序,然后查看计算器界面和设计是否相同,进行运算模式的切换,看是否能正确的进行模式切换,查看日历显示是否正确。
MFC下的科学计算器
MFC下的科学计算器MFC (Microsoft Foundation Classes) 是Microsoft在windows上用于构建图形用户界面 (GUI) 的一套类库。
在MFC下开发一个科学计算器,可以实现基本的数学运算,包括加、减、乘、除,以及科学计数、平方、开方等功能。
首先,我们需要创建一个新的MFC应用程序项目。
在Visual Studio中选择“新建项目”,然后选择“MFC应用程序”。
在项目向导中,选择“单文档”视图,点击“完成”创建项目。
在代码视图中,我们可以使用Class Wizard来添加的响应函数。
打开Class Wizard,切换到“消息映射”选项卡,在列表中选择“控件”和“消息”,然后点击“添加函数”来添加事件处理函数。
除了基本的加减乘除功能,我们还可以添加其他的科学计算功能,例如平方、开方、三角函数等。
这些功能使用C++的数学库函数实现。
在完成功能的设计和实现后,我们可以进行调试和优化。
在调试期间,我们可以使用断点来跟踪代码的执行过程,检查变量的值和程序的状态。
如果遇到错误或异常情况,可以使用调试工具和日志功能来定位和解决问题。
同时,我们还可以根据用户的反馈和需求,对功能和界面进行优化和改进。
最后,我们可以将应用程序编译成可执行文件,方便用户安装和使用。
可以使用发布功能来生成安装程序,然后将可执行文件和相关文件打包,发布给用户。
总结一下,使用MFC开发一个科学计算器需要以下几个步骤:创建MFC应用程序项目、设计用户界面、实现计算功能、调试和优化、发布应用程序。
通过这个过程,我们可以了解和掌握MFC开发的基本流程和技巧,进一步提升编程能力和开发经验。
mfc设计科学计算器课程设计
mfc设计科学计算器课程设计一、课程目标知识目标:1. 让学生掌握MFC(Microsoft Foundation Classes)的基本概念和原理,理解其在设计科学计算器中的应用。
2. 使学生了解科学计算器的基本功能,如标准运算、三角函数、对数等,并运用MFC实现这些功能。
3. 帮助学生掌握Visual C++编程环境中MFC的使用方法,培养其运用MFC 进行软件开发的能力。
技能目标:1. 培养学生运用MFC设计界面、处理用户输入和输出结果的能力。
2. 让学生学会使用MFC中的事件处理机制,实现科学计算器的功能按键响应。
3. 提高学生的问题分析能力,使其能够根据实际需求设计合理的MFC程序结构。
情感态度价值观目标:1. 激发学生对计算机编程的兴趣,培养其主动学习和探究的精神。
2. 培养学生的团队协作意识,使其在编程实践中学会与他人分享和交流。
3. 引导学生认识到科技发展对社会进步的重要性,激发其创新精神和责任感。
课程性质:本课程为实践性较强的课程,结合理论讲解和实际操作,帮助学生掌握MFC设计科学计算器的技能。
学生特点:学生具备一定的C++编程基础,对MFC有一定了解,但实际应用能力较弱。
教学要求:结合学生特点,注重理论与实践相结合,强调动手实践,提高学生的实际编程能力。
在教学过程中,将目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. MFC基础回顾:重温MFC的基本概念、框架结构和主要类的功能,重点掌握CWnd、CDialog、CString等类的使用方法。
相关教材章节:第一章 MFC概述,第二章 MFC类和对象。
2. 科学计算器功能设计:介绍科学计算器的基本功能,如标准运算、三角函数、对数等,并分析如何利用MFC实现这些功能。
相关教材章节:第三章 MFC控件编程,第四章 MFC绘图与界面设计。
3. 界面设计与实现:讲解如何使用MFC设计科学计算器的界面,包括窗口、菜单、按钮等控件的使用方法。
MFC实现计算器
// 计算器Dlg.cpp : implementation file//#include "stdafx.h"#include "计算器.h"#include "iostream.h"#include "计算器Dlg.h"#include "stdlib.h"#include "math.h"#ifdef _DEBUGvoid CMyDlg::OnButtonR(){// TODO: Add your control notification handler code hereif(flag==false){int i;double current;cur2d=atof(m_result);if(opp=="+")m_final=cur1d+cur2d;elseif(opp=="-")m_final=cur1d-cur2d;elseif(opp=="*")m_final=cur1d*cur2d;elseif(opp=="/"){if(cur2d!=0.0)m_final=cur1d/cur2d;elsem_final=cur1d;}elseif(opp=="^"){for(i=1,current=cur1d;i<cur2d;i++)cur1d*=current;m_final=cur1d;}opp="";cur1d=m_final;m_result="";}else//当选项为扩展的计算器时{pushs(cur1);while(c_top!=-1){if(Topc()!="("){pushs(Topc());popc();}else{m_result="输入有误!!!";UpdateData(false);return;}}while(s_top!=-1){if(Tops()=="")pops();else{pushc(Tops());pops();}}//c_stack中存放的是后缀表达式;while(c_top!=-1){pushs(Topc());popc();if(Tops()=="+"){pops();CString a="";cur2d=atof(Tops());pops();cur1d=atof(Tops());pops();cur1d+=cur2d;a.Format("%f",cur1d);pushs(a);}elseif(Tops()=="-"){pops();CString a="";cur2d=atof(Tops());pops();cur1d=atof(Tops());pops();cur1d-=cur2d;a.Format("%f",cur1d);pushs(a);}elseif(Tops()=="*"){pops();CString a="";cur2d=atof(Tops());pops();cur1d=atof(Tops());pops();cur1d*=cur2d;a.Format("%f",cur1d);pushs(a);}elseif(Tops()=="/"){pops();CString a="";cur2d=atof(Tops());pops();cur1d=atof(Tops());pops();cur1d/=cur2d;a.Format("%f",cur1d);pushs(a);}}/////////////////////////////////if(s_top!=0){m_result="输入有误!!!";UpdateData(false);return;}elsem_final=atof(Tops());}//======================================================= UpdateData(FALSE);}void CMyDlg::OnButton1(){// TODO: Add your control notification handler code hereif(flag==false)m_result+="1";else{m_String+="1";cur1+="1";}UpdateData(FALSE);}void CMyDlg::OnButton2(){// TODO: Add your control notification handler code hereif(flag==false)m_result+="2";else{m_String+="2";cur1+="2";}UpdateData(FALSE);}void CMyDlg::OnChangeEdit1(){// TODO: If this is a RICHEDIT control, the control will not// send this notification unless you override the CDialog::OnInitDialog()// function and call CRichEditCtrl().SetEventMask()// with the ENM_CHANGE flag ORed into the mask.// TODO: Add your control notification handler code here}void CMyDlg::OnButton4(){// TODO: Add your control notification handler code here if(flag==false)m_result+="3";else{m_String+="3";cur1+="3";}UpdateData(FALSE);}void CMyDlg::OnButton5(){// TODO: Add your control notification handler code here if(flag==false)m_result+="4";else{cur1+="4";m_String+="4";}UpdateData(FALSE);}void CMyDlg::OnButton6(){// TODO: Add your control notification handler code here if(flag==false)m_result+="5";else{cur1+="5";m_String+="5";} UpdateData(FALSE);}void CMyDlg::OnButton7(){// TODO: Add your control notification handler code here if(flag==false)m_result+="6";else{m_String+="6";cur1+="6"; }UpdateData(FALSE);}void CMyDlg::OnButton8(){// TODO: Add your control notification handler code here if(flag==false)m_result+="7";else{cur1+="7";m_String+="7";}UpdateData(FALSE);}void CMyDlg::OnButton9(){// TODO: Add your control notification handler code here if(flag==false)m_result+="8";else{cur1+="8";m_String+="8";}UpdateData(FALSE);}void CMyDlg::OnButton10(){// TODO: Add your control notification handler code here if(flag==false)m_result+="9";else{m_String+="9";cur1+="9";}UpdateData(FALSE);}void CMyDlg::OnButton11(){ if(flag==false){ count++;if(count==1)cur1d=atof(m_result);opp="+";m_result="";}//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ else//扩展运算中操作符的作用{m_String+="+";pushs(cur1);//转换为后缀表达式if(c_top==-1)pushc("+");elseif(Topc()=="(")pushc("+");else{while(true){if(c_top==-1)break;if(Topc()=="(")break;pushs(Topc());popc();}pushc("+");}cur1="";}// TODO: Add your control notification handler code hereUpdateData(FALSE);}//----------------------------------------------------------------------------------------- void CMyDlg::OnButton12(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);opp="-";m_result="";}else{m_String+="-";pushs(cur1);//转换为后缀表达式if(c_top==-1)pushc("-");elseif(Topc()=="(")pushc("-");else{while(true){if(Topc()=="(")break;if(c_top==-1)break;pushs(Topc());popc();}pushc("-");}cur1="";}UpdateData(FALSE);// TODO: Add your control notification handler code here}//*********************************************************** void CMyDlg::OnButton13(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);opp="*";m_result="";}else{m_String+="*";pushs(cur1);if(c_top==-1)pushc("*");else //符号栈不为空的情况while(true){if(Topc()=="+"){pushc("*");break;}if(Topc()=="-"){pushc("*");break;}if(Topc()=="*"){pushs(Topc());popc();}if(Topc()=="/"){pushs(Topc());popc();}if(c_top==-1||Topc()=="("){pushc("*");break;}}cur1="";}UpdateData(FALSE);// TODO: Add your control notification handler code here}///////////////////////////////////////////////////////////////////////////////////////////// void CMyDlg::OnButton14(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);opp="/";m_result="";}else{m_String+="/";pushs(cur1);if(c_top==-1)pushc("/");elsewhile(true){if(Topc()=="+"){pushc("/");break;}if(Topc()=="-"){pushc("/");break;}if(Topc()=="*"){pushs(Topc());popc();}if(Topc()=="/"){pushs(Topc());popc();}if(c_top==-1||Topc()=="("){pushc("/");break;}}cur1="";}UpdateData(FALSE);// TODO: Add your control notification handler code here }void CMyDlg::On_Pot(){if(flag==false)m_result+=".";else{cur1+=".";m_String+=".";}UpdateData(false);// TODO: Add your control notification handler code here }void CMyDlg::On_0(){if(flag==false)m_result+="0";else{ cur1+="0";m_String+="0";}UpdateData(false);// TODO: Add your control notification handler code here }void CMyDlg::Ongenhao(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);m_result="";if(cur1d>=0.0){m_final=double(sqrt(cur1d));cur1d=m_final;}elsem_final=cur1d;}UpdateData(false);// TODO: Add your control notification handler code here }void CMyDlg::OnMiOption(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);opp="^";m_result="";}UpdateData(false);// TODO: Add your control notification handler code here}//CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC void CMyDlg::OnClear() //清空所有变量{m_final=0.0;count=0;cur1d=0.0;cur2d=0.0;cur1="";cur2="";m_String="";c_top=-1;s_top=-1;UpdateData(false);m_result="";// TODO: Add your control notification handler code here }void CMyDlg::OnR1(){// TODO: Add your control notification handler code hereflag=false;UpdateData(false);}void CMyDlg::OnR2(){// TODO: Add your control notification handler code here flag=true;UpdateData(false);}CString CMyDlg::Topc(){return c_stack[c_top];}CString CMyDlg::Tops(){return S[s_top];}void CMyDlg::pushc(CString in){ c_top++;c_stack[c_top]=in;}void CMyDlg::pushs(CString in){ s_top++;S[s_top]=in;}void CMyDlg::popc(){c_top--;}void CMyDlg::pops(){s_top--;}void CMyDlg::OnL()//输入左括号{if(flag==true)//为扩展的计算器时方为有效{m_String+="(";pushc("(");cur1="";}UpdateData(false);// TODO: Add your control notification handler code here }void CMyDlg::OnR(){if(flag==true){m_String+=")";pushs(cur1);int count=0;for(int i=0;i<c_top;i++){if(c_stack[i]=="(")break;}if(i==c_top)//没有找到左括号{m_result="输入错误!!!";UpdateData(false);return;}else{while(Topc()!="("){pushs(Topc());popc();}popc();//弹出左括号cur1="";}}UpdateData(false);// TODO: Add your control notification handler code here }。
基于MFC的科学计算器编程
三,特殊功能介绍
(1)屏蔽键盘信息,代码如下: CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDT_OUTPUT); pEdit->SetReadOnly(true); //将编辑框设置为只读模式(屏蔽键盘消息) 之后添加消息处理函数 BOOL CCalculator::PreTranslateMessage(MSG* pMsg)实现捕捉键盘信 息的功能(仅限于数字)。 (2)动态改变光标位置,将编辑框上显示的字符串定义为 m_string,以当前光标所在位置
}
}
else if(m_stringcal.GetAt(n)=='.')
{
rate=0.1f;
}
else
{
break;
}
}
float intempcal = sqrtf(itemp);
CString strtempr =
m_stringcal.Right(m_stringcal.GetLength()-n);
m = m + 1;
Cha[m] = '+';
m = m + 1;
rate = 10.0f;
mark = 0;
}
else
{
Cha[m] = '+'; m = m + 1; } } else if(m_stringcal.GetAt(i)=='-') { if(mark == 1) { Num[m] = itemp; itemp = 0; m = m + 1; Cha[m] = '-'; m = m + 1; rate = 10.0f; mark = 0; } else { Cha[m] = '-'; m = m + 1; } } else if(m_stringcal.GetAt(i)=='x') { if(mark == 1) { Num[m] = itemp; itemp = 0; m = m + 1; Cha[m] = 'x'; m = m + 1; rate = 10.0f; mark = 0; } else { Cha[m] = 'x'; m = m + 1; } } else if(m_stringcal.GetAt(i)=='/') { if(mark == 1) {
简单计算器可视化程序编程
doublex2,y,x1=StoN(strExp);
strExp=m_strTmp;
charop=strExp.GetAt(0);
strExp.Delete(0);
x2=StoN(strExp);
if(m_strTmp!="")return"ERROR_"+m_strTmp+"未知符号_";
if(op=='+'){y=x1+x2;}
IDC_BUTTON38
sqrt
按钮
IDC_BUTTON30
%
按钮
IDC_BUTTON25
^
按钮
IDC_BUTTON31
sin
按钮
IDC_BUTTON32
cos
按钮
IDC_BUTTON33
tan
按钮
IDC_BUTTON34
cot
按钮
IDC_BUTTON40
sin~1
按钮
IDC_BUTTON41
cos~1
{
intlen=strExp.GetLength();
intpos=-1;
for(inti=0;i<len;i++)
{
if(pos>=0&&strExp.GetAt(i)==')')break;
if(strExp.GetAt(i)=='(')
{
pos=i;
}
}
returnpos;
}
voidCCalculation::DelBracket(CString*strExp)
MFC计算器编程设计报告
MFC计算器编程设计报告地信091指导老师:2010.11.15一(题目:利用MFC框架编写简易计算器要求使用MFC框架在Visual Studio 6.0环境下编写一个简易的计算器,支持任意位数的加减乘数,正负转换,并且实现BackSpace CE C功能。
二(设计过程1. Windows消息处理机制的理解首先编写程序需要对Windows程序的消息处理机制(Message Handle)有个比较清晰的了解。
Windows的程序都是通过消息来传送数据,有不需要用户参与的系统消息,比如异常处理等。
还有用户消息,比如鼠标的单击,双击,键盘的键入等。
2. 界面的设计仿照Windows附件里面的计算器,在资源视图中画好界面,如图:主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。
拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。
3. 建立的变量,控件的命名,对应的消息处理函数对应表ID CAPTION Message Handler简易计算器 1.0 Beta1版 IDD_CALC_DIALOG N/A IDC_NUM0 0 OnNum0IDC_NUM1 1 OnNum1IDC_NUM2 2 OnNum2IDC_NUM3 3 OnNum3IDC_NUM4 4 OnNum4IDC_NUM5 5 OnNum5IDC_NUM6 6 OnNum6IDC_NUM7 7 OnNum7IDC_NUM8 8 OnNum8IDC_NUM9 9 OnNum9IDC_NEG +/- OnNegIDC_PT . OnPtIDC_DIV / OnDivIDC_MUL * OnMulIDC_MIN - OnMinIDC_ADD + OnAddIDC_BACKSPACE BACK OnBackspaceIDC_CE CE OnCeIDC_CLEAR C OnClearIDC_EQU = OnEquIDC_DIS N/A N/AOnCal(double num) 变量定义:double poz; //保存小数点的位置,初始化为1,表示poz-1个小数点。
MFC计算器的实现
MFC计算器的实现MFC是Microsoft Foundation Classes的缩写,是一个框架,用于开发Windows平台上的应用程序。
在MFC框架下,我们可以很方便地实现计算器应用程序。
以下是一个基于MFC框架的简单计算器应用程序的实现。
1.首先,创建一个新的MFC应用程序项目,并选择创建一个对话框为基础的应用程序。
4. 创建一个新的类(例如名为CalculatorDlg)作为对话框的类派生自CDialog。
在类头文件中声明需要的成员变量和函数。
```cppclass CalculatorDlg : public CDialogpublic:CalculatorDlg(CWnd* pParent = nullptr);enum { IDD = IDD_DLG_CALC };protected:virtual void DoDataExchange(CDataExchange* pDX);protected:afx_msg void OnBnClickedButtonNumber(UINT nID); // 数字按钮点击事件处理函数afx_msg void OnBnClickedButtonOperator(UINT nID); // 运算符按钮点击事件处理函数afx_msg void OnBnClickedButtonClear(; // 清零按钮点击事件处理函数afx_msg void OnBnClickedButtonEqual(; //等于按钮点击事件处理函数DECLARE_MESSAGE_MAP};```5. 在类的.cpp文件中实现需要的成员函数和消息映射。
```cppIMPLEMENT_DYNAMIC(CalculatorDlg, CDialog)CalculatorDlg::CalculatorDlg(CWnd* pParent) :CDialog(IDD_DLG_CALC, pParent)//初始化成员变量m_hResultEdit = nullptr;void CalculatorDlg::DoDataExchange(CDataExchange* pDX)CDialog::DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CalculatorDlg, CDialog)ON_BN_CLICKED(IDC_BUTTON_0,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_1,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_2,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_3,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_4,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_5,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_6,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_7,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_8,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_9,&CalculatorDlg::OnBnClickedButtonNumber) ON_BN_CLICKED(IDC_BUTTON_ADD,&CalculatorDlg::OnBnClickedButtonOperator)ON_BN_CLICKED(IDC_BUTTON_SUBTRACT,&CalculatorDlg::OnBnClickedButtonOperator)ON_BN_CLICKED(IDC_BUTTON_MULTIPLY,&CalculatorDlg::OnBnClickedButtonOperator)ON_BN_CLICKED(IDC_BUTTON_DIVIDE,&CalculatorDlg::OnBnClickedButtonOperator)ON_BN_CLICKED(IDC_BUTTON_CLEAR,&CalculatorDlg::OnBnClickedButtonClear)ON_BN_CLICKED(IDC_BUTTON_EQUAL,&CalculatorDlg::OnBnClickedButtonEqual)END_MESSAGE_MAP``````cppvoid CalculatorDlg::OnBnClickedButtonNumber(UINT nID)//获取按钮上的数字CString strNumber;strNumber.Format(_T("%d"), nID - IDC_BUTTON_0);::SetWindowText(m_hResultEdit, strNumber);void CalculatorDlg::OnBnClickedButtonOperator(UINT nID) //获取按钮上的运算符TCHAR chOperator = '+';switch (nID)case IDC_BUTTON_ADD:chOperator = '+';break;case IDC_BUTTON_SUBTRACT:chOperator = '-';break;case IDC_BUTTON_MULTIPLY:chOperator = '*';break;case IDC_BUTTON_DIVIDE:chOperator = '/';break;}CString strOperator;strOperator.Format(_T("%c"), chOperator); ::SetWindowText(m_hResultEdit, strOperator); void CalculatorDlg::OnBnClickedButtonClear::SetWindowText(m_hResultEdit, _T(""));void CalculatorDlg::OnBnClickedButtonEqual//执行运算CString strExpression;::GetWindowText(m_hResultEdit, strExpression);//2.使用字符串解析和计算函数,计算结果//...//3.显示结果CString strResult;strResult.Format(_T("%f"), 123.456); // 替换为实际的计算结果::SetWindowText(m_hResultEdit, strResult);```请注意,在实际的计算过程中,您需要实现字符串解析和数学计算部分的代码。
MFC计算器
基于VC的MFC计算器案例步骤及源代码基于VC的MFC计算器案例详细步骤有图有代码,图中右边的各个函数也都能实现:清除,加,减,乘,除,倒数,e的x次方,以e为底x的对数,10的x次方,以10为底x的对数,余弦,反余弦,双曲余弦值,正弦,反正弦,双曲正弦值,正切,反正切,双曲正切值,x的y次方,2的x次方,n(n为整数)的阶乘。
如图:步骤:1.创建一个基于对话框的应用程序(这一步应该都会吧!),命名为dckCalculator;2.打开资源视图->点击“dckCalculator”左边的“+”->点击“dckCalculator.rc”左边的“+”->点击“Dialog”左边的“+”->双击“IDD_DCKCALCULATOR_DIALOG”->去除“确定”“取消”“TODO:在此放置对话框控件。
”几个组件(全选。
然后右击选择“删除”即可):3.按照我们想要的效果给对话框添加组件->编辑各个组件的显示名字->改变其ID属性4.将编辑框的属性中的Align Text设置为right,如图:5.设置相关属性(每次改变ID都要保存一下):6.将编辑框中属性的“read only”设置为ture!7.在类视图中给CdckCalculatorDlg类添加成员变量:int m_duType;初始值为0,用来作为判定弧度还是角度的变准;double m_first;//存储一次运算的第一个操作数及一次运算的结果double m_second;//存储一次运算的第二个操作数CString m_operator;//存储运算符double m_coff;//存储小数点的系数权值8.给编辑框添加关联变量:(右击编辑框->添加变量)CString m_display;//编辑框IDC_DISPLAY的关联变量,显示计算结果(注意最右边选择“value”)9.双击“弧度”给其添加事件响应(等价于右击然后添加事件处理器);同理双击“角度”添加代码://弧度处理函数void CdckCalculatorDlg::OnBnClickedHudu(){m_duType=0;//系统默认m_duType为,这里为刚好可以为计算器默认为弧度计算}//角度处理函数void CdckCalculatorDlg::OnBnClickedJiaodu(){m_duType=1;//当选择角度处理函数的时候,m_duType为;这哥主要是作为以后函数算法的判断标准}10.在对话框类的构造函数中,初始化成员变量:// CdckCalculatorDlg 对话框的构造函数CdckCalculatorDlg::CdckCalculatorDlg(CWnd* pParent /*=NULL*/): CDialog(CdckCalculatorDlg::IDD, pParent), m_duType(0), m_first(0.0), m_second(0.0), m_operator(_T("+")), m_coff(0), m_display(_T("0.0"))······11.类视图里手动为对话框添加2个函数:void UpdateDisplay(double dck)——用于编辑框显示数据Void Calculate(void)——用于计算结果代码如下(由于在代码中要用到fabs,要在CdckCalculatorDlg.cpp 里添加一个库:#include"math.h")://在编辑框中显示数据void CdckCalculatorDlg::UpdateDisplay(double dck){m_display.Format(_T("%f"),dck);int i=m_display.GetLength();while(m_display.GetAt(i-1)=='0') //格式化输出,将输出结果后的零截去{ m_display.Delete(i-1,1); i--; }UpdateData(false);//更新编辑框变量m_display}//计算结果void CdckCalculatorDlg::Calculate(void){//将前一次数据与当前数据进行运算,作为下次的第一操作数,并在编辑框显示。
MFC简单计算器设计正文
MFC简单计算器设计正文实用计算器程序1.基本功能描述计算器是人们日常生活中非常实用的计算工具。
预期设计目标与实际计算器为标准,Windows 10系统提供的计算器为范例进行设计。
实用计算器要实现单目运算和双目运算。
单目运算主要包括阶乘、正弦、余弦;双目运算主要包括加、减、乘、除、乘幂等。
计算器要能够对输入的各种数据进行处理,包括小数、整数、负数等数据进行操作。
实际过程中要能够对不同的数据灵活判断执行。
同时要能够对不满足运算符的操作数,提示出错信息以方便用户进行处理。
用户的修改包括清屏和退格。
程序设计的重点和难点在于:第一,能够对于不同的操作数和操作符进行连续运算,运算过程中要有优先级的判断,根据优先级执行不同的运算顺序;第二,能够用一个编辑框实现运算表达式的显示和结果的输出。
编程环境采用Visual Studio 2017提供的MFC建立对话框应用程序,设计界面要简单大方,并提供程序所有功能的接口。
2.设计思路表1 操作符优先级设计优先级操作符1 阶乘、正弦、余弦2 乘幂3 乘、除4 加、减对对话框编辑框关联一个变量从中读取数据,按下数字键时对数据数组num[]进行更新,其中num[0]表示的是当前已经存储变量的个数。
由于算法设计为四层优先级,且单目运算的优先级最高。
当按下相应单目运算符,首先将当前数据数组的最后一个存储(防止按下Backspace退格发生错误),并将此位数据执行运算后重新赋值。
但按下双目运算符相应按键后,将计数num[0]++,同时将运算符的类型和位置记录。
当按下等于之前,这样就将一个单目双目混合的运算表达式转化为双目运算。
如果没有按下等号键,则继续执行循环。
在按下等号按钮之后,按照先乘幂、再乘除、后加减的运算顺序执行运算,将最后结果保存并显示。
(在实际的计算器中,执行完运算之后,按下运算符的操作键,最终结果将按照左操作数的形式出现,故需要保存变量。
)如果用户没有结束程序,在运行初始化程序,进行下一次运算,否则直接退出。
MFC实现简易计算器
MFC实现简易计算器©Free Copy操作简便,还有帮助提示,支持double类型的数据进行运算,显示清除无效0. By: 杜运福计算器类结构如下:class CCalculatorDlg : public CDialog{// Constructionpublic:CCalculatorDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DA TA(CCalculatorDlg)enum { IDD = IDD_CALCULA TOR_DIALOG };double m_Num;//}}AFX_DA TAdouble num1,num2; //第一、二操作数char cal; //运算符号BYTE dotflag; //小数点标志BYTE numflag; //键入数字标志long quan2; //小数部分权值// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CCalculatorDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CCalculatorDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnNum0();afx_msg void OnNum1();afx_msg void OnNum2();afx_msg void OnNum3();afx_msg void OnNum4();afx_msg void OnNum5();afx_msg void OnNum6();afx_msg void OnNum7();afx_msg void OnNum8();afx_msg void OnNum9();afx_msg void OnAdd();afx_msg void OnSub();afx_msg void OnMul();afx_msg void OnDiv();afx_msg void OnEqual();afx_msg void OnSign();afx_msg void OnInv();afx_msg void OnMod();afx_msg void OnSqrt();afx_msg void OnDot();afx_msg void OnClear();afx_msg void OnBackspace();afx_msg void OnHelp();//}}AFX_MSGDECLARE_MESSAGE_MAP()};完整实现代码如下:// CalculatorDlg.cpp : implementation file///****************************************************************************** *********** 简易计算器***** by 追梦2011-4-18******************************************************************************* *****/#include "stdafx.h"#include "Calculator.h"#include "CalculatorDlg.h"#include "math.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DA TA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DA TA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DA TA_INIT(CAboutDlg)//}}AFX_DA TA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CAboutDlg)//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCalculatorDlg dialogCCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/): CDialog(CCalculatorDlg::IDD, pParent){//{{AFX_DA TA_INIT(CCalculatorDlg)m_Num = 0.0;//}}AFX_DA TA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CCalculatorDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CCalculatorDlg)DDX_Text(pDX, IDC_Num, m_Num);//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialog) //{{AFX_MSG_MAP(CCalculatorDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_Num0, OnNum0)ON_BN_CLICKED(IDC_Num1, OnNum1)ON_BN_CLICKED(IDC_Num2, OnNum2)ON_BN_CLICKED(IDC_Num3, OnNum3)ON_BN_CLICKED(IDC_Num4, OnNum4)ON_BN_CLICKED(IDC_Num5, OnNum5)ON_BN_CLICKED(IDC_Num6, OnNum6)ON_BN_CLICKED(IDC_Num7, OnNum7)ON_BN_CLICKED(IDC_Num8, OnNum8)ON_BN_CLICKED(IDC_Num9, OnNum9)ON_BN_CLICKED(IDC_Add, OnAdd)ON_BN_CLICKED(IDC_Sub, OnSub)ON_BN_CLICKED(IDC_Mul, OnMul)ON_BN_CLICKED(IDC_Div, OnDiv)ON_BN_CLICKED(IDC_Equal, OnEqual)ON_BN_CLICKED(IDC_Sign, OnSign)ON_BN_CLICKED(IDC_Inv, OnInv)ON_BN_CLICKED(IDC_Mod, OnMod)ON_BN_CLICKED(IDC_Sqrt, OnSqrt)ON_BN_CLICKED(IDC_Dot, OnDot)ON_BN_CLICKED(IDC_Clear, OnClear)ON_BN_CLICKED(IDC_Backspace, OnBackspace) ON_BN_CLICKED(IDC_Help, OnHelp)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCalculatorDlg message handlers//////////////////////////////////////////////////////////////////////////// BOOL CCalculatorDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARA TOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herequan2 = 1;dotflag = 0;numflag = 0;return TRUE; // return TRUE unless you set the focus to a control}void CCalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CCalculatorDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CCalculatorDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}//键入0void CCalculatorDlg::OnNum0(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 0 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 0;}else m_Num = 0;}numflag = 1;UpdateData(FALSE);}//键入 1void CCalculatorDlg::OnNum1(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 1 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 1;}else m_Num = 1;}numflag = 1;UpdateData(FALSE);}//键入 2void CCalculatorDlg::OnNum2(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 2 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 2;}else m_Num = 2;}numflag = 1;UpdateData(FALSE);}//键入 3void CCalculatorDlg::OnNum3(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 3 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 3;}else m_Num = 3;}numflag = 1;UpdateData(FALSE);}//键入 4void CCalculatorDlg::OnNum4(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 4 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 4;}else m_Num = 4;}numflag = 1;UpdateData(FALSE);}//键入 5void CCalculatorDlg::OnNum5(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 5 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 5;}else m_Num = 5;}numflag = 1;UpdateData(FALSE);}//键入 6void CCalculatorDlg::OnNum6(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 6 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 6;}else m_Num = 6;}numflag = 1;UpdateData(FALSE);}//键入7void CCalculatorDlg::OnNum7(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 7 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 7;}else m_Num = 7;}numflag = 1;UpdateData(FALSE);}//键入8void CCalculatorDlg::OnNum8(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 8 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 8;}else m_Num = 8;}numflag = 1;UpdateData(FALSE);}//键入9void CCalculatorDlg::OnNum9(){UpdateData();if(dotflag){quan2 *= 10;m_Num += 9 / (double)quan2;}else{if(numflag){m_Num = m_Num * 10 + 9;}else m_Num = 9;}numflag = 1;UpdateData(FALSE);}//键入+void CCalculatorDlg::OnAdd(){UpdateData();num1 = m_Num;cal = '+';numflag = 0;dotflag = 0;quan2 = 1;}//键入-void CCalculatorDlg::OnSub(){UpdateData();num1 = m_Num;cal = '-';numflag = 0;dotflag = 0;quan2 = 1;}//键入*void CCalculatorDlg::OnMul(){UpdateData();num1 = m_Num;cal = '*';numflag = 0;dotflag = 0;quan2 = 1;}//键入/void CCalculatorDlg::OnDiv(){UpdateData();num1 = m_Num;cal = '/';numflag = 0;dotflag = 0;quan2 = 1;}//键入%void CCalculatorDlg::OnMod(){UpdateData();num1 = m_Num;cal = '%';numflag = 0;dotflag = 0;quan2 = 1;}//键入=void CCalculatorDlg::OnEqual(){UpdateData();num2 = m_Num;switch(cal){case '+': m_Num = num1 + num2; break;case '-': m_Num = num1 - num2; break;case '*': m_Num = num1 * num2; break;case '/': m_Num = num1 / num2; break;case '%': m_Num = (int)num1 % (int)num2; break;}numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//键入+/-void CCalculatorDlg::OnSign(){UpdateData();m_Num = 0 - m_Num;UpdateData(FALSE);}//键入1/xvoid CCalculatorDlg::OnInv(){UpdateData();m_Num = 1 / m_Num;numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//键入sqrtvoid CCalculatorDlg::OnSqrt(){UpdateData();m_Num = sqrt(m_Num);numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//键入'.' 小数点void CCalculatorDlg::OnDot(){UpdateData();dotflag = 1;m_Num += 0.0;UpdateData(FALSE);}void CCalculatorDlg::OnClear(){UpdateData();m_Num = 0;num1 = 0;num2 = 0;numflag = 0;dotflag = 0;quan2 = 1;UpdateData(FALSE);}//撤销之前键入的数,可以依次撤销所有整数位或小数位void CCalculatorDlg::OnBackspace(){UpdateData();static int dotquan = quan2; //一次初始化long temp;if(dotflag && numflag) //撤销小数部分{if(dotquan >= 10){temp = (long)(m_Num * dotquan);m_Num= (double)(temp/10);dotquan /= 10;m_Num= m_Num / dotquan;}}else //撤销整数部分{if(numflag && m_Num){ m_Num = (long)m_Num /10;}}UpdateData(FALSE);}//帮助提示void CCalculatorDlg::OnHelp(){const char tipname[]="简易计算器帮助by 追梦";MessageBox("\t简易计算器\tby追梦\n\n 只用一个文本编辑框,用于输入和输出,接受粘贴或键盘输入。
基于MFC的一个简单计算器
基于MFC的⼀个简单计算器写⼀个简单的计算器并不是什么很难的事,主要⽬的是要通过这个程序来学习和分析其中的核⼼算法。
这个简易计算器的核⼼部分就是对输⼊的表达式的正确性判断与求值,其中包括对表达式的解析、中缀表达式转后缀表达式、后缀表达式求值等等⼏个⽅⾯。
⼀、封装核⼼代码《》和《》这两篇⽂章已经对核⼼算法部分进⾏了讲解,并附有源码。
在此基础上制作⼀个简单计算器,我们要做的仅仅是封装核⼼代码并加⼊MFC⼯程中。
下⾯是我封装的⼀个 Expression 类:Expression.h#pragma once#include <iostream>#include <sstream>#include <string>#include <vector>#include <stack>#include <utility>using namespace std;class Expression{public:Expression(string str);bool test(); // 外部接⼝,判断表达式是否合法double calculate(); // 外部接⼝,计算表达式的值private:vector<pair<string, int>> word;string expr; // 算术表达式int idx; // word下标int sym; // 单词种别编码int err; // 错误int word_analysis(vector<pair<string, int>>& , const string);void Next();void E();void T();void F();bool Right; // 保存表达式test结果private:int prior(int); // 获取运算符的优先级bool isOperator(int); // 通过种别编码判定是否是运算符vector<pair<string,int>> getPostfix(const vector<pair<string,int>>&); // 中缀转后缀void popTwoNumbers(stack<double>&, double&, double&); // 从栈中连续弹出两个操作数double stringToDouble(const string&); // 把string转换为doubledouble expCalculate(const vector<pair<string, int>>&); // 计算后缀表达式的值};Expression.cpp#include "Expression.h"// 构造函数Expression::Expression( string str ):expr(str),idx(0),err(0),Right(true){}// 外部接⼝bool Expression::test(){return Right;}int err_num = word_analysis(word, expr);if (-1 == err_num){Right = false;}else{// 词法正确,进⾏语法分析Next();E();if (sym == 0 && err == 0) // 注意要判断两个条件Right = true;elseRight = false;}return Right;}// 外部接⼝double Expression::calculate(){if (test()){return expCalculate(getPostfix(word));}else{exit(0);}}/*--------------------------------词法分析----------------------------*/int Expression::word_analysis(vector<pair<string, int>>& word, const string expr) {for(int i=0; i<expr.length(); ++i){// 如果是 + - x ÷ ( )if(expr[i] == '(' || expr[i] == ')' || expr[i] == '+'|| expr[i] == '-' || expr[i] == '*' || expr[i] == '/'){string tmp;tmp.push_back(expr[i]);switch (expr[i]){case '+':word.push_back(make_pair(tmp, 1));break;case '-':word.push_back(make_pair(tmp, 2));break;case '*':word.push_back(make_pair(tmp, 3));break;case '/':word.push_back(make_pair(tmp, 4));break;case '(':word.push_back(make_pair(tmp, 6));break;case ')':word.push_back(make_pair(tmp, 7));break;}}// 如果是数字开头else if(expr[i]>='0' && expr[i]<='9'){string tmp;while(expr[i]>='0' && expr[i]<='9'){tmp.push_back(expr[i]);++i;}if(expr[i] == '.'){++i;if(expr[i]>='0' && expr[i]<='9'){tmp.push_back('.');tmp.push_back(expr[i]);++i;}}else{return -1; // .后⾯不是数字,词法错误}}word.push_back(make_pair(tmp, 5));--i;}// 如果以.开头else{return -1; // 以.开头,词法错误}}return 0;}/*--------------------------------语法分析----------------------------*/ // 读下⼀单词的种别编码void Expression::Next(){if(idx < word.size())sym = word[idx++].second;elsesym = 0;}// E → T { +T | -T }void Expression::E(){T();while(sym == 1 || sym == 2){Next();T();}}// T → F { *F | /F }void Expression::T(){F();while(sym == 3 || sym == 4){Next();F();}}// F → (E) | dvoid Expression::F(){if (sym == 5){Next();}else if(sym == 6){Next();E();if (sym == 7){Next();}else{err = -1;}}else{err = -1;}}/*--------------------------------求值部分----------------------------*/ int Expression::prior(int sym){case 1:case 2:return 1;case 3:case 4:return 2;default:return 0;}}bool Expression::isOperator(int sym){switch (sym){case 1:case 2:case 3:case 4:return true;default:return false;}}vector<pair<string,int>> Expression::getPostfix( const vector<pair<string,int>>& expr){vector<pair<string, int>> output; // 输出stack<pair<string, int>> s; // 操作符栈for(int i=0; i<expr.size(); ++i){pair<string, int> p = expr[i];if(isOperator(p.second)){while(!s.empty() && isOperator(s.top().second) && prior(s.top().second)>=prior(p.second)) {output.push_back(s.top());s.pop();}s.push(p);}else if(p.second == 6){s.push(p);}else if(p.second == 7){while(s.top().second != 6){output.push_back(s.top());s.pop();}s.pop();}else{output.push_back(p);}}while (!s.empty()){output.push_back(s.top());s.pop();}return output;}void Expression::popTwoNumbers( stack<double>& s, double& first, double& second ){first = s.top();s.pop();second = s.top();s.pop();}double Expression::stringToDouble( const string& str ){double d;stringstream ss;ss << str;ss >> d;return d;double Expression::expCalculate( const vector<pair<string,int>>& postfix ){double first,second;stack<double> s;for(int i=0; i<postfix.size(); ++i){pair<string,int> p = postfix[i];switch (p.second){case 1:popTwoNumbers(s, first, second);s.push(second+first);break;case 2:popTwoNumbers(s, first, second);s.push(second-first);break;case 3:popTwoNumbers(s, first, second);s.push(second*first);break;case 4:popTwoNumbers(s, first, second);s.push(second/first);break;default:s.push(stringToDouble(p.first));break;}}double result = s.top();s.pop();return result;}使⽤⽅法(测试):int main(){Expression e("(1.5+2.5)*2+0.53");if(e.test()) // 判断表达式是否合法cout << e.calculate() << endl;return 0;}⼆、加⼊MFC⼯程OK,核⼼代码(表达式的合法性判断与求值)已经封装到 Expression 类中,下⾯要做的就是新建⼀个 MFC ⼯程,并把 Expression 类加⼊⼯程⾥,并实现按钮的功能就⾏了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// cacuDlg.cpp : implementation file//#include "stdafx.h"#include "cacu.h"#include "cacuDlg.h"#include "math.h"#include "cstring"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCacuDlg dialogCCacuDlg::CCacuDlg(CWnd* pParent /*=NULL*/): CDialog(CCacuDlg::IDD, pParent){//{{AFX_DATA_INIT(CCacuDlg)m_s = _T("");m_M = _T("");p=0,q=0,w=1,c='r';Ispoint=false;//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CCacuDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CCacuDlg)DDX_Text(pDX, IDC_EDIT1, m_s);DDX_Text(pDX, IDC_EDIT2, m_M);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CCacuDlg, CDialog)//{{AFX_MSG_MAP(CCacuDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)ON_BN_CLICKED(IDC_BackSpace, OnBackSpace) ON_BN_CLICKED(IDC_Clear2, OnClear)ON_BN_CLICKED(IDC_1, On1)ON_BN_CLICKED(IDC_2, On2)ON_BN_CLICKED(IDC_3, On3)ON_BN_CLICKED(IDC_4, On4)ON_BN_CLICKED(IDC_5, On5)ON_BN_CLICKED(IDC_6, On6)ON_BN_CLICKED(IDC_7, On7)ON_BN_CLICKED(IDC_8, On8)ON_BN_CLICKED(IDC_9, On9)ON_BN_CLICKED(IDC_add, Onadd)ON_BN_CLICKED(IDC_Sub, OnSub)ON_BN_CLICKED(IDC_Mul, OnMul)ON_BN_CLICKED(IDC_div, Ondiv)ON_BN_CLICKED(IDC_Sqrt, OnSqrt)ON_BN_CLICKED(IDC_point, Onpoint)ON_BN_CLICKED(IDC_0, On0)ON_BN_CLICKED(IDC_Sin, OnSin)ON_BN_CLICKED(IDC_Cos, OnCos)ON_BN_CLICKED(IDC_power_2, Onpower2)ON_BN_CLICKED(IDC_power_3, Onpower3)ON_BN_CLICKED(IDC_Equar, OnEquar)ON_BN_CLICKED(IDC_1_x, On1x)ON_BN_CLICKED(IDC_1_100, On1100)ON_BN_CLICKED(IDC_MS, OnMs)ON_BN_CLICKED(IDC_MC, OnMc)ON_BN_CLICKED(IDC_MR, OnMr)ON_BN_CLICKED(IDC_Madd, OnMadd)ON_BN_CLICKED(IDC_Msub, OnMsub)ON_EN_CHANGE(IDC_EDIT2, OnM)ON_BN_CLICKED(IDC_sub_add, Onsubadd)ON_BN_CLICKED(IDC_CE, OnCe)ON_BN_CLICKED(IDC_PI, OnPi)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCacuDlg message handlersBOOL CCacuDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herem_s="0.";UpdateData(false);m_s="";CFont *m_Font;m_Font = new CFont;m_Font->CreateFont(50,20,0,0,100,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,"Arial");CEdit *m_Edit1=(CEdit *)GetDlgItem(IDC_EDIT1);m_Edit1->SetFont(m_Font,FALSE);GetDlgItem(IDC_EDIT1)->SetFont(m_Font);return TRUE; // return TRUE unless you set the focus to a control}void CCacuDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CCacuDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CCacuDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CCacuDlg::OnChangeEdit1(){// TODO: If this is a RICHEDIT control, the control will not// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask()// with the ENM_CHANGE flag ORed into the mask.// TODO: Add your control notification handler code here}void CCacuDlg::OnBackSpace(){// TODO: Add your control notification handler code hereint uu=0;m_s.Delete(m_s.GetLength()-1,1);if(w==1)temp1=atof(m_s);elsetemp2=atof(m_s);if(m_s.Find('.')<0)Ispoint=false;elseIspoint=true;if(m_s.GetLength()==0){m_s="0.";uu=1;c='r';}if(!uu&&!Ispoint)m_s+=".";UpdateData(false);if(!uu&&!Ispoint)m_s.Delete(m_s.GetLength()-1,1);if(uu==1)m_s="";}void CCacuDlg::OnClear(){// TODO: Add your control notification handler code here UpdateData(true);m_s="0.";temp2=temp1=0;w=1;c='r';UpdateData(false);m_s="";}void CCacuDlg::On1(){// TODO: Add your control notification handler code here if(p==1){m_s="";UpdateData(false);p=0;}m_s=m_s+"1";if(!Ispoint)m_s+=".";UpdateData(false);if(!Ispoint)m_s.Delete(m_s.GetLength()-1,1);if(w==1)temp1=atof(m_s),temp2=0;else if(w==2)temp2=atof(m_s);//c='1';}void CCacuDlg::On2(){// TODO: Add your control notification handler code here if(p==1){m_s="";UpdateData(false);p=0;}//UpdateData(true);m_s=m_s+"2";if(!Ispoint)UpdateData(false);//c='1';if(!Ispoint)m_s.Delete(m_s.GetLength()-1,1);if(w==1)temp1=atof(m_s),temp2=0;else if(w==2)temp2=atof(m_s);}void CCacuDlg::On3(){// TODO: Add your control notification handler code here if(p==1){m_s="";UpdateData(false);p=0;}//UpdateData(true);m_s=m_s+"3";if(!Ispoint)m_s+=".";UpdateData(false);if(!Ispoint)m_s.Delete(m_s.GetLength()-1,1);if(w==1)temp1=atof(m_s),temp2=0;else if(w==2)temp2=atof(m_s);//c='1';}void CCacuDlg::On4(){// TODO: Add your control notification handler code here if(p==1){m_s="";UpdateData(false);p=0;}//UpdateData(true);if(!Ispoint)m_s+=".";UpdateData(false);if(!Ispoint)m_s.Delete(m_s.GetLength()-1,1);//c='1';if(w==1)temp1=atof(m_s),temp2=0;else if(w==2)temp2=atof(m_s);}void CCacuDlg::On5(){// TODO: Add your control notification handler code here if(p==1){m_s="";UpdateData(false);p=0;}//UpdateData(true);m_s=m_s+"5";if(!Ispoint)m_s+=".";UpdateData(false);if(!Ispoint)m_s.Delete(m_s.GetLength()-1,1);//c='1';if(w==1)temp1=atof(m_s);else if(w==2)temp2=atof(m_s);}void CCacuDlg::On6(){// TODO: Add your control notification handler code here if(p==1){m_s="";UpdateData(false);p=0;}//UpdateData(true);m_s=m_s+"6";if(!Ispoint)m_s+=".";UpdateData(false);if(!Ispoint)m_s.Delete(m_s.GetLength()-1,1);//c='1';if(w==1)temp1=atof(m_s),temp2=0;else if(w==2)temp2=atof(m_s);}void CCacuDlg::On7(){// TODO: Add your control notification handler code here if(p==1){m_s="";UpdateData(false);p=0;}m_s=m_s+"7";if(!Ispoint)m_s+=".";UpdateData(false);if(!Ispoint)m_s.Delete(m_s.GetLength()-1,1);//c='1';if(w==1)temp1=atof(m_s),temp2=0;else if(w==2)temp2=atof(m_s);}void CCacuDlg::On8(){// TODO: Add your control notification handler code here if(p==1){m_s="";UpdateData(false);}//UpdateData(true);m_s=m_s+"8";if(!Ispoint)m_s+=".";UpdateData(false);if(!Ispoint)m_s.Delete(m_s.GetLength()-1,1);//c='1';if(w==1)temp1=atof(m_s),temp2=0;else if(w==2)temp2=atof(m_s);}void CCacuDlg::On9(){// TODO: Add your control notification handler code here if(p==1){m_s="";UpdateData(false);p=0;}m_s=m_s+"9";if(!Ispoint)m_s+=".";UpdateData(false);if(!Ispoint)m_s.Delete(m_s.GetLength()-1,1);if(w==1)temp1=atof(m_s),temp2=0;else if(w==2)temp2=atof(m_s);}void CCacuDlg::On0(){// TODO: Add your control notification handler code here if(p==1){m_s="";UpdateData(false);}//UpdateData(true);m_s=m_s+"0";if(!Ispoint)m_s+=".";UpdateData(false);if(!Ispoint)m_s.Delete(m_s.GetLength()-1,1);//c='1';if(w==1)temp1=atof(m_s),temp2=0;else if(w==2)temp2=atof(m_s);}void CCacuDlg::Onadd(){// TODO: Add your control notification handler code here UpdateData(true);Ispoint=false;p=1;if(w==2){if(c=='+')temp1=temp2+temp1;else if(c=='-')temp1=temp1-temp2;else if(c=='*')temp1*=temp2;else if(c=='/')temp1/=temp2;else if(c=='s')temp1=sin(atof(m_s));else if(c=='c')temp1=cos(atof(m_s));m_s.Format("%.10lf",temp1);//m_s+=".";int n;n=m_s.Find('.');if (n>=0){m_s.TrimRight('0');if (m_s.GetLength()==n+1){m_s=m_s.Left(n+1);if (m_s.IsEmpty())m_s='0';}}UpdateData(false);}w=2;c='+';//Ispoint=false;//UpdateData(false);}void CCacuDlg::OnSub(){// TODO: Add your control notification handler code here UpdateData(true);Ispoint=false;p=1;if(w==2){if(c=='+')temp1=temp2+temp1;else if(c=='-')temp1=temp1-temp2;else if(c=='*')temp1*=temp2;else if(c=='/')temp1/=temp2;else if(c=='s')temp1=sin(atof(m_s));else if(c=='c')temp1=cos(atof(m_s));m_s.Format("%.10lf",temp1);int n;n=m_s.Find('.');if (n>=0){m_s.TrimRight('0');if (m_s.GetLength()==n+1){m_s=m_s.Left(n+1);if (m_s.IsEmpty())m_s='0';}}UpdateData(false);}w=2;c='-';//Ispoint=false;//UpdateData(false);}void CCacuDlg::OnMul(){// TODO: Add your control notification handler code here UpdateData(true);Ispoint=false;p=1;if(w==1)temp2=1;else{if(c=='+')temp1=temp2+temp1;else if(c=='-')temp1=temp1-temp2;else if(c=='*')temp1*=temp2;else if(c=='/')temp1/=temp2;else if(c=='s')temp1=sin(atof(m_s));else if(c=='c')temp1=cos(atof(m_s));m_s.Format("%.10lf",temp1);int n;n=m_s.Find('.');if (n>=0){m_s.TrimRight('0');if (m_s.GetLength()==n+1){m_s=m_s.Left(n+1);if (m_s.IsEmpty())m_s='0';}}UpdateData(false);}c='*';w=2;//Ispoint=false;}void CCacuDlg::Ondiv(){// TODO: Add your control notification handler code here UpdateData(true);Ispoint=false;p=1;if(w==1)temp2=1.0;else{if(c=='+')temp1=temp2+temp1;else if(c=='-')temp1=temp1-temp2;else if(c=='*')temp1*=temp2;else if(c=='/')temp1/=temp2;else if(c=='s')temp1=sin(atof(m_s));else if(c=='c')temp1=cos(atof(m_s));m_s.Format("%.10lf",temp1);int n;n=m_s.Find('.');if (n>=0){m_s.TrimRight('0');if (m_s.GetLength()==n+1){m_s=m_s.Left(n+1);if (m_s.IsEmpty())m_s='0';}}UpdateData(false);}c='/';w=2;}void CCacuDlg::OnSqrt(){// TODO: Add your control notification handler code here Ispoint=false;temp1=sqrt(atof(m_s));m_s.Format("%.10lf",temp1);int n;n=m_s.Find('.');if (n>=0){m_s.TrimRight('0');if (m_s.GetLength()==n+1){m_s=m_s.Left(n+1);if (m_s.IsEmpty())m_s='0';}}p=q=1;w=1;c='r';UpdateData(false);}void CCacuDlg::Onpoint(){// TODO: Add your control notification handler code here if(p==1){m_s="";UpdateData(false);p=0;}//UpdateData(true);m_s=m_s+".";Ispoint=true;UpdateData(false);}void CCacuDlg::OnSin(){// TODO: Add your control notification handler code here c='s';p=q=1;w=2;}void CCacuDlg::OnCos(){// TODO: Add your control notification handler code here c='c';p=q=1;w=2;}void CCacuDlg::Onpower2(){// TODO: Add your control notification handler code here Ispoint=false;temp1=atof(m_s);temp1=temp1*temp1;m_s.Format("%.10lf",temp1);int n;n=m_s.Find('.');if (n>=0){m_s.TrimRight('0');if (m_s.GetLength()==n+1){m_s=m_s.Left(n+1);if (m_s.IsEmpty())m_s='0';}}p=q=1;w=1;c='r';UpdateData(false);}void CCacuDlg::Onpower3(){// TODO: Add your control notification handler code here Ispoint=false;temp1=atof(m_s);temp1=temp1*temp1*temp1;m_s.Format("%.10lf",temp1);int n;n=m_s.Find('.');if (n>=0){m_s.TrimRight('0');if (m_s.GetLength()==n+1){m_s=m_s.Left(n+1);if (m_s.IsEmpty())m_s='0';}}p=q=1;w=1;c='r';UpdateData(false);}void CCacuDlg::OnEquar(){// TODO: Add your control notification handler code here int yy=0;if(c=='+'||c=='r')temp=temp1+temp2;else if(c=='-')temp=temp1-temp2;else if(c=='*')temp=temp1*temp2;else if(c=='/'){if(temp2==0)yy=1;elsetemp=temp1/temp2;}else if(c=='s')temp=sin(atof(m_s));else if(c=='c')temp=cos(atof(m_s));m_s.Format("%.10lf",temp),temp1=temp;//m_s+=".";int n;n=m_s.Find('.');//UpdateData(false);if (n>=0){m_s.TrimRight('0');if (m_s.GetLength()==n+1){m_s=m_s.Left(n+1);if (m_s.IsEmpty())m_s='0';}}p=1;w=1;Ispoint=false;//temp1=temp;c='r';if(yy==1)m_s="除数不能为0";UpdateData(false);if(yy==1)m_s=="";}void CCacuDlg::On1x(){// TODO: Add your control notification handler code here int yy=0;if(m_s=="0")yy=1;elsetemp1=1.0/atof(m_s);m_s.Format("%.10lf",temp1);int n;n=m_s.Find('.');if (n>=0){m_s.TrimRight('0');if (m_s.GetLength()==n+1){m_s=m_s.Left(n+1);if (m_s.IsEmpty())m_s='0';}}p=1;w=1;c='r';Ispoint=false;if(yy==1)m_s="分母不能为0",yy=1;UpdateData(false);if(yy==1)m_s="";}void CCacuDlg::On1100(){// TODO: Add your control notification handler code here //if(p==1)Ispoint=false;int yy=0;if(c=='+'||c=='r')temp=temp1+temp2;else if(c=='-')temp=temp1-temp2;else if(c=='*')temp=temp1*temp2;else if(c=='/'){if(temp2==0)yy=1;elsetemp=temp1/temp2;}else if(c=='s')temp=sin(atof(m_s));else if(c=='c')temp=cos(atof(m_s));m_s.Format("%.10lf",temp),temp1=temp;m_s.Format("%.10lf",temp/100.0);int n;n=m_s.Find('.');if (n>=0){m_s.TrimRight('0');if (m_s.GetLength()==n+1){m_s=m_s.Left(n+1);if (m_s.IsEmpty())m_s='0';}}p=1;w=1,c='r';UpdateData(false);}void CCacuDlg::OnMs(){// TODO: Add your control notification handler code here UpdateData(true);M=atof(m_s);m_M="M";p=1;UpdateData(false);}void CCacuDlg::OnMc(){// TODO: Add your control notification handler code here M=0;m_M="";UpdateData(false);}void CCacuDlg::OnMr(){// TODO: Add your control notification handler code here Ispoint=false;m_s.Format("%.10lf",M);int n;n=m_s.Find('.');if (n>=0){m_s.TrimRight('0');if (m_s.GetLength()==n+1){m_s=m_s.Left(n+1);if (m_s.IsEmpty())m_s='0';}}p=1;//m_s.Delete(m_s.GetLength()-1,1);UpdateData(false);temp2=M;w=2;}void CCacuDlg::OnMadd(){// TODO: Add your control notification handler code hereM+=atof(m_s);c='1';}void CCacuDlg::OnMsub(){// TODO: Add your control notification handler code hereM-=atof(m_s);}void CCacuDlg::OnM(){// TODO: If this is a RICHEDIT control, the control will not// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask()// with the ENM_CHANGE flag ORed into the mask.// TODO: Add your control notification handler code here}void CCacuDlg::Onsubadd(){// TODO: Add your control notification handler code here//Ispoint=false;if(m_s[0]=='-')m_s.Delete(0,1);elsem_s.Insert(0,'-');if(w==1)temp1=atof(m_s);else if(w==2)temp2=atof(m_s);int n;n=m_s.Find('.');if (n>=0){m_s.TrimRight('0');if (m_s.GetLength()==n+1){m_s=m_s.Left(n);if (m_s.IsEmpty())m_s='0';}}m_s+=".";UpdateData(false);m_s.Delete(m_s.GetLength()-1,1);}void CCacuDlg::OnCe(){// TODO: Add your control notification handler code here m_s="0.";UpdateData(false);m_s="";}void CCacuDlg::OnPi(){// TODO: Add your control notification handler code here m_s="3.1415926";UpdateData(false);}。