通俗易懂版基于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入门教程之实现一个简单的计算器

mfc⼊门教程之实现⼀个简单的计算器mfc学习之前的了解什么是mfc?MFC是微软基础类的缩写(Microsoft Foundation Classes),是⼀个庞⼤的类库,可以理解为⼀种在Windows上开发软件的架构,是微软专为Visual C++定制的。
该类库提供⼀组通⽤的可重⽤的类库供开发⼈员使⽤。
没有MFC之前,Windows上⽤Win32 API进⾏编程,之后MFC出现,在⼀定程度上提⾼了软件开发效率,它是对win32 API的封装,所以易⽤性好,不过性能会⽐win32开发低⼀些,⼆者各有所长。
在Windows上开发界⾯程序以前⽤MFC最合适,能兼顾效率和性能。
简单来说mfc就是⽅便windows程序开发的框架,不单单是界⾯,更有很多类库。
mfc能⼲什么?在学习mfc之前想必⼤家都会关系这个问题,很多⼈学习了c++,或者是学习了c和c++之后发现还是只能⿊窗⼝下⾯做做数学题,写写算法,做不出什么实际的东西(这⾥不是说c/++做不出实际的东西,⽽是⼤多数的⼈做不出)。
问这个问题就像问⼀把剪⼑能⼲什么,剪⼑什么也⼲不了,我们可以拿着剪⼑剪东西,剪的好坏更多的是在于使⽤者⽽不是⼯具本⾝。
当使⽤⼀件⼯具熟练之后去使⽤同类的⼯具你会发现很轻松就能上⼿,因为它们看似有区别实则万变不离其宗。
mfc和qt的选择很多⼈会去推荐学习qt说mfc过时了,如果你想要跨平台那么qt⾮你莫属,如果只是在windows上,那么mfc⽆可替代。
⽆论是qt还是mfc在windows平台上内部的实现原理都是⼀样的,只是封装上有些区别。
mfc制作简单计算器-界⾯设计1.新建mfc项⽬启动vs2013,点击⽂件->新建->项⽬->vc++->mfc应⽤程序点击确定进⼊mfc应⽤程序向导下⼀步选择基于对话框,点击完成。
这时候mfc为我们⽣成了默认的界⾯,⼀个静态⽂本框,两个按钮。
2.计算器界⾯设计⾸先删除三个默认创建的控件,选中之后右键,删除或者直接按下delete键。
基于MFC的简易计算器制作设计

JINGCHU UNIVERSITY OF TECHNOLOGY《一个简单的计算器设计》课程设计报告学院:计算机工程学院学号:姓名:朱钟雄专业年级:12计算机应用技术2班指导教师:游明坤时间:2014年12月25日基于对话框的计算器MFC方法实现随着社会的发展,人们在日常生活中经常需要用到计算器来进行简单或者复杂的运算,计算器在人们生活中的地位也越来越重要。
简单的计算器能实现加、减、乘、除、开方、平方等运算。
学习了C++的程序设计语言这门课程,可以利用基于VC的MFC方法制作一个简易的计算器,实现基本的运算功能,从而满足生活中的需要,降低计算的难度。
一. 面向对象的程序设计方法区别与面向过程的“先功能后数据”思想,面向对象的程序设计方法把状态(数据)和行为(功能)捆绑在一起,形成了对象。
当遇到一个具体的问题时,我们只需要将一个系统分解成一个个的对象,同时将状态和行为封装在对象中。
??面向对象的程序设计方法具有三个基本特点:封装、继承和多态。
?(1)?封装性??封装是一个用来指代将对象的状态和行为捆绑到一个单一逻辑单元的机制的正式术语。
它不是面向对象语言所特有的,面向过程的C语言用结构封装了数据,函数封装了逻辑。
但是面向对象封装了两者,从这种意义上来说,面向对象的封装更加完美。
??出于一些安全性与方便性的考虑,对象经常会限制对它们特征(包括属性和方法)的访问,这种限制称为信息隐藏。
作为对象的抽象,类通常只公开对象可以公开的东西,主要是一个特定对象对系统的服务,而隐藏执行服务的内部细节和为了完成这些服务而设计的数据。
?(?2)?继承性??继承是定义新类的一种机制,使用这种机制创建新类时只需要声明新类和已创建类之间的差别。
?对于一个特定的继承关系,我们将创建的新类称为子类(subclass),被继承的原始类称为超类(superclass)。
子类可以使用超类定义属性和方法,也可以自己定义新的属性和方法。
基于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 类加⼊⼯程⾥,并实现按钮的功能就⾏了。
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的窗口函数,用来刷新数据的由于我们进行基本运算需要更新数据所以必须添加这个函数。
C语言MFC基础之计算器详解

