MFC做的一个简单的计算器
mfc计算器程序设计详细

mfc计算器程序设计详细
MFC是Microsoft基础类的缩写,用于Windows下的GUI程序开发,封装了许多常用的功能,其中包括控件、多线程、消息传递等等。
下面我们将基于MFC来编写一个简单的计算器程序。
首先,我们需要创建一个MFC应用程序并添加一个对话框。
然后,我们需要在对话框中添加各种控件,比如按钮、文本框、标签等等。
在这个例子中,我们需要添加数字按钮、运算符按钮和一个显示结果
的文本框。
接着,我们需要定义各种事件函数,比如数字按钮的点击事件、
运算符按钮的点击事件等等。
在这些事件函数中,我们需要根据相应
的操作完成对应的计算,并将结果显示到文本框中。
当然,我们还需
要处理一些特殊情况,比如输入非法字符、除以0等等。
最后,我们需要将所有的控件和事件函数进行绑定,使得程序能
够正常地运行。
这个过程中,我们将使用MFC提供的消息映射机制来
处理鼠标和键盘事件,以及相应的消息传递机制来更新界面。
总之,在MFC的帮助下编写一个计算器程序不仅方便快捷,而且
代码逻辑清晰,可读性好。
MFC计算器介绍

MFC计算器介绍部门: xxx时间: xxx整理范文,仅供参考,可下载自行编辑基于对话框实验,写一个计算器,实验结果:工具:VS2018遇到的问题:编译遇到字符串不能转换为char *,在字符串前面加_T解决了。
1.首先新建一个MFC工程,在工具框里面拖出工具,摆好布局,修改caption和ID栏2.在头文件添加CString num1。
CString num2。
CStringm_result。
boolisresult。
int witch。
在初始化函数里面初始化// TODO: 在此添加额外的初始化代码num1=""。
num2=""。
isresult=false。
witch=0。
3.数字键代码voidCcalculatorDlg::OnBnClickednum1(>{// TODO: 在此添加控件通知处理程序代码if(isresult==false>{num1+="1"。
m_result=num1。
UpdateData(false>。
}if(isresult==true>{num2+="1"。
m_result=num2。
UpdateData(false>。
}}运算符键代码:voidCcalculatorDlg::OnBnClickedjia(>{// TODO: 在此添加控件通知处理程序代码isresult=true。
witch=1。
}等于键代码:voidCcalculatorDlg::OnBnClickeddengyu(> {// TODO: 在此添加控件通知处理程序代码UpdateData(true>。
double number1=_ttof(num1>。
double number2=_ttof(num2>。
double result=0.0。
switch(witch>{ case 1: result=number1+number2。
自编计算器步骤

自编计算器步骤1、打开VC++程序;2、点击文件下“新建”;3、选择“工程”属性页中的“MFC AppWizard(exe)”选项,在“工程”中输入工程名称,在“位置”中设置文件存放位置,如下图;4、点击“确定”按钮,进入下级界面,如下所示:选择“D基本对话”,点击“完成”按钮。
5、 如下图,建立程序界面;6、 用鼠标选择任意个输入对话框,按回车键,为每个输入框确定ID 值;如下:将每个输入框的ID 设置为易于识别的代号,如X 变量可设为IDC_EDIT_X ,流量Q 可设为IDC_EDIT_Q 等等;设置标签添加输入框7、建立好界面及自变量和因变量的ID之后,按Ctrl+W组合键,打开“建立类向导”对话框,或点击“查看”下的“建立类向导”,如下图:8、选择“Member Variables”属性页,为界面中所建立的输入框绑定程序中可以使用的变量。
用鼠标选择其中列出的Control IDs,然后点击右侧的“Add Variable…”按钮,为所选的输入框绑定变量,如下图所示:在Member variable name:中输入变量的名称,如m_x,m_前缀表示是变量。
Category选项选Value,表示该变量是值的形式,Variable type:选择该变量所属的数据类型,如float。
9、为每个界面中所建的输入框绑定各自的变量后,结果如下图:10、然后选择“新建类向导”中的“Message maps”属性页,如下:选择“Object IDs:”类表中的“IDOK”项,然后选择右侧的“BN_CLICKED”,单击右侧的“Add Function”按钮,为ID值IDOK 的按钮(即界面中的确定)添加单击时所要执行的函数。
11、点击“Add Function”按钮后显示如下对话框,单击即可。
12、然后单击“Edit Code”按钮,如下图:13、单击“Edit code”按钮后,屏幕显示如下:14、删除OnOK()函数中原有的“CDialog::OnOK()”一行。
MFC计算器

《C++面向对象程序设计》实验报告学院:信息科学与工程学院专业:学号:姓名:一.题目:利用MFC框架编写Windows附件中所示的简易计算器二.功能描述:1.能够实现最基本的加,减,乘,除四则基本运算。
2.界面有清空,退格按钮,方便用户计算使用。
3.此计算器具有开方,取倒数,求对数的高级运算。
三.概要设计:1.Windows消息处理机制通过对教材的阅读,对Windows程序的消息处理机制有个大致的了解。
Windows的程序都是通过消息来传送数据,并且存在异常处理等不需要用户参与的系统消息,用户消息就是鼠标的单击,双击等。
2.界面的设计如图,简易的计算器界面主要使用菜单中相关控件,并合理的布置各个按钮的位置,使得界面让用户看起来整洁简单。
3.框架描述Windows 简易计算器在资源视图画好界面添加控件的同时,通过属性修改名称为各个按钮和编辑框添加不同的函数四则运算+,-,*,/ 1/x,lgx等函数退格和清空键4.建立的变量和控件的命名,对应的消息处理函数命名表ID CAPTION Message Handler IDC_BUTTON0 0 OnButton0()IDC_BUTTON1 1 OnButton1()IDC_BUTTON2 2 OnButton2()IDC_BUTTON3 3 OnButton3()IDC_BUTTON4 4 OnButton4()IDC_BUTTON5 5 OnButton5()IDC_BUTTON6 6 OnButton6()IDC_BUTTON7 7 OnButton7()IDC_BUTTON8 8 OnButton8()IDC_BUTTON9 9 OnButton9()IDC_BUTTON10 . OnButton11()IDC_BUTTON11 = OnButtonequal() IDC_BUTTON12 + OnButtonadd()IDC_BUTTON13 - OnButtoncut()IDC_BUTTON14 * OnButtonmultiply() IDC_BUTTON15 / OnButtonremove() IDC_BUTTON16 1/x OnButton1x()IDC_BUTTON17 lg OnButtonlg()IDC_BUTTON18 sqrt OnButtonsqrt()IDC_BUTTON19 Backspace OnButtonbackspace() IDC_BUTTON20 C(清空) OnButtonclear()5.下图是基本对话框中所有的类四.详细设计:1.新建工程,选择MFC AppWizard[exe],并命名工程的名称为mycalculator2.选择基本对话框3.通过控件添加各种按钮和编辑框(对话框右边的“Controls”控件箱提供了可用于对话框的各种组建,在此次计算器中,基本上只用到上面四个控件,对话框只能通过控件来实现它们的功能,把控件中的数据保存在对话框类的数据成员中,应用程序才能通过这些数据成员获取控件中的数据)4.考虑用户们的习惯,把编辑框的显示的数字属性由靠左改成靠右(选中编辑框,右击选择属性-样式,排列文本改为向左)5.用同样的方法改变按钮的标题,其他按钮同理6.为美观改变对话框的标题为“计算器”7.右击编辑框添加类向导,添加变量m_result,且type为CString//可通过其改变类型和名称8.实现每个按钮的功能,双击按钮,为按钮添加函数,可以改变函数的名称① 0~9和小数点的函数大致类似void CMycalculatorDlg::OnButton1(){// TODO: Add your control notification handler code herem_result +=_T("1");UpdateData(FALSE);}函数_T()可以对字符串进行操作,UpdateData(FALSE)可以把数据传到文本框里面,小数点与数字同样这样处理。
可视化编程课程设计(含源码)计算器系统实现

设计题目:计算器系统实现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的一个简单计算器

基于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 类加⼊⼯程⾥,并实现按钮的功能就⾏了。
c++面向对象程序设计MFC简单计算器实验报告.doc

计算机与信息工程学院《程序设计基础》课程设计报告题目名称:60.编写一个能实现简单功能的计算器学生姓名:刘沛东学生学号:2011508154专业班级:电子信息工程(1)班指导教师:高攀1 课程设计的题目编写一个能实现简单功能的计算器2 题目要求1. 有一个计算器图形。
2. 能实现加、减、乘、除及乘方的运算。
3. 当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数字键要改变颜色 例如:输入数字1 时,在计算器图形上的1键变为红色。
4. 屏幕、图形颜色、形状自定3 总体设计3.1 总体框架图1 系统框架开始结束键入第一个按钮键入第二个按钮 显 示 结 果加 法减 法乘 法除 法乘 方清 零3.2 系统功能说明在VC++6.0中绘制计算器界面,各控件的设置对0~9控件设定相应的ID和其他属性:图2 “1”控件设置对“+、-、*、\”控件设定相应的ID和其他属性:图2 “+”控件设置对其它控件设定相应的ID和其他属性:图3 其它控件设置主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。
拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。
4 程序详细设计4.1系统主调模块图5 程序流程图4.2各模块详细设计 4.2.1 建立的变量,控件的命名,对应的消息处理函数对应表IDCAPTION Message Handler IDD_CALC_DIALOG 简易计算器 N/A IDC_NUM0 0 OnNum0 IDC_NUM1 1 OnNum1 IDC_NUM2 2 OnNum2 IDC_NUM3 3 OnNum3 IDC_NUM4 4 OnNum4 IDC_NUM5 5 OnNum5 IDC_NUM66OnNum6实现文件.cpp显示计算器界面开始执行工程全局对象资源文件.rc 模块定义文件.def头文件.h执行Afxmain()创建窗口实现窗口类注册SetwindowVoidVoid点击鼠标发出消息Void等待消息处理Void Void clc::onAdd()文本框中显示结果 程序运行结IDC_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个小数点。
基于vc++mfc的科学计算器程序实验报告

实验报告课程名称:windows软件开发实习实验项目:科学计算器工业大学实验报告(适用计算机程序设计类)专业班级:软件1006 学号:101201622 :鑫可实验名称:附件A 工业大学实验报告(适用计算机程序设计类)专业班级:软件1006 学号:101201622 :鑫可实验步骤或程序:一、关于Visual C++:Visual C++6.0由Microsoft开发, 它不仅是一个C++ 编译器,而且是一个基于Windows 操作系统的可视化集成开发环境(integrated development environment,IDE)。
Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。
这些组件通过过一个名为Developer Studio的组件集成为和谐的开发环境。
Microsoft的主力软件产品。
Visual C++是一个功能强大的可视化软件开发工具。
自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。
虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。
所以实际中,更多的是以Visual C++6.0为6平台。
Visual C++6.0以拥有“语法高亮”,自动编译功能以及高级除错功能而著称。
比如,它允许用户进行远程调试,单步执行等。
还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。
其编译及创建预编译头文件(stdafx.h)、最小重建功能及累加连结(link)著称。
这些特征明显缩短程序编辑、编译及连结的时间花费,在大型软件计划上尤其显著。
二、设计要点1、基本要求:设计的系统界面要美观大方,操作合理,有必要的提示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录一.设计题目。
(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_MAPEND_MESSAGE_MAP()b)界面设计。
1.仿照Windows附件里面的计算器,在资源视图中画好界面,如图1:图12.修改每个button的属性,如图2:图23.修改每个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);}elseMessageBox("error");}6.OnButtonZhengfu()按钮的处理函数。
void CTestDlg::OnButtonZhengfu(){UpdateData();m_Num = 0-m_Num;}六.附录。
1.调试。
图6图724/62.测试结果。
图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);}elseMessageBox("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);// Implementationprotected: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()};。