C语⾔MFC基础之计算器详解⽬录基于MFC计算器(基础点)需求:把计算器运算的过程呈现出来。
基础点总结基于MFC计算器(基础点)主要是在实现MFC计算器的过程中碰到的⼀些问题,和补充的⼀些知识。
需求:把计算器运算的过程呈现出来。
想法:利⽤两个队列,⼀个存储输⼊的字符串(表达式),⼀个存放结果。
分别命名为queue1,和myqueue,让字符串从左到右依次⼊队列。
但之后按照⾃⼰的思路去推演,发现如果进⼊队列的是1+23,如果下⼀个字符⼊队的是“+”,那么先计算23的结果⼊队myqueue中,⽽queue1中还储存1,但下⼀个“+”⼊ queue1之后,此时queue1中包含1+,最后把myqueue中的元素和queue1结合,最终在编辑框⽂本中显⽰的是:1+6;如果下⼀个运算符是“*”,那么直接输出队列中的字符串。
在实现的过程中会涉及到类型转换,⽐如CString转换成浮点型。
⽬前还没有实现,主要原因在于对基础的语法不熟悉,还不太会使⽤先总结前⼀段时间碰到的⼀些问题,和解决⽅案。
基础点stack,queue,⽽map函数映射库是char到int的映射,实现了优先级的定义。
C++中的compare():涌来进⾏字符串以及⼦串之间的⽐较。
getline():读整⾏,包括前导和嵌⼊的空格并将其储存在字符串对象中。
length=strlen():遍历字符串strlen():可以做⼀个计数器,从内存的某个位置扫描,直到碰到第⼀个字符串结束符‘\0'为⽌,返回计算器值bool类型做判断:true,falsef分别是:对错,是⾮,正反atof():把字符转化为浮点数ofstream():写操作ofstream fout:是对C++SIT中对⽂件操作的合集,包含了常⽤的所有⽂件操作:插⼊器,析取器fout.open(“txt”,ios::out):打开⽂件流ifstream():读操作,从硬盘到内存fstream():同时进⾏读写ios:in,⽂件以输⼊的⽅式打开。
VC之基于MFC的简易计算器

程序设计报告课程名称:面向对象技术与Visual C++ 设计题目:基于MFC的简易计算器专业:信息与计算科学班级:信122 姓名:学号:2012314233任课教师:二○一五年五月注:本设计报告中各个部分如果页数不够,请大家自行扩页,原则是一定要把报告写详细,能说明设计的成果和特色。
报告中应该叙述设计中的每个模块。
三、系统分析与设计1系统功能1.1系统功能图1.2系统功能划分1.2系统功能划分对象ID 标题或说明编辑框IDC_EDIT2 显示按钮IDC_BUTTON10 0按钮IDC_BUTTON1 1按钮IDC_BUTTON2 2按钮IDC_BUTTON3 3按钮IDC_BUTTON4 4按钮IDC_BUTTON5 5按钮IDC_BUTTON6 6按钮IDC_BUTTON7 7按钮IDC_BUTTON8 8按钮IDC_BUTTON9 9按钮IDC_point .按钮IDC_BUTTON13 +按钮IDC_BUTTON14 -按钮IDC_BUTTON15 *按钮IDC_BUTTON16 /按钮IDC_Btn_sqrt sqrt按钮IDC_Btn_lg lg按钮IDC_Btn_jiecheng n!按钮IDC_Btn_sin sin按钮IDC_Btn_cos cos按钮IDC_Btn_tan tan按钮IDC_Btn_erjinzhi 二进制按钮 IDC_BUTTON12 = 按钮IDC_BUTTON18CE2系统流程图1.3 计算器界面1.4总体代码(1)数字键代码(仅以1为例) void CJisuanqiDlg::OnButton1() { num[i]=num[i]+"1";开始输入数据加法减法乘法除法求开方求对数求阶乘求正弦求余弦求正切输入第二个数据 结果进制转换结束五、系统运行报告(测试的结果)(1)加法(2)减法(3)乘法(4)除法(5)二进制(6)正弦(7)余弦(8)正切(9)对数(10)阶乘(11)开方。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2013/6/22作者编写的科学强大的易懂的新手入门的科学计算器,基于MFC编写的科学计算器指导教师对课程设计的评定意见搞要本课程设计是在基于对话框的应用程序中模拟一个计算器,本计算器可以进行十进制下的四则运算(加、减、乘、除)和四则混合运算,可以把十进制转化为二进制或十六进制,可以进行一些常用的函数运算(比如sin、cos、tan、cot、sqrt、ln等),还可以支持带“(”,“)”符号的表达式的计算。
系统开发平台为Windows XP,程序设计设计语言采用Visual C++6.0,程序运行平台为Windows 98/2000/XP。
程序通过调试运行,初步实现了设计目标。
关键词程序设计;计算器;C++;1 引言在现代社会中,计算器已经进入了每一个家庭,人们在生活和学习中经常需要使用到计算器,它的出现大大减少了人们在计算方面的工作量,可以说它在人们生活和学习中是不可缺少的。
1.1C++介绍C++语言的主要特点表现在两个方面,一是全面兼容C语言,二是支持面向对象的程序设计方法[1]。
(1) C++是一个更好的C,它保持了C语言的优点,大多数的C程序代码略作修改或不作修改就可在C++的集成环境下调试和运行。
这对于继承和开发当前已在广泛的软件是非常重要的,可以节省大量的人力和物力。
(2) C++是一种面向对象的程序设计语言它使得程序的各个模块的独立性更强,程序的可读性和可移植性更强,程序代码的结构更加合理,程序的扩充性更强。
这对于设计、编制和调试一些大型的软件尤为重要。
(3) C++集成环境不仅支持C++程序的编译和调试,而且也支持C程序的编译和调试。
通常,C++程序环境约定:当源程序文件的扩展名为c.时,则为C 程序;而当源程序文件的扩展名为cpp.时,则为C++程序。
(4) C++语句非常简练,对语法限制比较宽松,因此C++语法非常灵活。
其优点是给用户编程带来书写上的方便。
其缺点是由于编译时对语法限制比较宽松,许多逻辑上的错误不容易发现,给用户编程增加了难度。
3以下是详尽的代码在C***Dlg添加下面代码,这个自己一定要看懂,里面是各个按钮的响应函数,不是叫你直接复制粘贴,而是一个个双击按钮添加代码,最后成了以下的样式。
// text2Dlg.cpp : 实现文件//#include "stdafx.h"#include "text2.h"#include "text2Dlg.h"#include "afxdialogex.h"#include"atlsimpstr.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的CAboutDlg 对话框class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// Ctext2Dlg 对话框Ctext2Dlg::Ctext2Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(Ctext2Dlg::IDD, pParent), m_strResult(_T("")), OperatorPressed(false), Restarted(false), s(0), m_Edit3(_T("")), L(0), L1(0), PB(0), radio(0), m_strout(_T("")), m_MM3(_T("")), m_Inv(false){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }void Ctext2Dlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, m_strResult);DDX_Text(pDX, IDC_EDIT3, m_Edit3);DDX_Text(pDX, IDC_MM3, m_MM3);}BEGIN_MESSAGE_MAP(Ctext2Dlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_0, &Ctext2Dlg::OnBnClicked0)ON_BN_CLICKED(IDC_1, &Ctext2Dlg::OnBnClicked1)ON_BN_CLICKED(IDC_2, &Ctext2Dlg::OnBnClicked2)ON_BN_CLICKED(IDC_3, &Ctext2Dlg::OnBnClicked3)ON_BN_CLICKED(IDC_4, &Ctext2Dlg::OnBnClicked4)ON_BN_CLICKED(IDC_5, &Ctext2Dlg::OnBnClicked5)ON_BN_CLICKED(IDC_6, &Ctext2Dlg::OnBnClicked6)ON_BN_CLICKED(IDC_7, &Ctext2Dlg::OnBnClicked7)ON_BN_CLICKED(IDC_8, &Ctext2Dlg::OnBnClicked8)ON_BN_CLICKED(IDC_9, &Ctext2Dlg::OnBnClicked9)ON_BN_CLICKED(IDC_POINT, &Ctext2Dlg::OnBnClickedPoint)ON_BN_CLICKED(IDC_ADD, &Ctext2Dlg::OnBnClickedAdd)ON_BN_CLICKED(IDC_SUB, &Ctext2Dlg::OnBnClickedSub)ON_BN_CLICKED(IDC_mul, &Ctext2Dlg::OnBnClickedmul)ON_BN_CLICKED(IDC_DIV, &Ctext2Dlg::OnBnClickedDiv)ON_BN_CLICKED(IDC_EQUAL, &Ctext2Dlg::OnBnClickedEqual)ON_BN_CLICKED(IDC_BACKSPACE, &Ctext2Dlg::OnBnClickedBackspace) ON_BN_CLICKED(IDC_C, &Ctext2Dlg::OnBnClickedC)ON_BN_CLICKED(IDC_SIN, &Ctext2Dlg::OnBnClickedSin)ON_BN_CLICKED(IDC_COS, &Ctext2Dlg::OnBnClickedCos)ON_BN_CLICKED(IDC_TAN, &Ctext2Dlg::OnBnClickedTan)ON_BN_CLICKED(IDC_SQRT, &Ctext2Dlg::OnBnClickedSqrt)ON_BN_CLICKED(IDC_LKOUHAO, &Ctext2Dlg::OnBnClickedLkouhao) ON_BN_CLICKED(IDC_RKOUHAO, &Ctext2Dlg::OnBnClickedRkouhao) ON_BN_CLICKED(IDC_PI, &Ctext2Dlg::OnBnClickedPi)ON_BN_CLICKED(IDC_INT, &Ctext2Dlg::OnBnClickedInt)ON_BN_CLICKED(IDC_MOD, &Ctext2Dlg::OnBnClickedMod)ON_BN_CLICKED(IDC_CE, &Ctext2Dlg::OnBnClickedCe)ON_BN_CLICKED(IDC_DAOSHU, &Ctext2Dlg::OnBnClickedDaoshu)ON_BN_CLICKED(IDC_JIAJIAN, &Ctext2Dlg::OnBnClickedJiajian)ON_BN_CLICKED(IDC_N, &Ctext2Dlg::OnBnClickedN)ON_BN_CLICKED(IDC_SQUARE, &Ctext2Dlg::OnBnClickedSquare)ON_BN_CLICKED(IDC_CUBE, &Ctext2Dlg::OnBnClickedCube)ON_BN_CLICKED(IDC_TENX, &Ctext2Dlg::OnBnClickedTenx)ON_BN_CLICKED(IDC_EXP, &Ctext2Dlg::OnBnClickedExp)ON_BN_CLICKED(IDC_LOG, &Ctext2Dlg::OnBnClickedLog)ON_BN_CLICKED(IDC_SINH, &Ctext2Dlg::OnBnClickedSinh)ON_BN_CLICKED(IDC_COSH, &Ctext2Dlg::OnBnClickedCosh)ON_BN_CLICKED(IDC_TANH, &Ctext2Dlg::OnBnClickedTanh)ON_BN_CLICKED(IDC_IN, &Ctext2Dlg::OnBnClickedIn)ON_BN_CLICKED(IDC_XY, &Ctext2Dlg::OnBnClickedXy)ON_BN_CLICKED(IDC_KAILIFANG, &Ctext2Dlg::OnBnClickedKailifang) ON_BN_CLICKED(IDC_RADIO1, &Ctext2Dlg::OnBnClickedRadio1)ON_BN_CLICKED(IDC_RADIO2, &Ctext2Dlg::OnBnClickedRadio2)ON_BN_CLICKED(IDC_FE, &Ctext2Dlg::OnBnClickedFe)ON_BN_CLICKED(IDC_YX, &Ctext2Dlg::OnBnClickedYx)ON_BN_CLICKED(IDC_INV, &Ctext2Dlg::OnBnClickedInv)ON_BN_CLICKED(IDC_MC, &Ctext2Dlg::OnBnClickedMc)ON_BN_CLICKED(IDC_MR, &Ctext2Dlg::OnBnClickedMr)ON_BN_CLICKED(IDC_MS, &Ctext2Dlg::OnBnClickedMs)ON_BN_CLICKED(IDC_MADD, &Ctext2Dlg::OnBnClickedMadd)ON_BN_CLICKED(IDC_MSUB, &Ctext2Dlg::OnBnClickedMsub)ON_BN_CLICKED(IDC_SIN2, &Ctext2Dlg::OnBnClickedSin2)ON_BN_CLICKED(IDC_COS2, &Ctext2Dlg::OnBnClickedCos2)ON_BN_CLICKED(IDC_TAN2, &Ctext2Dlg::OnBnClickedTan2)ON_BN_CLICKED(IDC_PI2, &Ctext2Dlg::OnBnClickedPi2)END_MESSAGE_MAP()// Ctext2Dlg 消息处理程序BOOL Ctext2Dlg::OnInitDialog(){CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。