VCmfc编计算器源代码
VS2008下计算器的MFC编程实现..
VS2008下计算器的MFC编程实现简单的计算器编程,完全在VS2008下实现,主要用于熟悉VS2008的功能。
谨以此分享给和我一样初学MFC的朋友们。
STEP1:页面设计1.新建工程首先打开Visual Studio2008,选择MFC应用程序,设定好路径和工程名(这里我设置工程名为为“Calculator”)。
这里要注意的是在创建向导步骤1的时候,我们选择“基本对话框”,其他选项默认即可。
之后我们可以点击完成便看到以下界面:此时我们把当前页面上原配的控件按Delete全部清除(如下图)2.添加控件接着我们按照MFC自带的控件选项进行我们本次计算器的控件添加。
点击右侧的工具栏按钮(以下是控件)我们在原先清空的界面中依次用上图控件画出一个基本的计算器页面(如下图)。
影响用户的心情。
3.修改空间ID和Caption上图各控件类型如下:Edit ControlButtonGroup Box:选择其中一个GroupBox,右键单击,选择[属性]。
在右边显示属性对话框。
每个控件“属性”都有属于它自己的ID,默认的Group Box的ID为IDC_STATIC,而且Cap当然我们为了“顾名思义”,对控件ID进行修改成我们容易辨认的(也可以不改),添加完控件并修改ID。
4个Group Box的ID分别修改为IDC_STATIC_FRAME ,IDC_STATIC_IN, IDC_STATIC_RESULT, IDC_STATIC_BUTTON 控件Edit Control和Button也按相同的办法处理。
ID设置完成可以在“Resourse.h”中查看。
完成修改ID后,就需给控件添加消息响应了。
在属性对话框的上方点击闪电“”图标,添加控件事件。
如对于按钮“”,点击“”点击下拉键头,添加控件事件,页面自动切换到代码的编辑页面,如“添加OnBnClickedButton5”MFC默认下了的响应信息都为On_开头。
使用VC6编写一个计算器MFC
使用VC6编写一个计算器MFC回答如下:要使用VC6编写一个计算器MFC应用程序,首先需要创建一个新的MFC项目。
在VC6中,选择“创建一个新的工程”,然后选择“MFC应用程序”,并命名该项目为“Calculator”。
接下来,在“CalculatorDlg.h”文件中,可以编写计算器对话框类的代码。
在该类中,需要声明所有添加到对话框中的控件的成员变量。
例如,可以声明一个`CEdit`类型的指针变量来引用屏幕上的文本框控件。
此外,还可以声明其他成员变量来存储计算器的状态和当前操作数的值。
然后,在“CalculatorDlg.cpp”文件中,可以实现计算器对话框类的代码。
在该文件中,需要实现对话框的初始化、按钮单击事件的处理等功能。
例如,可以在对话框的`OnInitDialog`函数中初始化计算器的状态,并将其他控件的消息映射到对应的成员函数上。
然后,在对应的成员函数中,可以编写相应的代码来处理按钮单击事件,进行计算,并将结果显示在屏幕上。
在编写计算器的核心功能时,可以使用`+`、`-`、`*`和`/`等运算符来实现加法、减法、乘法和除法。
此外,还可以添加其他功能,如取余、开方等。
为了实现这些功能,可以在对话框类中添加成员函数,然后在相应的按钮单击事件中调用这些函数。
最后,在项目的构建选项中,将“字符集”设置为“使用Unicode字符集”,以支持使用中文。
然后,编译并运行该项目,就可以看到一个MFC计算器应用程序在屏幕上显示出来。
总结起来,在VC6中编写一个计算器MFC应用程序需要完成以下步骤:1.创建新的MFC项目,并添加所需的控件。
2.在对话框类中声明和实现计算器界面的成员变量和函数。
3.在对应的按钮单击事件处理函数中编写计算器的核心功能。
4. 在项目的构建选项中设置字符集为Unicode字符集。
5.编译并运行项目,测试计算器应用程序。
以上是一个简单的使用VC6编写一个计算器MFC的步骤。
当然,具体的实现还有很多细节需要注意和完成,如错误处理、界面美化等。
MFC简单计算器编程步骤
1,准备环境:Microsoft Visual C++6.0
2,打开Microsoft Visual C++6.0,选择【文件】,点击新建,再出现的对话框中选择MFC AppWizard(exe),然后设置工程名和位置,如下图所示,点击确定
3,在出现的对话框中选择(基本对话框),点击完成,如下图所示
4,再出现的对话框中添加编辑框和按钮,并进行布局如下图
注:点击按钮右键属性,即可设置按钮上的数字和运算符显示
5,然后单击编辑框,接着按组合键Ctrl+W,再出现的对话框内选择【Member Variable】,出现下图所示
6,然后选项按钮【Add Variable...】,再出现的对话框内进行设置,如下图中所示,接着点击【OK】,接着点击确定,返回最初的对话框
7,然后切换到ClassViewj界面,双击CCalculatorDlg,在public中定义如下变量8,然后进行数字设置,如双击【1】按钮,添加如下代码
9,然后进行等号设置,双击【=】按钮,添加如下代码
10,进行运算符设置,如双击【+】,添加如下代码11,进行CE设置,双击【CE】,添加如下代码
12,最后一步,调试运行,结果如下
因为时间和水品有限,只能做到这里了,希望对有兴趣的人有一定帮助
版权归孤独邪剑所有,尽请分享,哈哈。
MFC计算器实现步骤和代码
MFC计算机程序步骤:1. 在进入VC++的第一个界面下,选择MFC AppWizard(exe),并设置工程名机器所在位置。
2. 在MFC AppWizard—step1 中选中Dialog based 选项,建立一个基于对话框的程序框架。
3. 使用资源编辑器建立对话框4. 编辑其中的各个控件的属性5. 插入菜单资源并编辑各项属性各属性为:Caption + * / ClearID ID_ADD_MENU ID_DIFFERENCE _MENU ID_MULTIPL Y_MENU ID_DEVIDE_MENU ID_CLEAR_MENUAbout ExitID_ABOUT_MENU ID_EXIT_MENU6. 添加代码使用Class Wizard 给编辑框连接变量(1)实现基本的加、减、乘、除的代码的添加。
(2)添加与菜单相关联的代码(3)填添加与滚动条相关联的代码在MFC AppWized(exe)项目下做。
界面自己做1.在对话框的头文件CalculatorDlg.h中添加#include<math.h>2.为CCalculatorDlg类添加成员数据和成员函数double number1,number2;int NumberState,OperationState;void cal();并在CCalculatorDlg类的构造函数中增加NumberState=1;3.添加消息按钮afx_msg void OnNumberKey(UINT nID);afx_msg void OnOperationKey(UINT nID);4.在CalculatorDlg.cpp文件中BEGIN_MESSAGE_MAP(CMy1Dlg, CDialog)和END_MESSAGE_MAP()间添加代码ON_COMMAND_RANGE(IDC_NUMBER1,IDC_NUMBER10,OnNumberKey)ON_COMMAND_RANGE(IDC_NUMBER11,IDC_NUMBER20,OnOperationKey)5.为成员函数OnNumberKey和OnOperationKey添加代码void CCalculatorDlg::OnNumberKey(UINT nID){int n=0;switch(nID){case IDC_NUMBER1:n=1;break;case IDC_NUMBER2:n=2;break;case IDC_NUMBER3:n=3;break;case IDC_NUMBER4:n=4;break;case IDC_NUMBER5:n=5;break;case IDC_NUMBER6:n=6;break;case IDC_NUMBER7:n=7;break;case IDC_NUMBER8:n=8;break;case IDC_NUMBER9:n=9;break;case IDC_NUMBER10:n=0;break;}if(NumberState==1){m_result=m_result*10+n;number1=m_result;UpdateData(FALSE); // 更新编辑框中的值}else{m_result=m_result*10+n;number2=m_result;UpdateData(FALSE);}}void CCalculatorDlg::OnOperationKey(UINT nID){switch(nID){case IDC_NUMBER13: // "/"按钮OperationState=1;UpdateData(FALSE);m_result=0;NumberState=2;break;case IDC_NUMBER14: // "*"按钮OperationState=2;UpdateData(FALSE);m_result=0;NumberState=2;break;case IDC_NUMBER15: // "+"按钮OperationState=3;UpdateData(FALSE);m_result=0;NumberState=2;break;case IDC_NUMBER16: // "-"按钮OperationState=4;UpdateData(FALSE);m_result=0;NumberState=2;break;case IDC_NUMBER17: // "C"按钮,撤消用,不需要可以删除number1=number2=m_result=0;UpdateData(FALSE);NumberState=1;break;case IDC_NUMBER20: // "="按钮cal(); // 调用cal成员函数break;}}6.为成员函数cal()添加代码void CCalculatorDlg::cal(){switch(OperationState){case 1:m_result=(double)number1/number2;UpdateData(FALSE); // 更新编辑框中的结果number1=m_result; // 把此次的运算结果作为下一次运算的第一个操作数NumberState=2; // 下次输入的数作为第二个操作数break;case 2:m_result=number1*number2;UpdateData(FALSE); // 更新编辑框中的结果number1=m_result;NumberState=2;break;case 3:m_result=number1+number2;UpdateData(FALSE); // 更新编辑框中的结果number1=m_result;NumberState=2;break;case 4:m_result=number1-number2;UpdateData(FALSE); // 更新编辑框中的结果number1=m_result;NumberState=2;break;}OperationState=0;} 注意按钮的ID号要和程序中的ID号相同!!!!。
可视化编程课程设计(含源码)计算器系统实现
设计题目:计算器系统实现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)源代码编写错误通过查阅资料,请教同学,逐步一一解决。
计算器编程c语言
计算器编程 c语言用C语言设计计算器程序源代码#include <dos.h> /*DOS接口函数*/#include <math.h> /*数学函数的定义*/#include <conio.h> /*屏幕操作函数*/函数*/#include <stdio.h> /*I/O#include <stdlib.h> /*库函数*/变量长度参数表*/#include <stdarg.h> /*图形函数*/#include <graphics.h> /*字符串函数*/#include <string.h> /*字符操作函数*/#include <ctype.h> /*#define UP 0x48 /*光标上移键*/#define DOWN 0x50 /*光标下移键*/#define LEFT 0x4b /*光标左移键*/#define RIGHT 0x4d /*光标右移键*/#define ENTER 0x0d /*回车键*/void *rar; /*全局变量,保存光标图象*/使用调色板信息*/struct palettetype palette; /*int GraphDriver; /* 图形设备驱动*/int GraphMode; /* 图形模式值*/int ErrorCode; /* 错误代码*/int MaxColors; /* 可用颜色的最大数值*/int MaxX, MaxY; /* 屏幕的最大分辨率*/double AspectRatio; /* 屏幕的像素比*/void drawboder(void); /*画边框函数*/初始化函数*/void initialize(void); /*计算器计算函数*/void computer(void); /*改变文本样式函数*/ void changetextstyle(int font, int direction, int charsize); /*窗口函数*/void mwindow(char *header); /*/*获取特殊键函数*/int specialkey(void) ;设置箭头光标函数*//*int arrow();/*主函数*/int main(){设置系统进入图形模式 */initialize();/*运行计算器 */computer(); /*系统关闭图形模式返回文本模式*/closegraph();/*/*结束程序*/return(0);}/* 设置系统进入图形模式 */void initialize(void){int xasp, yasp; /* 用于读x和y方向纵横比*/GraphDriver = DETECT; /* 自动检测显示器*/initgraph( &GraphDriver, &GraphMode, "" );/*初始化图形系统*/ErrorCode = graphresult(); /*读初始化结果*/如果初始化时出现错误*/if( ErrorCode != grOk ) /*{printf("Graphics System Error: %s\n",显示错误代码*/grapherrormsg( ErrorCode ) ); /*退出*/exit( 1 ); /*}getpalette( &palette ); /* 读面板信息*/MaxColors = getmaxcolor() + 1; /* 读取颜色的最大值*/MaxX = getmaxx(); /* 读屏幕尺寸 */MaxY = getmaxy(); /* 读屏幕尺寸 */getaspectratio( &xasp, &yasp ); /* 拷贝纵横比到变量中*/计算纵横比值*/ AspectRatio = (double)xasp/(double)yasp;/*}/*计算器函数*/void computer(void){定义视口类型变量*/struct viewporttype vp; /*int color, height, width;int x, y,x0,y0, i, j,v,m,n,act,flag=1;操作数和计算结果变量*/float num1=0,num2=0,result; /*char cnum[5],str2[20]={""},c,temp[20]={""};定义字符串在按钮图形上显示的符号 char str1[]="1230.456+-789*/Qc=^%";/**/mwindow( "Calculator" ); /*显示主窗口 */设置灰颜色值*//*color = 7;getviewsettings( &vp ); /* 读取当前窗口的大小*/width=(vp.right+1)/10; /* 设置按钮宽度 */设置按钮高度 */height=(vp.bottom-10)/10 ; /*/*设置x的坐标值*/x = width /2;设置y的坐标值*/y = height/2; /*setfillstyle(SOLID_FILL, color+3);bar( x+width*2, y, x+7*width, y+height );/*画一个二维矩形条显示运算数和结果*/setcolor( color+3 ); /*设置淡绿颜色边框线*/rectangle( x+width*2, y, x+7*width, y+height );/*画一个矩形边框线*/设置颜色为红色*/setcolor(RED); /*输出字符串"0."*/outtextxy(x+3*width,y+height/2,"0."); /*/*设置x的坐标值*/x =2*width-width/2;设置y的坐标值*/y =2*height+height/2; /*画按钮*/for( j=0 ; j<4 ; ++j ) /*{for( i=0 ; i<5 ; ++i ){setfillstyle(SOLID_FILL, color);setcolor(RED);bar( x, y, x+width, y+height ); /*画一个矩形条*/rectangle( x, y, x+width, y+height );sprintf(str2,"%c",str1[j*5+i]);/*将字符保存到str2中*/outtextxy( x+(width/2), y+height/2, str2);移动列坐标*/x =x+width+ (width / 2) ;/*}y +=(height/2)*3; /* 移动行坐标*/x =2*width-width/2; /*复位列坐标*/}x0=2*width;y0=3*height;x=x0;y=y0;gotoxy(x,y); /*移动光标到x,y位置*/显示光标*/arrow(); /*putimage(x,y,rar,XOR_PUT);m=0;n=0;设置str2为空串*/strcpy(str2,""); /*当压下Alt+x键结束程序,否则执行下面的循环while((v=specialkey())!=45) /**/{当压下键不是回车时*/while((v=specialkey())!=ENTER) /*{putimage(x,y,rar,XOR_PUT); /*显示光标图象*/if(v==RIGHT) /*右移箭头时新位置计算*/if(x>=x0+6*width)如果右移,移到尾,则移动到最左边字符位置*//*{x=x0;m=0;}else{x=x+width+width/2;m++;否则,右移到下一个字符位置*/} /*if(v==LEFT) /*左移箭头时新位置计算*/if(x<=x0){x=x0+6*width;m=4;} /*如果移到头,再左移,则移动到最右边字符位置*/else{x=x-width-width/2;m--;} /*否则,左移到前一个字符位置*/if(v==UP) /*上移箭头时新位置计算*/if(y<=y0){y=y0+4*height+height/2;n=3;} /*如果移到头,再上移,则移动到最下边字符位置*/else{y=y-height-height/2;n--;} /*否则,移到上边一个字符位置*/if(v==DOWN) /*下移箭头时新位置计算*/if(y>=7*height){ y=y0;n=0;} /*如果移到尾,再下移,则移动到最上边字符位置*/else{y=y+height+height/2;n++;} /*否则,移到下边一个字符位置*/putimage(x,y,rar,XOR_PUT); /*在新的位置显示光标箭头*/ }将字符保存到变量c中*/c=str1[n*5+m]; /*判断是否是数字或小数点*/if(isdigit(c)||c=='.') /*{如果标志为-1,表明为负数*/if(flag==-1) /*{将负号连接到字符串中*/strcpy(str2,"-"); /*flag=1;} /*将标志值恢复为1*/将字符保存到字符串变量temp中*/ sprintf(temp,"%c",c); /*将temp中的字符串连接到str2中*/strcat(str2,temp); /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);显示字符串*/outtextxy(5*width,height,str2); /*}if(c=='+'){将第一个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*做计算加法标志值*/act=1; /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='-'){如果str2为空,说明是负号,而不是减号*/ if(strcmp(str2,"")==0) /*设置负数标志*/flag=-1; /*else{将第二个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*act=2; /*做计算减法标志值*/setfillstyle(SOLID_FILL,color+3);画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}}if(c=='*'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算乘法标志值*/act=3; /*setfillstyle(SOLID_FILL,color+3); bar(2*width+width/2,height/2,15*width /2,3*height/2);显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='/'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算除法标志值*/act=4; /*setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,"0."); /*显示字符串*/}if(c=='^'){将第二个操作数转换为浮点数*/num1=atof(str2); /*将str2清空*/strcpy(str2,""); /*做计算乘方标志值*/act=5; /*设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='%'){将第二个操作数转换为浮点数*/num1=atof(str2); /*strcpy(str2,""); /*将str2清空*/做计算模运算乘方标志值*/act=6; /*setfillstyle(SOLID_FILL,color+3); /*设置用淡绿色实体填充*/画矩形*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}if(c=='='){将第二个操作数转换为浮点数*/num2=atof(str2); /*根据运算符号计算*/switch(act) /*{case 1:result=num1+num2;break; /*做加法*/case 2:result=num1-num2;break; /*做减法*/case 3:result=num1*num2;break; /*做乘法*/case 4:result=num1/num2;break; /*做除法*/case 5:result=pow(num1,num2);break; /*做x的y次方*/case 6:result=fmod(num1,num2);break; /*做模运算*/ }设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*覆盖结果区*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*将结果保存到temp中*/sprintf(temp,"%f",result); /*outtextxy(5*width,height,temp); /*显示结果*/}if(c=='c'){num1=0; /*将两个操作数复位0,符号标志为1*/num2=0;flag=1;strcpy(str2,""); /*将str2清空*/设置用淡绿色实体填充*/ setfillstyle(SOLID_FILL,color+3); /*覆盖结果区*/ bar(2*width+width/2,height/2,15*width/2,3*height/2); /*显示字符串*/outtextxy(5*width,height,"0."); /*}如果选择了q回车,结束计算程序*/if(c=='Q')exit(0); /*}putimage(x,y,rar,XOR_PUT); /*在退出之前消去光标箭头*/返回*/return; /*}/*窗口函数*/void mwindow( char *header ){int height;cleardevice(); /* 清除图形屏幕 */setcolor( MaxColors - 1 ); /* 设置当前颜色为白色*//* 设置视口大小 */ setviewport( 20, 20, MaxX/2, MaxY/2, 1 );height = textheight( "H" ); /* 读取基本文本大小 */settextstyle( DEFAULT_FONT, HORIZ_DIR, 1 );/*设置文本样式*/settextjustify( CENTER_TEXT, TOP_TEXT );/*设置字符排列方式*/输出标题*/outtextxy( MaxX/4, 2, header ); /*setviewport( 20,20+height+4, MaxX/2+4, MaxY/2+20, 1 ); /*设置视口大小*/ 画边框*/drawboder(); /*}画边框*/void drawboder(void) /*{定义视口类型变量*/struct viewporttype vp; /*setcolor( MaxColors - 1 ); /*设置当前颜色为白色 */setlinestyle( SOLID_LINE, 0, NORM_WIDTH );/*设置画线方式*/将当前视口信息装入vp所指的结构中*/getviewsettings( &vp );/*画矩形边框*/rectangle( 0, 0, vp.right-vp.left, vp.bottom-vp.top ); /*}/*设计鼠标图形函数*/int arrow(){int size;定义多边形坐标*/int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4}; /*设置填充模式*/setfillstyle(SOLID_FILL,2); /*/*画出一光标箭头*/fillpoly(8,raw);测试图象大小*/size=imagesize(4,4,16,16); /*分配内存区域*/rar=malloc(size); /*存放光标箭头图象*/getimage(4,4,16,16,rar); /*putimage(4,4,rar,XOR_PUT); /*消去光标箭头图象*/return 0;}/*按键函数*/int specialkey(void){int key;等待键盘输入*/while(bioskey(1)==0); /*key=bioskey(0); /*键盘输入*/只取特殊键的扫描值,其余为0*/ key=key&0xff? key&0xff:key>>8; /*return(key); /*返回键值*/}。
手把手教你MFC编程计算器.docx
STEP 1 (页面设计部分与控件添加部分)首先打开VC,选择MFC AppWizard[exe],设定好路径和工程名(这里我设置工程名为为“My')。
这里要注意的是在创建向导步骤1的时候,我们选择基本对话框”。
之后我们可以点击完成便看到以下界面此时我们把当前页面上原配的控件按 Delete 全部清除(如下图)口工悴(D Atit'U Sfi MLkd.工Sb 粗煙也 m®a )工冋(D 旨□世i 耳邑*Q0 H ■:・—!<<endl_*jMICUYOlg 巳 HN_CUCK£IJQ I K3置逛曲门圉m 中ui 血a' :Win3?PchugIp I ■+ 厚 MY cigs sesI V I I 14 P 4 II Fl I' ■ I I I)(| r :h 切丼斤胎耳i,吒它IT 丰習養看孔中咅滇專哗圖.>.沁 叱吟网/ \ *N|]粤|肄轉韓姑 I 曰 $ m 暮口r*ia;_ ?M \. I C sn v uGEKW (遞试l 在文律L 中暨復\在艾弊沖Ji 找二詁舉\佩曲吨皿/1 *JJ「]斑臥酚書0.0r 320x200接着我们按照 MFC 自带的控件选项进行我们本次计算器的控件添加(以下是控件)岂建辟①涌陽IT 弧扎⑴工程®狙連眠齐馬3二总© 稱勘⑩ _ SCMYI )I <] 【[悩| 日・理 mci!ilw 「T 「・CMVDI|t * FH ▼;□阖宙喰<<rndl・1 - 1 w0 tH n ©a II S(£] 13击注阖M&屯占ul 4 I , +| Win 議Dc^U. — 討 徐88爲:?旬曲[L4. ill JI ai ('a I ■■!■■ J B I L BI *ltadbdll ・li ・l ・・ii ・・ lltulijll列毎邂為湎口 口区宀枣圍陰C □日西我们在原先清空的界面中依次用上图控件画出一个基本的计算器页面(如下图)。
MFC实现计算器的源代码
DDX_Control(pDX, IDC_BUTTON2, m_button2);
// DDX_CBIndex(pDX, IDC_COMBO1, m_combo1);
// DDX_CBIndex(pDX, IDC_COMBO3, m_combo3);
char a[10];//定义字符数组
for (int i = 0; i < strData.GetLength(); i++)
{
a[i] = strData.GetAt(i);
}//将从窗口获取的数据放入数组中
double data;//定义一个double数据
data = atof(a);//将数组中CString转换为double
DDX_Control(pDX, IDC_COMBO4, m_combo4);
// DDX_Text(pDX, IDC_EDIT12, m_edit);
DDX_Text(pDX, IDC_EDIT12, m_edit12);
}
BEGIN_MESSAGE_MAP(Ctest2Dlg, CDialogEx)
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
//如果向对话框添加最小化按钮,则需要下面的代码
//来绘制该图标。对于使用文档/视图模型的MFC应用程序,
//这将由框架自动完成。
void Ctest2Dlg::OnPaint()
{
m_edit12="Yes";
MFC计算器代码
///D:/daima/calc/calcdlg.cpp// calcdlg.cpp : implementation file//// This is a part of the Microsoft Foundation Classes C++ library.// Copyright (C) 1992-1998 Microsoft Corporation// All rights reserved.//// This source code is only intended as a supplement to the// Microsoft Foundation Classes Reference and related// electronic documentation provided with the library.// See these sources for detailed information regarding the// Microsoft Foundation Classes product.#include "stdafx.h"#include "mfccalc.h"#include "calcdlg.h"#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE 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// Implementationprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //{{AFX_MSG(CAboutDlg)virtual BOOL OnInitDialog();//}}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()/////////////////////////////////////////////////////////////////////////////// CAboutDlg message handlersBOOL CAboutDlg::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization herereturn TRUE;}/////////////////////////////////////////////////////////////////////////////// CCalcDlg dialogIMPLEMENT_DYNCREATE(CCalcDlg, CDialog)BEGIN_DISPATCH_MAP(CCalcDlg, CDialog)//{{AFX_DISPA TCH_MAP(CCalcDlg)DISP_PROPERTY_EX(CCalcDlg, "Accum", GetAccum, SetAccum, VT_I4)DISP_PROPERTY_EX(CCalcDlg, "Operand", GetOperand, SetOperand, VT_I4)DISP_PROPERTY_EX(CCalcDlg, "Operation", GetOperation, SetOperation, VT_I2) DISP_PROPERTY_EX(CCalcDlg, "Visible", GetVisible, SetVisible, VT_BOOL) DISP_FUNCTION(CCalcDlg, "Evaluate", Evaluate, VT_BOOL, VTS_NONE)DISP_FUNCTION(CCalcDlg, "Clear", Clear, VT_EMPTY, VTS_NONE)DISP_FUNCTION(CCalcDlg, "Display", Display, VT_EMPTY, VTS_NONE)DISP_FUNCTION(CCalcDlg, "Close", Close, VT_EMPTY, VTS_NONE)DISP_FUNCTION(CCalcDlg, "Button", Button, VT_BOOL, VTS_BSTR)//}}AFX_DISPA TCH_MAPEND_DISPATCH_MAP()#ifndef IMPLEMENT_OLECREATE_SINGLE// MFC will provide this macro in the future. For now, we define it.#define IMPLEMENT_OLECREATE_SINGLE(class_name, external_name, \ l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \AFX_DATADEF COleObjectFactory class_name::factory(class_name::guid, \ RUNTIME_CLASS(class_name), TRUE, _T(external_name)); \ const AFX_DATADEF GUID class_name::guid = \{ l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } };#endif// {62C4DD10-F45E-11cd-8C3D-00AA004BB3B7}IMPLEMENT_OLECREATE_SINGLE(CCalcDlg, "mfccalc.calculator",0x62c4dd10, 0xf45e, 0x11cd, 0x8c, 0x3d, 0x0, 0xaa, 0x0, 0x4b, 0xb3, 0xb7); CCalcDlg::CCalcDlg(CWnd* pParent /*=NULL*/): CDialog(CCalcDlg::IDD, pParent){m_bAutoDelete = TRUE; // default to auto-deletem_dwRegister = 0; // not registered as active by default//{{AFX_DATA_INIT(CCalcDlg)// NOTE: the ClassWizard will add member initialization here//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);// Note that LoadAccelerator does not require DestroyAcceleratorTablem_hAccel = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDD));// clear the contents of the calculator and reset stateOnClickedClear();// enable this object for OLE automationEnableAutomation();}CCalcDlg::~CCalcDlg(){if (m_dwRegister != 0)RevokeActiveObject(m_dwRegister, NULL);}void CCalcDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CCalcDlg)// NOTE: the ClassWizard will add DDX and DDV calls here//}}AFX_DATA_MAP}/////////////////////////////////////////////////////////////////////////////// CCalcDlg implementationvoid CCalcDlg::PerformOperation(){if (m_errorState != ErrNone)return;if (m_bOperandAvail){if (m_operator == OpNone)m_accum = m_operand;else if (m_operator == OpMultiply)m_accum *= m_operand;else if (m_operator == OpDivide){if (m_operand == 0)m_errorState = ErrDivideByZero;elsem_accum /= m_operand;}else if (m_operator == OpAdd)m_accum += m_operand;else if (m_operator == OpSubtract)m_accum -= m_operand;}m_bOperandAvail = FALSE;UpdateDisplay();}void CCalcDlg::ClickedNumber(long l){if (m_errorState != ErrNone)return;if (!m_bOperandAvail)m_operand = 0L;SetOperand(m_operand*10+l);UpdateDisplay();}void CCalcDlg::UpdateDisplay(){if (GetSafeHwnd() == NULL)return;CString str;if (m_errorState != ErrNone)str.LoadString(IDS_ERROR);else{long lVal = (m_bOperandAvail) ? m_operand : m_accum;str.Format(_T("%ld"), lVal);}GetDlgItem(IDE_ACCUM)->SetWindowText(str);GetDlgItem(IDC_INVISIBLE_FOCUS)->SetFocus();}BEGIN_MESSAGE_MAP(CCalcDlg, CDialog)//{{AFX_MSG_MAP(CCalcDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_COMMAND_RANGE(IDB_0, IDB_9, OnClickedNumber) ON_BN_CLICKED(IDB_CLEAR, OnClickedClear)ON_BN_CLICKED(IDB_DIVIDE, OnClickedDivide)ON_BN_CLICKED(IDB_EQUAL, OnClickedEqual)ON_BN_CLICKED(IDB_MINUS, OnClickedMinus)ON_BN_CLICKED(IDB_PLUS, OnClickedPlus)ON_BN_CLICKED(IDB_TIMES, OnClickedTimes)ON_EN_SETFOCUS(IDE_ACCUM, OnSetFocusAccum)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCalcDlg message handlersBOOL CCalcDlg::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);CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}pSysMenu->RemoveMenu(SC_MAXIMIZE, MF_BYCOMMAND);pSysMenu->RemoveMenu(SC_SIZE, MF_BYCOMMAND);// want focus to stay on the dialog itself (until a button is clicked)SetFocus();return FALSE;}void CCalcDlg::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 CCalcDlg::OnPaint(){if (!IsIconic()){CDialog::OnPaint();return;}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);}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CCalcDlg::OnQueryDragIcon(){return (HCURSOR)m_hIcon;}void CCalcDlg::OnClickedNumber(UINT nID){ASSERT(nID >= IDB_0 && nID <= IDB_9);ClickedNumber(nID - IDB_0);}void CCalcDlg::OnClickedClear(){m_operator = OpNone;m_operand = 0L;m_accum = 0L;m_bOperandAvail = FALSE;m_errorState = ErrNone;UpdateDisplay();}void CCalcDlg::OnClickedDivide(){PerformOperation();m_operator = OpDivide;}void CCalcDlg::OnClickedEqual(){PerformOperation();m_operator = OpNone;}void CCalcDlg::OnClickedMinus(){PerformOperation();m_operator = OpSubtract;}void CCalcDlg::OnClickedPlus(){PerformOperation();m_operator = OpAdd;}void CCalcDlg::OnClickedTimes(){PerformOperation();m_operator = OpMultiply;}BOOL CCalcDlg::PreTranslateMessage(MSG* pMsg){if (m_hAccel != NULL && TranslateAccelerator(m_hWnd, m_hAccel, pMsg)) return TRUE;return CDialog::PreTranslateMessage(pMsg);}void CCalcDlg::PostNcDestroy(){if (m_bAutoDelete)delete this;}void CCalcDlg::OnCancel(){DestroyWindow();}void CCalcDlg::OnOK(){}void CCalcDlg::OnSetFocusAccum(){GetDlgItem(IDC_INVISIBLE_FOCUS)->SetFocus();}/////////////////////////////////////////////////////////////////////////////// CCalcDlg automationBOOL CCalcDlg::RegisterActive(){// attempt to register as the active object for the CCalcDlg CLSID return RegisterActiveObject(GetInterface(&IID_IUnknown), CCalcDlg::guid, NULL, &m_dwRegister) == NOERROR; }long CCalcDlg::GetAccum(){return m_accum;}void CCalcDlg::SetAccum(long nNewValue){m_accum = nNewValue;}long CCalcDlg::GetOperand(){return m_operand;}void CCalcDlg::SetOperand(long nNewValue){m_operand = nNewValue;m_bOperandAvail = TRUE;}short CCalcDlg::GetOperation(){return m_operator;}void CCalcDlg::SetOperation(short nNewValue){m_operator = (Operator)nNewValue;}BOOL CCalcDlg::GetVisible(){return m_hWnd != NULL && (GetStyle() & WS_VISIBLE) != 0; }void CCalcDlg::SetVisible(BOOL bNewValue){if (bNewValue == GetVisible())return;if (bNewValue){// create it if necessaryif (m_hWnd == NULL && !Create(CCalcDlg::IDD)) return;// set up as the active window for the applicationif (AfxGetThread()->m_pMainWnd == NULL)AfxGetThread()->m_pMainWnd = this;// show itShowWindow(SW_SHOWNORMAL);}else{if (m_hWnd != NULL)ShowWindow(SW_HIDE);}}BOOL CCalcDlg::Evaluate(){OnClickedEqual();return m_errorState == ErrNone;}void CCalcDlg::Clear(){OnClickedClear();}void CCalcDlg::Display(){UpdateDisplay();}void CCalcDlg::Close(){if (m_hWnd == NULL){AfxPostQuitMessage(0);return;}BOOL bAutoDelete = m_bAutoDelete;m_bAutoDelete = FALSE;DestroyWindow();m_bAutoDelete = bAutoDelete;}BOOL CCalcDlg::Button(LPCTSTR szButton){switch (szButton[0]){case 'c':case 'C':OnClickedClear();break;case '/':OnClickedDivide();break;case '+':OnClickedPlus();break;case '-':OnClickedMinus();break;case '*':OnClickedTimes();break;case '=':OnClickedEqual();break;default:if (szButton[0] >= '0' && szButton[0] <= '9')ClickedNumber(szButton[0] - '0');elsereturn FALSE;break;}return TRUE;}///D:/daima/calc/calcdlg.h// calcdlg.h : header file//// This is a part of the Microsoft Foundation Classes C++ library.// Copyright (C) 1992-1998 Microsoft Corporation// All rights reserved.//// This source code is only intended as a supplement to the// Microsoft Foundation Classes Reference and related// electronic documentation provided with the library.// See these sources for detailed information regarding the// Microsoft Foundation Classes product./////////////////////////////////////////////////////////////////////////////// CCalcDlg dialogenum Operator { OpNone, OpAdd, OpSubtract, OpMultiply, OpDivide }; enum CalcError { ErrNone, ErrDivideByZero };class CCalcDlg : public CDialog{// Constructionpublic:CCalcDlg(CWnd* pParent = NULL); // standard constructor// OperationsBOOL RegisterActive();// Dialog Data//{{AFX_DATA(CCalcDlg)enum { IDD = IDD_MFCCALC_DIALOG };// NOTE: the ClassWizard will add data members here//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CCalcDlg)public:virtual BOOL PreTranslateMessage(MSG* pMsg);protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support virtual void PostNcDestroy();//}}AFX_VIRTUAL// Implementationprotected:virtual ~CCalcDlg();HICON m_hIcon;HACCEL m_hAccel;BOOL m_bAutoDelete; // delete in PostNcDestroyDWORD m_dwRegister; // active registration magic cookie// calculator statelong m_accum;long m_operand;Operator m_operator;CalcError m_errorState;BOOL m_bOperandAvail;// helper functionsvoid PerformOperation();void ClickedNumber(long lNum);void UpdateDisplay();public:// Generated message map functions//{{AFX_MSG(CCalcDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnClickedNumber(UINT nID);afx_msg void OnClickedClear();afx_msg void OnClickedDivide();afx_msg void OnClickedEqual();afx_msg void OnClickedMinus();afx_msg void OnClickedPlus();afx_msg void OnClickedTimes();virtual void OnCancel();virtual void OnOK();afx_msg void OnSetFocusAccum();//}}AFX_MSGDECLARE_MESSAGE_MAP()// to be OLE creatable, it must be DYNCREATE and OLECREATE DECLARE_DYNCREATE(CCalcDlg)DECLARE_OLECREA TE(CCalcDlg)public:// Generated OLE dispatch map functions//{{AFX_DISPA TCH(CCalcDlg)afx_msg long GetAccum();afx_msg void SetAccum(long nNewValue);afx_msg long GetOperand();afx_msg void SetOperand(long nNewValue);afx_msg short GetOperation();afx_msg void SetOperation(short nNewValue);afx_msg BOOL GetVisible();afx_msg void SetVisible(BOOL bNewValue);afx_msg BOOL Evaluate();afx_msg void Clear();afx_msg void Display();afx_msg void Close();afx_msg BOOL Button(LPCTSTR szButton);//}}AFX_DISPA TCHDECLARE_DISPATCH_MAP()};///D:/daima/calc/mfccalc.cpp// mfccalc.cpp : Defines the class behaviors for the application.//// This is a part of the Microsoft Foundation Classes C++ library.// Copyright (C) 1992-1998 Microsoft Corporation// All rights reserved.//// This source code is only intended as a supplement to the// Microsoft Foundation Classes Reference and related// electronic documentation provided with the library.// See these sources for detailed information regarding the// Microsoft Foundation Classes product.#include "stdafx.h"#include "mfccalc.h"#include "calcdlg.h"#ifdef _DEBUG#undef THIS_FILEstatic char BASED_CODE THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CCalcAppBEGIN_MESSAGE_MAP(CCalcApp, CWinApp)//{{AFX_MSG_MAP(CCalcApp)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSGON_COMMAND(ID_HELP, CWinApp::OnHelp)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCalcApp constructionCCalcApp::CCalcApp(){// TODO: add construction code here,// Place all significant initialization in InitInstance}/////////////////////////////////////////////////////////////////////////////// The one and only CCalcApp objectCCalcApp theApp;/////////////////////////////////////////////////////////////////////////////// CCalcApp initializationBOOL CCalcApp::InitInstance(){// Standard initialization// If you are not using these features and wish to reduce the size// of your final executable, you should remove from the following// the specific initialization routines you do not need.Enable3dControls();// Initialize OLE 2.0 librariesif (!AfxOleInit()){AfxMessageBox(IDP_OLE_INIT_FAILED);return FALSE;}// Parse the command line to see if launched as OLE serverif (RunEmbedded() || RunAutomated()){// Register all OLE server (factories) as running. This enables the// OLE 2.0 libraries to create objects from other applications.COleTemplateServer::RegisterAll();// Do not continue with rest of initialization. Wait for// client to create a CCalcDlg object instead.return TRUE;}// When a server application is launched stand-alone, it is a good idea // to update the system registry in case it has been damaged.COleObjectFactory::UpdateRegistryAll();// create a modeless dialog as the main window of the applicationCCalcDlg* pDlg = new CCalcDlg;pDlg->SetVisible(TRUE);if (!pDlg->GetVisible()){AfxMessageBox(IDP_UNABLE_TO_SHOW_CALC);return FALSE;}pDlg->RegisterActive();// We are using a modeless dialog so we can translate accelerator keys // against the dialog. In order to run the main message pump,// InitInstance must return TRUE even though this application is// a dialog-based application.return TRUE;}///D:/daima/calc/mfccalc.h// mfccalc.h : main header file for the MFCCALC application//// This is a part of the Microsoft Foundation Classes C++ library.// Copyright (C) 1992-1998 Microsoft Corporation// All rights reserved.//// This source code is only intended as a supplement to the// Microsoft Foundation Classes Reference and related// electronic documentation provided with the library.// See these sources for detailed information regarding the// Microsoft Foundation Classes product.#ifndef __AFXWIN_H__#error include 'stdafx.h' before including this file for PCH#endif#include "resource.h" // main symbols/////////////////////////////////////////////////////////////////////////////// CCalcApp:// See mfccalc.cpp for the implementation of this class//class CCalcApp : public CWinApp{public:CCalcApp();// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CCalcApp)public:virtual BOOL InitInstance();//}}AFX_VIRTUAL// Implementation//{{AFX_MSG(CCalcApp)// NOTE - the ClassWizard will add and remove member functions here.// DO NOT EDIT what you see in these blocks of generated code !//}}AFX_MSGDECLARE_MESSAGE_MAP()};////////////////////////////////////////////////////////////////////////////////D:/daima/calc/mfccalc.odl// mfccalc.odl : type library source for mfccalc.exe// This file will be processed by the Make Type Library (mktyplib) tool to// produce the type library (mfccalc.tlb).[ uuid(5627AF00-F44C-11CD-8C3D-00AA004BB3B7), version(1.0) ]library mfccalc{importlib("stdole32.tlb");// Primary dispatch interface for CCalcDlg[ uuid(990BA900-F45E-11cd-8C3D-00AA004BB3B7) ]dispinterface ICalcDlg{properties:// NOTE - ClassWizard will maintain property information here.// Use extreme caution when editing this section.//{{AFX_ODL_PROP(CCalcDlg)[id(1)] long Accum;[id(2)] long Operand;[id(3)] short Operation;[id(4)] boolean Visible;//}}AFX_ODL_PROPmethods:// NOTE - ClassWizard will maintain method information here.// Use extreme caution when editing this section.//{{AFX_ODL_METHOD(CCalcDlg)[id(5)] boolean Evaluate();[id(6)] void Clear();[id(7)] void Display();[id(8)] void Close();[id(9)] boolean Button(BSTR szButton);//}}AFX_ODL_METHOD};// Class information for CCCalcDlg[ uuid(62C4DD10-F45E-11cd-8C3D-00AA004BB3B7) ]coclass CCCalcDlg{[default] dispinterface ICalcDlg;};//{{AFX_APPEND_ODL}}};///D:/daima/calc/mfccalc.rc//Microsoft Developer Studio generated resource script.//#include "resource.h"#define APSTUDIO_READONL Y_SYMBOLS///////////////////////////////////////////////////////////////////////////////// Generated from the TEXTINCLUDE 2 resource.//#include "afxres.h"/////////////////////////////////////////////////////////////////////////////#undef APSTUDIO_READONL Y_SYMBOLS/////////////////////////////////////////////////////////////////////////////// English (U.S.) resources#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)#ifdef _WIN32LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US#pragma code_page(1252)#endif //_WIN32#ifdef APSTUDIO_INVOKED///////////////////////////////////////////////////////////////////////////////// TEXTINCLUDE//1 TEXTINCLUDE DISCARDABLEBEGIN"resource.h\0"END2 TEXTINCLUDE DISCARDABLEBEGIN"#include ""afxres.h""\r\n""\0"END3 TEXTINCLUDE DISCARDABLEBEGIN"#include ""res\\mfccalc.rc2"" // non-Microsoft Visual C++ edited resources\r\n""\r\n""#define _AFX_NO_SPLITTER_RESOURCES\r\n""#define _AFX_NO_OLE_RESOURCES\r\n""#define _AFX_NO_TRACKER_RESOURCES\r\n""#define _AFX_NO_PROPERTY_RESOURCES\r\n""#include ""afxres.rc"" // Standard components\r\n""\0"END#endif // APSTUDIO_INVOKED///////////////////////////////////////////////////////////////////////////////// Icon//IDR_MAINFRAME ICON DISCARDABLE "res\\mfccalc.ico" ///////////////////////////////////////////////////////////////////////////////// Dialog//IDD_ABOUTBOX DIALOG DISCARDABLE 34, 22, 217, 55STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About mfccalc"FONT 8, "MS Sans Serif"BEGINICON IDR_MAINFRAME,IDC_STA TIC,11,17,18,20LTEXT "MFC/OLE Calc Version 1.0",IDC_STA TIC,40,10,119,8LTEXT "Copyright ?1994 - 1998 Microsoft Corporation",IDC_STATIC,40,25,167,8DEFPUSHBUTTON "OK",IDOK,176,6,32,14,WS_GROUPLTEXT "All Rights Reserved",IDC_STA TIC,40,36,148,8ENDIDD_MFCCALC_DIALOG DIALOG DISCARDABLE 1, 1, 93, 114STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU CAPTION "MFC OLE Calc"FONT 8, "MS Sans Serif"BEGINPUSHBUTTON "0",IDB_0,9,90,15,15,NOT WS_TABSTOPPUSHBUTTON "1",IDB_1,9,70,15,15,NOT WS_TABSTOPPUSHBUTTON "2",IDB_2,29,70,15,15,NOT WS_TABSTOPPUSHBUTTON "3",IDB_3,49,70,15,15,NOT WS_TABSTOPPUSHBUTTON "4",IDB_4,9,50,15,15,NOT WS_TABSTOPPUSHBUTTON "5",IDB_5,29,50,15,15,NOT WS_TABSTOPPUSHBUTTON "6",IDB_6,49,50,15,15,NOT WS_TABSTOPPUSHBUTTON "7",IDB_7,9,30,15,15,NOT WS_TABSTOPPUSHBUTTON "8",IDB_8,29,30,15,15,NOT WS_TABSTOPPUSHBUTTON "9",IDB_9,49,30,15,15,NOT WS_TABSTOPPUSHBUTTON "=",IDB_EQUAL,49,90,15,15,NOT WS_TABSTOPPUSHBUTTON "+",IDB_PLUS,69,30,15,15,NOT WS_TABSTOPPUSHBUTTON "-",IDB_MINUS,69,50,15,15,NOT WS_TABSTOPPUSHBUTTON "*",IDB_TIMES,69,70,15,15,NOT WS_TABSTOPPUSHBUTTON "/",IDB_DIVIDE,69,90,15,15,NOT WS_TABSTOPPUSHBUTTON "C",IDB_CLEAR,29,90,15,15,NOT WS_TABSTOPEDITTEXT IDE_ACCUM,8,6,76,15,ES_RIGHT | ES_MULTILINE |ES_AUTOHSCROLL | ES_READONL Y | NOT WS_TABSTOP LTEXT "",IDC_INVISIBLE_FOCUS,8,106,77,8,WS_TABSTOPEND///////////////////////////////////////////////////////////////////////////////// Version//VS_VERSION_INFO VERSIONINFOFILEVERSION 1,0,0,1PRODUCTVERSION 1,0,0,1FILEFLAGSMASK 0x3fL#ifdef _DEBUGFILEFLAGS 0x1L#elseFILEFLAGS 0x0L#endifFILEOS 0x4LFILETYPE 0x1LFILESUBTYPE 0x0LBEGINBLOCK "StringFileInfo"BEGINBLOCK "040904b0"BEGINV ALUE "CompanyName", "\0"V ALUE "FileDescription", "MFCCALC MFC Application\0"V ALUE "FileVersion", "1, 0, 0, 1\0"V ALUE "InternalName", "MFCCALC\0"V ALUE "LegalCopyright", "Copyright ?1994 - 1998\0"V ALUE "OriginalFilename", "MFCCALC.EXE\0"V ALUE "ProductName", "MFCCALC Application\0"V ALUE "ProductV ersion", "1, 0, 0, 1\0"ENDENDBLOCK "VarFileInfo"BEGINV ALUE "Translation", 0x409, 1200ENDEND///////////////////////////////////////////////////////////////////////////////// Accelerator//IDD_MFCCALC_DIALOG ACCELERATORS DISCARDABLEBEGIN"*", IDB_TIMES, ASCII, NOINVERT"+", IDB_PLUS, ASCII, NOINVERT"-", IDB_MINUS, ASCII, NOINVERT"/", IDB_DIVIDE, ASCII, NOINVERT"0", IDB_0, ASCII, NOINVERT"1", IDB_1, ASCII, NOINVERT"2", IDB_2, ASCII, NOINVERT"3", IDB_3, ASCII, NOINVERT"4", IDB_4, ASCII, NOINVERT"5", IDB_5, ASCII, NOINVERT"6", IDB_6, ASCII, NOINVERT"7", IDB_7, ASCII, NOINVERT"8", IDB_8, ASCII, NOINVERT"9", IDB_9, ASCII, NOINVERT"=", IDB_EQUAL, ASCII, NOINVERT"C", IDB_CLEAR, ASCII, NOINVERTVK_LEFT, ID_NOTHING, VIRTKEY, NOINVERT VK_RIGHT, ID_NOTHING, VIRTKEY, NOINVERT VK_UP, ID_NOTHING, VIRTKEY, NOINVERT VK_DOWN, ID_NOTHING, VIRTKEY, NOINVERT VK_RETURN, IDB_EQUAL, VIRTKEY, NOINVERT "c", IDB_CLEAR, ASCII, NOINVERTEND///////////////////////////////////////////////////////////////////////////////// String Table//STRINGTABLE DISCARDABLEBEGINID_INDICATOR_EXT "EXT"ID_INDICATOR_CAPS "CAP"ID_INDICATOR_NUM "NUM"ID_INDICATOR_SCRL "SCRL"ID_INDICATOR_OVR "OVR"ID_INDICATOR_REC "REC"ENDSTRINGTABLE DISCARDABLEBEGINIDP_OLE_INIT_FAILED "Failed to initialized the OLE libraries!"IDS_ABOUTBOX "&About MFC/OLE Calc..."IDS_ERROR "ERROR!"IDP_UNABLE_TO_SHOW_CALC "Unable to create and show the calculator window!" ENDSTRINGTABLE DISCARDABLEBEGINAFX_IDS_APP_TITLE "MFC/OLE Calc"END#endif // English (U.S.) resources/////////////////////////////////////////////////////////////////////////////#ifndef APSTUDIO_INVOKED///////////////////////////////////////////////////////////////////////////////// Generated from the TEXTINCLUDE 3 resource.//#include "res\mfccalc.rc2" // non-Microsoft Visual C++ edited resources#define _AFX_NO_SPLITTER_RESOURCES#define _AFX_NO_OLE_RESOURCES#define _AFX_NO_TRACKER_RESOURCES#define _AFX_NO_PROPERTY_RESOURCES#include "afxres.rc" // Standard components/////////////////////////////////////////////////////////////////////////////#endif // not APSTUDIO_INVOKED///D:/daima/calc/mfccalc.regREGEDIT; This .REG file may be used by your SETUP program.。
VC++_mfc编计算器+源代码
实用标准文档用C++编写计算器程序搞要本课程设计是在基于对话框的应用程序中模拟一个计算器,本计算器可以进行十进制下的四则运算(加、减、乘、除)和四则混合运算,可以把十进制转化为二进制或十六进制,可以进行一些常用的函数运算(比如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++语法非常灵活。
其优点是给用户编程带来书写上的方便。
其缺点是由于编译时对语法限制比较宽松,许多逻辑上的错误不容易发现,给用户编程增加了难度。
1.2计算器的介绍(1)在运行程序后,系统会弹出一个基于对话框的计算器界面,如下图所示:图1.1 计算器界面(2)在计算器程序中,主要通过一个编辑框来获取表达式和显示计算结果,表达式可以通过键盘和单击按钮2种方式输入,输入后的结果如下图所示:图1.2 输入表达式后的界面(3)在输入完表达式后,单击“=”后,开始对表达式进行计算,计算完成后,在编辑框中显示计算的结果。
visual 2015 mfc 计算器 代码
以下是一个简单的 Visual Studio 2015 MFC 计算器的示例代码。
它包括两个窗口,一个用于输入和显示数字,另一个用于显示结果。
```cpp// MainFrm.cpp : implementation of the CMainFrame class //#include "pch.h"#include "framework.h"#include "Calculator.h"#include "MainFrm.h"#include "afxdialogex.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// CMainFrameIMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)ON_WM_CREATE()ON_WM_DESTROY()ON_COMMAND(ID_APP_ABOUT,&CMainFrame::OnAppAbout)ON_COMMAND(ID_FILE_NEW, &CMainFrame::OnFileNew) ON_COMMAND(ID_FILE_EXIT, &CMainFrame::OnFileExit) ON_COMMAND(ID_EDIT_CLEAR,&CMainFrame::OnEditClear)ON_COMMAND(ID_EDIT_COPY,&CMainFrame::OnEditCopy)ON_COMMAND(ID_EDIT_PASTE,&CMainFrame::OnEditPaste)ON_COMMAND(ID_VIEW_SPLIT,&CMainFrame::OnViewSplit)ON_COMMAND(ID_VIEW_FULL,&CMainFrame::OnViewFull)ON_UPDATE_COMMAND_UI(ID_EDIT_CLEAR,&CMainFrame::OnUpdateEditClear)ON_UPDATE_COMMAND_UI(ID_EDIT_COPY,&CMainFrame::OnUpdateEditCopy)ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE,&CMainFrame::OnUpdateEditPaste)END_MESSAGE_MAP()static UINT indicators[] ={ID_SEPARATOR, // status line indicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,};CMainFrame::CMainFrame() : CFrameWndEx(){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}CMainFrame::~CMainFrame(){}int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)return -1;// Create a view to host the client window. This object will be responsible for drawing the client area.// Set initial host view properties.CView* pView = new CView;if (!pView)return -1;pView->Create(_T("Calculator"), WS_CHILD | WS_VISIBLE | WS_BORDER | 500, CRect(0, 0, 200, 200), this);m_viewList.AddTail(pView);// m_pActiveView = pView;// m_bIsSplitterBar = TRUE;// m_bIsHorzSplit = TRUE;// m_bIsVerSplit = FALSE;// m_bIsDocTemplate = TRUE;// Create a toolbar control and initialize it.CToolBarCtrl mtbBarCtrl;// Create a command bar control and initialize it.CCommandBarCtrl commandBarCtrl; // Create a status bar control and initialize it. // Create a menu control and initialize it. CMenu menuBar;menuBar.CreateMenu();menuBar.AppendMenu(MF_POPUP, IDM_FILE, _T("&File"));menuBar.AppendMenu(MF_POPUP, IDM_EDIT, _T("&Edit")); menuBar.AppendMenu(MF_POPUP,IDM_VIEW, _T("&View")); menuBar.AppendMenu(MF_POPUP, IDM_INSERT, _T("&Insert")); menuBar.AppendMenu(MF_POPUP, IDM_FORMAT, _T("&Format")); menuBar.AppendMenu。
用c语言编写的计算器源代码
作品:科学计算器作者:欧宗龙编写环境:vc++6.0语言:c#include"stdafx.h"#include<stdio.h>#include<windows.h>#include<windowsx.h>#include"resource.h"#include"MainDlg.h"#include<math.h>#include<string.h>#definePI3.141593BOOLA_Op=FALSE;BOOLWINAPIMain_Proc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam) {switch(uMsg){HANDLE_MSG(hWnd,WM_INITDIALOG,Main_OnInitDialog);HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);HANDLE_MSG(hWnd,WM_CLOSE,Main_OnClose);}returnFALSE;}BOOLMain_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam){returnTRUE;}voidTrimNumber(chara[])//判断并删除小数点后无用的零{for(unsignedi=0;i<strlen(a);i++){if(a[i]=='.'){for(unsignedj=strlen(a)-1;j>=i;j--){if(a[j]=='0'){a[j]='\0';}elseif(a[j]=='.'){a[j]='\0';}elsebreak;}}}}doubleOperate(charOperator,doublen1,doublen2)//判断符号,进行相应的运算{if(Operator=='0'){}if(Operator=='+'){n2+=n1;}if(Operator=='-'){n2=n1-n2;}if(Operator=='*'){n2*=n1;}if(Operator=='/'){n2=n1/n2;}if(Operator=='^'){n2=pow(n1,n2);}return n2;}////////////////////////////////////////////////voidIntBinary(chara[],intn){if(n>1)IntBinary(a,n/2);sprintf(a,"%s%i",a,n%2);}voiddecimal(chara[],doublem){if(m>0.000001){m=m*2;sprintf(a,"%s%d",a,(long)m);decimal(a,m-(long)m);}}voidBinary(chara[],doubleNum){charDecP[256]="";doublex,y;double*iptr=&y;x=modf(Num,iptr);decimal(DecP,x);IntBinary(a,(int)y);strcat(a,".");strcat(a,DecP);}////////////////////////////////////voidMain_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify) {staticDELTIMES=0;staticcharstr[256];staticcharOperator='0';staticdoubleRNum[3];switch(id){caseIDC_BUTTONN1://数字1{if(A_Op){SetDlgItemText(hwnd,IDC_EDIT,NULL);}GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));strcat(str,"1");SetDlgItemText(hwnd,IDC_EDIT,str);RNum[1]=atof(str);A_Op=FALSE;}break;caseIDC_BUTTONN2://数字2{if(A_Op){SetDlgItemText(hwnd,IDC_EDIT,NULL);}GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));strcat(str,"2");SetDlgItemText(hwnd,IDC_EDIT,str);RNum[1]=atof(str);A_Op=FALSE;}break;caseIDC_BUTTONN3://数字3{if(A_Op){SetDlgItemText(hwnd,IDC_EDIT,NULL);}GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));strcat(str,"3");SetDlgItemText(hwnd,IDC_EDIT,str);RNum[1]=atof(str);A_Op=FALSE;}break;caseIDC_BUTTONN4://数字4{if(A_Op){SetDlgItemText(hwnd,IDC_EDIT,NULL);}GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));strcat(str,"4");SetDlgItemText(hwnd,IDC_EDIT,str);RNum[1]=atof(str);A_Op=FALSE;}break;caseIDC_BUTTONN5://数字5{if(A_Op){SetDlgItemText(hwnd,IDC_EDIT,NULL);}GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));strcat(str,"5");SetDlgItemText(hwnd,IDC_EDIT,str);RNum[1]=atof(str);A_Op=FALSE;}break;caseIDC_BUTTONN6://数字6{if(A_Op){SetDlgItemText(hwnd,IDC_EDIT,NULL);}GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));strcat(str,"6");SetDlgItemText(hwnd,IDC_EDIT,str);RNum[1]=atof(str);A_Op=FALSE;}break;caseIDC_BUTTONN7://数字7{if(A_Op){SetDlgItemText(hwnd,IDC_EDIT,NULL);}GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));strcat(str,"7");SetDlgItemText(hwnd,IDC_EDIT,str);RNum[1]=atof(str);A_Op=FALSE;}break;caseIDC_BUTTONN8://数字8{if(A_Op){SetDlgItemText(hwnd,IDC_EDIT,NULL);}GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));strcat(str,"8");SetDlgItemText(hwnd,IDC_EDIT,str);RNum[1]=atof(str);A_Op=FALSE;}break;caseIDC_BUTTONN9://数字9{if(A_Op){SetDlgItemText(hwnd,IDC_EDIT,NULL);}GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));strcat(str,"9");SetDlgItemText(hwnd,IDC_EDIT,str);RNum[1]=atof(str);A_Op=FALSE;}break;caseIDC_BUTTONN0://数字0{if(A_Op){SetDlgItemText(hwnd,IDC_EDIT,NULL);}GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));strcat(str,"0");SetDlgItemText(hwnd,IDC_EDIT,str);RNum[1]=atof(str);A_Op=FALSE;}break;case{if(A_Op){SetDlgItemText(hwnd,IDC_EDIT,NULL);}GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));if(DELTIMES==0){strcat(str,".");}DELTIMES++;SetDlgItemText(hwnd,IDC_EDIT,str);A_Op=FALSE;}break;caseIDC_BUTTONADD://加法运算{RNum[1]=atof(str);RNum[0]=RNum[1];RNum[1]=RNum[2];RNum[2]=Operate(Operator,RNum[1],RNum[0]);sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);Operator='+';DELTIMES=0;A_Op=TRUE;}break;caseIDC_BUTTONSUB://减法运算{RNum[1]=atof(str);RNum[0]=RNum[1];RNum[1]=RNum[2];RNum[2]=Operate(Operator,RNum[1],RNum[0]);sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);DELTIMES=0;A_Op=TRUE;Operator='-';}break;caseIDC_BUTTONMUL://乘法运算{RNum[1]=atof(str);RNum[0]=RNum[1];RNum[1]=RNum[2];RNum[2]=Operate(Operator,RNum[1],RNum[0]);sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);Operator='*';DELTIMES=0;A_Op=TRUE;}break;caseIDC_BUTTONDIV://除法运算{RNum[1]=atof(str);RNum[0]=RNum[1];RNum[1]=RNum[2];RNum[2]=Operate(Operator,RNum[1],RNum[0]);sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);Operator='/';DELTIMES=0;A_Op=TRUE;}break;case{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));RNum[1]=atof(str);RNum[0]=RNum[1];RNum[1]=RNum[2];RNum[2]=Operate(Operator,RNum[1],RNum[0]);sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);Operator='^';DELTIMES=0;}break;caseIDC_BUTTONPI://圆周率PI,弧度{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));if(atof(str)!=0){RNum[2]=atof(str)*PI;sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);}else{sprintf(str,"%f",PI);SetDlgItemText(hwnd,IDC_EDIT,str);}A_Op=TRUE;}break;caseIDC_BUTTONSQRT://开根号{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));RNum[2]=sqrt(atof(str));sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);A_Op=TRUE;}break;caseIDC_BUTTONSIN://三角函数sin函数{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));RNum[2]=sin(atof(str));sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);A_Op=TRUE;}break;case{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));RNum[2]=cos(atof(str));sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);A_Op=TRUE;}break;case{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));RNum[2]=tan(atof(str));sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);A_Op=TRUE;}break;caseIDC_BUTTONSQ://平方{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));RNum[2]=atof(str)*atof(str);sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);A_Op=TRUE;}break;case{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));RNum[2]=atof(str)*atof(str)*atof(str);sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);A_Op=TRUE;}break;case{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));RNum[2]=exp(atof(str));sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);A_Op=TRUE;}break;case{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));RNum[2]=pow(10,atof(str));sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);A_Op=TRUE;}break;caseIDC_BUTTONLN://lnx{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));RNum[2]=log(atof(str));sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);A_Op=TRUE;}break;caseIDC_BUTTONLOG10://log10{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));RNum[2]=log10(atof(str));sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);A_Op=TRUE;}break;caseIDC_BUTTONBINARY://十进制转换为二进制{chara[256]="";GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));RNum[2]=atof(str);Binary(a,RNum[2]);strcpy(str,a);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);A_Op=TRUE;}break;case{DELTIMES=0;Operator='0';RNum[0]=RNum[1]=RNum[2]=0;memset(str,0,sizeof(str));SetDlgItemText(hwnd,IDC_EDIT,NULL);A_Op=FALSE;}break;case{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));inti=strlen(str);str[i-1]='\0';SetDlgItemText(hwnd,IDC_EDIT,str);}break;case{GetDlgItemText(hwnd,IDC_EDIT,str,sizeof(str));RNum[1]=atof(str);RNum[0]=RNum[1];RNum[1]=RNum[2];RNum[2]=Operate(Operator,RNum[1],RNum[0]);sprintf(str,"%f",RNum[2]);TrimNumber(str);SetDlgItemText(hwnd,IDC_EDIT,str);Operator='0';DELTIMES=0;}break;default:break;}}voidMain_OnClose(HWNDhwnd){EndDialog(hwnd,0);}本人拙作,如有不足之处请谅解。
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 }。
C编写简易计算器附源代码超详细
超详细一、因为计算器设计的控件太多,不便使用控制台应用程序完成,所以这里使用Windows窗体应用程序,并命名为Calc,如下图所示:二、向窗体中拖入需要的控件,如下图所示:(完成效果图)结果显示区(作者博客左边的文本框)是TextBox控件,并修改其name为txtShow ,按键0~9为Button控件,并将其name分别修改为btn_0、btn_1、btn_2、btn_3、btn_4、btn_5、btn_6、btn_7、btn_8、btn_9;按键【负数】的name值修改为btn_sign,按键【.】的name 修改为btn_dot,按键【+ - * /】的name值分别修改为btn_add、btn_sub、btn_mul、btn_div,按键【=】的name值修改为btn_equ,按键【倒数】的name值修改为btn_rev,按键【平方】的name值修改为btn_sqr,按键【开方】的name值修改为btn_sqrt。
右边的计算器图片空间是PictureBox,作者博客控件是LinkLabel,可以不添加,以上所有控件均可按照需求添加,只保留自己需要的按钮控件和textbox控件即可。
三、代码部分(含解释),采用switch多分支语句编写using System;using System.Drawing;using System.Collections;using ponentModel;using ;using System.Data;namespace Calc{///<summary>/// QQ:6 温柔一刀C#简易计算器的实现///</summary>public class CalcForm :{private btn_0;private btn_1;private btn_2;private btn_3;private btn_4;private btn_5;private btn_6;private btn_7;private btn_8;private btn_9;private btn_add;private btn_sub;private btn_mul;private btn_div;private btn_sqrt;private btn_sign;private btn_equ;private btn_dot;private btn_rev;private txtShow;private btn_sqr;private PictureBox pictureBox1;private LinkLabel linkLabel1;///<summary>///必需的设计器变量。
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){//将前一次数据与当前数据进行运算,作为下次的第一操作数,并在编辑框显示。
C语言计算器源代码
C++语言编写;; include<iostream>include<cmath>include<string>using namespace std;const double pi = 3.;const double e = ;const int SIZE = 1000; typedef struct node{i++;ge = 0;biao_dian = 1;}iflinei == 'P'{shu++p = pi;i++;break;}iflinei == 'E'{shu++p = e;i++;break;}ifflag1{h = h 10 + linei - '0';flag = 1;i++;ifbiao_diange++;}elsebreak;}ifflag{ifbiao_dian{int r = 1;forint k = 1; k <= ge; k++r = 10;h /= r;}shu++p = h; + ^乘方 Foff Enter= "<<endl; cout<<"对于对数输入 L2_5 表示以2为底5的对数"<<endl;cout<<"M在前面结果的基础上继续计算,如:上次结果为10,现输入+2"<<endl;cout<<"D清零并继续输入"<<endl;cout<<"F计算机关闭"<<endl;cout<<"输入 P 就代表输入圆周率, 输入 E 代表输入自然对数"<<endl<<endl; }void print{system"color 2";cout<<" 欢迎使用本计算器"<<endl;cout<<"输入一个字符串 on, 计算器开始启动"<<endl;}void if_start//是否启动计算器{string start;print;whilecin>>start{ifstart = "on"{cout<<"您所输入的字符无效, 请按照介绍的继续输入:"<<endl;continue;}elsebreak;}ifstart == "on"{system"color 5";//颜色的处理system"cls";//刷屏}introduce;//对计算器的简要介绍cout<<"现在,请输入您所要计算的表达式"<<endl;input;//输入所要计算的表达式}int main{if_start;//调用是否启动计算器函数return 0;}。
vc6.0中用MFC编写计算器代码
// CKcalculateDlg.cpp : implementation file//#include "stdafx.h"#include "math.h"#include "CKcalculate.h"#include "CKcalculateDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif// double m_first; //存储一次运算的第一个操作数及一次运算的结果// double m_second; //存储一次运算的第二个操作数// CString m_operator; //存储运算符// double m_coff; //存储小数点的系数权值/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App About/////////////////////////////////////////////////////////////////////////////class 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()/////////////////////////////////////////////////////////////////////////////// CCKcalculateDlg dialogCCKcalculateDlg::CCKcalculateDlg(CWnd* pParent /*=NULL*/) : CDialog(CCKcalculateDlg::IDD, pParent){// void UpdateDisplay(double);// void Calculate(void);//{{AFX_DATA_INIT(CCKcalculateDlg)/////////////////////////////////////////////////////////////////////////////////////////////////// //isXdeY=false;m_display = _T("");m_PI=3.14159265358979323846;m_first=0.0;m_second=0.0;m_operator=_T("+");m_coff=0;m_display=_T("0.0");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CCKcalculateDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CCKcalculateDlg)DDX_Text(pDX, IDC_DISPLAY, m_display);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CCKcalculateDlg, CDialog)//{{AFX_MSG_MAP(CCKcalculateDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON0, OnButton0)ON_BN_CLICKED(IDC_BUTTON1, OnButton1)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)ON_BN_CLICKED(IDC_BUTTON3, OnButton3)ON_BN_CLICKED(IDC_BUTTON4, OnButton4)ON_BN_CLICKED(IDC_BUTTON5, OnButton5)ON_BN_CLICKED(IDC_BUTTON6, OnButton6)ON_BN_CLICKED(IDC_BUTTON7, OnButton7)ON_BN_CLICKED(IDC_BUTTON8, OnButton8)ON_BN_CLICKED(IDC_BUTTON9, OnButton9)ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd)ON_BN_CLICKED(IDC_BUTTON_MINUS, OnButtonMinus)ON_BN_CLICKED(IDC_BUTTON_MUTIPL Y, OnButtonMutiply) ON_BN_CLICKED(IDC_BUTTON_DIV, OnButtonDiv)ON_BN_CLICKED(IDC_BUTTON_SIGH, OnButtonSigh)ON_BN_CLICKED(IDC_BUTTON_POINT, OnButtonPoint)ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)ON_BN_CLICKED(IDC_BUTTON_SQRT, OnButtonSqrt)ON_BN_CLICKED(IDC_BUTTON_RECI, OnButtonReci)ON_BN_CLICKED(IDC_BUTTON_EQUAL, OnButtonEqual)ON_BN_CLICKED(IDC_BUTTON_SIN, OnButtonSin)ON_BN_CLICKED(IDC_BUTTON_COS, OnButtonCos)ON_BN_CLICKED(IDC_BUTTON_LOG, OnButtonLog)ON_BN_CLICKED(IDC_BUTTON_XDEY, OnButtonXdeY)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CCKcalculateDlg message handlers/////////////////////////////////////////////////////////////////////////////BOOL CCKcalculateDlg::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 aSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herereturn TRUE;// return TRUE unless you set the focus to a control}void CCKcalculateDlg::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 CCKcalculateDlg::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 CCKcalculateDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////按键代码//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CCKcalculateDlg::OnButton0(){// TODO: Add your control notification handler code hereonButtonN(0);}void CCKcalculateDlg::OnButton1(){// TODO: Add your control notification handler code hereonButtonN(1);}void CCKcalculateDlg::OnButton2(){// TODO: Add your control notification handler code hereonButtonN(2);}void CCKcalculateDlg::OnButton3(){// TODO: Add your control notification handler code hereonButtonN(3);}void CCKcalculateDlg::OnButton4(){// TODO: Add your control notification handler code hereonButtonN(4);}void CCKcalculateDlg::OnButton5(){// TODO: Add your control notification handler code hereonButtonN(5);}void CCKcalculateDlg::OnButton6(){// TODO: Add your control notification handler code hereonButtonN(6);}void CCKcalculateDlg::OnButton7(){// TODO: Add your control notification handler code hereonButtonN(7);}void CCKcalculateDlg::OnButton8(){// TODO: Add your control notification handler code hereonButtonN(8);}void CCKcalculateDlg::OnButton9(){// TODO: Add your control notification handler code hereonButtonN(9);}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////计算按键代码//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void CCKcalculateDlg::OnButtonAdd(){// TODO: Add your control notification handler code here Calculate();m_operator="+";}void CCKcalculateDlg::OnButtonMinus(){// TODO: Add your control notification handler code here Calculate();m_operator="-";}void CCKcalculateDlg::OnButtonMutiply(){// TODO: Add your control notification handler code here Calculate();m_operator="*";}void CCKcalculateDlg::OnButtonDiv(){// TODO: Add your control notification handler code here Calculate();m_operator="/";}void CCKcalculateDlg::OnButtonSigh(){// TODO: Add your control notification handler code here m_second=-m_second;UpdateDisplay(m_second);}void CCKcalculateDlg::OnButtonPoint(){// TODO: Add your control notification handler code here m_coff =0.1;}void CCKcalculateDlg::OnButtonClear(){// TODO: Add your control notification handler code here m_first=0.0;m_second=0.0;m_operator="+";m_coff = 1.0;UpdateDisplay(0.0);}void CCKcalculateDlg::OnButtonSqrt(){// TODO: Add your control notification handler code here if( m_second==0 ){m_first=sqrt(m_first);UpdateDisplay(m_first);}else{m_second=sqrt(m_second);UpdateDisplay(m_second);}}void CCKcalculateDlg::OnButtonReci(){// TODO: Add your control notification handler code here if( fabs(m_second ) < 0.000001 && fabs( m_first )<0.000001) {m_display="除数不能为零";UpdateDisplay(false);return;}if( fabs(m_second ) < 0.000001){m_first=1.0/m_first;UpdateDisplay(m_first);}else{m_second=1.0/m_second;UpdateDisplay(m_second);}}void CCKcalculateDlg::OnButtonEqual(){// TODO: Add your control notification handler code hereXdeY();Calculate();}void CCKcalculateDlg::UpdateDisplay(double ck){m_display.Format(_T("%f"),ck);int i=m_display.GetLength();//格式化输出,将输出结果后的零截去while(m_display.GetAt(i-1)=='0'){m_display.Delete(i-1,1);i--;}//更新编辑框变量m_displayUpdateData(false);}void CCKcalculateDlg::Calculate(void){//将前一次数据与当前数据进行运算,作为下次的第一操作数,并在编辑框显示switch(m_operator.GetAt(0)){case '+': m_first+=m_second;break;case '-': m_first-=m_second;break;case '*': m_first*=m_second;break;case '/':if( fabs(m_second ) <= 0.000001){m_display="除数不能为0";UpdateData(false);return;}m_first/=m_second;break;}m_second=0.0;m_coff=1.0;m_operator=_T("+");//更新编辑框显示内容UpdateDisplay(m_first);}void CCKcalculateDlg::onButtonN(int n){if(m_coff==1.0)//作为整数输入数字时m_second=m_second*10+n;else{//作为小数输入数字m_second=m_second+n*m_coff;m_coff*=0.1;}//更新编辑框的数字显示UpdateDisplay(m_second);}void CCKcalculateDlg::OnButtonSin(){// TODO: Add your control notification handler code here m_second=m_second*m_PI/180;m_second=sin(m_second);UpdateDisplay(m_second);}void CCKcalculateDlg::OnButtonCos(){// TODO: Add your control notification handler code here m_second=m_second*m_PI/180;m_second=cos(m_second);UpdateDisplay(m_second);}void CCKcalculateDlg::OnButtonLog(){// TODO: Add your control notification handler code here m_second=log10(m_second);UpdateDisplay(m_second);}void CCKcalculateDlg::OnButtonXdeY(){// TODO: Add your control notification handler code here temp=m_second;m_second=0.0;UpdateDisplay(m_second);isXdeY=true;}void CCKcalculateDlg::XdeY(){if(isXdeY){m_second=m_second;m_second=pow(temp,m_second);}}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////以下是CKcalculateDlg.h代码// /////////CKcalculateDlg.h : header file//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#if !defined(AFX_CKCALCULATEDLG_H__8DEB211E_CFCF_44C8_895C_BEF4E77EBE6C __INCLUDED_)#defineAFX_CKCALCULATEDLG_H__8DEB211E_CFCF_44C8_895C_BEF4E77EBE6C__INCLUD ED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000/////////////////////////////////////////////////////////////////////////////// CCKcalculateDlg dialogclass CCKcalculateDlg : public CDialog{// Constructionpublic:void XdeY(void);bool isXdeY;double temp;double m_PI;void onButtonN(int n);void UpdateDisplay(double ck);void Calculate();CCKcalculateDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DATA(CCKcalculateDlg)enum { IDD = IDD_CKCALCULATE_DIALOG };CString m_display;//}}AFX_DATAdouble m_first;//存储一次运算的第一个操作数及一次运算的结果double m_second;//存储一次运算的第二个操作数CString m_operator;//存储运算符double m_coff;//存储小数点的系数权值// ClassWizard generated virtual function overrides// {{AFX_VIRTUAL(CCKcalculateDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CCKcalculateDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnButton0();afx_msg void OnButton1();afx_msg void OnButton2();afx_msg void OnButton3();afx_msg void OnButton4();afx_msg void OnButton5();afx_msg void OnButton6();afx_msg void OnButton7();afx_msg void OnButton8();afx_msg void OnButton9();afx_msg void OnButtonAdd();afx_msg void OnButtonMinus();afx_msg void OnButtonMutiply();afx_msg void OnButtonDiv();afx_msg void OnButtonSigh();afx_msg void OnButtonPoint();afx_msg void OnButtonClear();afx_msg void OnButtonSqrt();afx_msg void OnButtonReci();afx_msg void OnButtonEqual();afx_msg void OnButtonSin();afx_msg void OnButtonCos();afx_msg void OnButtonLog();afx_msg void OnButtonXdeY();//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCA TION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_CKCALCULATEDLG_H__8DEB211E_CFCF_44C8_895C_BEF4E77EBE6C_ _INCLUDED_)。
VC++ 6.0 MFC 俄罗斯方块 自动求解 代码 源程序
#include <windows.h>#include <time.h>#include <stdlib.h>#include <stdio.h>#define tDown 1 //方块下落定时器的标识(编号)#define tPaint 2 //重绘定时器的标识(编号)#define tDownTime 500 //方块下落一行位置的时间间隔#define tPaintTime 50 //窗口重绘的时间间隔#define ROW 24 //地图的行数目(第23行不用)#define COL 14 //地图的列数目(第0列和第13列不用)#define MAX_CLASS 7 //方块形状数目#define LEN 20 //每个方格大小为20×20像素#define StartY -1 * LEN + 5 //-15,绘制俄罗斯方块地图时的边界起始位置#define StartX -1 * LEN + 5 //-15int iDeleteRows = 0; //总共清除的行int iTotalNum = 0; //总得分char WindowTxt[100] = "俄罗斯方块游戏自动求解已关闭"; //窗口标题char s1[] = "关闭", s2[] = "启动"; //用于启动/关闭自动求解功能时显示不同的标题bool bAuto; //是否自动求解的标志bool Pause; //是否暂停的标志int Map[ROW][COL]; //俄罗斯方块的地图(被占据的方格为1,否则为0) int CurrentBox[4][4]; //当前落下的方块int CurrentY, CurrentX; //当前落下方块的当前位置(指左上角位置)int NextBox[4][4]; //下一个将落下的方块int Box[MAX_CLASS][4][4] = //7种方块形状{{{0,0,0,0},{1,1,1,1},{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,1,0,0},{1,1,1,0},{0,0,0,0}},{{0,0,0,0},{1,1,0,0},{0,1,1,0},{0,0,0,0}},{{0,0,0,0},{0,1,1,0},{1,1,0,0},{0,0,0,0}},{{0,1,1,0},{0,0,1,0},{0,0,1,0},{0,0,0,0}},{{0,1,1,0},{0,1,0,0},{0,1,0,0},{0,0,0,0}{{0,0,0,0},{0,1,1,0},{0,1,1,0},{0,0,0,0}}};void InitMap( ); //初始化地图int NewFall( ); //新的方块落下void BuildNextBox( ); //产生下一个随机的方块int Test( int y, int x, int box[4][4] ); //测试在(y,x)位置是否能放置方块box,能放置返回1,否则返回0int Drop( ); //定时时间到,当前方块下降一行位置void PutBox( ); //放置当前方块int Move( int Right ); //(通过方向键)移动方块,参数right为1表示向右移动,为0表示向左移动void Clear( ); //清除满足条件的行int Rotate( ); //测试旋转是否可行,如果可行则旋转当前方块int RotateTest( int Box1[4][4], int Box2[4][4] ); //旋转当前方块int count1( int y, int x, int box[4][4] ); //新增函数int BestStartX( ); //新增函数LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); //窗口处理函数声明int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow ) //入口函数{static TCHAR szAppName[ ] = TEXT ("Russion");HWND hwnd;MSG msg;WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION );wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;if( !RegisterClass( &wndclass ) ){MessageBox( NULL, TEXT ("Program requires Windows NT!" ),szAppName, MB_ICONERROR );return 0;}hwnd = CreateWindow( szAppName, WindowTxt,WS_OVERLAPPED | WS_SYSMENU | WS_BORDER,CW_USEDEFAULT, CW_USEDEFAULT,(COL + 4) * LEN, //窗口宽度:(14+4)×20=360像素ROW * LEN, //窗口高度:24×20=480像素(包括标题栏部分)NULL, NULL, hInstance, NULL );ShowWindow( hwnd, iCmdShow );UpdateWindow( hwnd );while( GetMessage( &msg, NULL, 0, 0 ) ){TranslateMessage( &msg );DispatchMessage( &msg );}return msg.wParam;}//初始化地图(将第0列和第13列、第23行设置为1(被占据),其他位置设置为0) void InitMap( ){int y, x;for( y = 0; y < ROW; y++ ){for( x = 0; x < COL; x++ ){//第0列、第13列、第23行设置为1(被占据)if( x < 1 || x > COL - 2 || y > ROW - 2 )Map[y][x] = 1;else Map[y][x] = 0;}}}//计算在(y,x)位置(左上角位置)上放置方块box后空出的方格数int count1( int y, int x, int box[4][4] ){if( !Test(y,x,box) ) return 100; //不能在(y,x)位置放置box,返回∞if( Test(y+1,x,box) ) return 100; //如果box还能下降,也返回∞int tmpy, tmpx;int c = 0; //空出的方格数for( tmpx = 0; tmpx < 4; tmpx++ ) //考虑第0~3列{for( tmpy = 3; tmpy >= 0; tmpy-- ){if( box[tmpy][tmpx] ) break;}tmpy++;if( tmpy>0 ){for( ; tmpy<4; tmpy++ ){if( tmpy+y<0 || tmpy+y>=ROW || tmpx+x<0 || tmpx+x>=COL ) continue;if(!Map[tmpy+y][tmpx+x]) c++; //空出的方格}}}return c;}//当启动自动求解功能时,求下一个方块的最佳下降位置//策略1为:放置后,空出的方格数最少,为MinC1,此时能达到最高位置为MaxY1,该位置为BestX1;//策略2为:放置后,能下降的位置最高,为MaxY2,此时空出的方格数为MinC2,该位置为BestX2;//必有MaxY1<=MaxY2, MinC1>=MinC2//取二者的折衷,策略为:优先采取策略1,但如果MinC2==MinC1或MaxY2>=MaxY1+2,则取策略2int BestStartX( ){int X, Y, tmpx, tmpy; //循环变量int BestX = 0, MaxY = 0, MinC = 100;//最终所求的最佳下降位置int BestX1, MaxY1, MinC1; //策略1:MinC:最佳位置处放置方块时,空出的空格最少,BestX:最佳下降位置,MaxY:能下降到的位置int BestX2, MaxY2, MinC2; //策略2:最佳位置为能下降的位置最高int c; //以上策略求最值时用到的辅助变量int tBox1[4][4], tBox2[4][4]; //tBox2为实现旋转时用到的临时变量int Rotates = 0, Rotates1 = 0, Rotates2 = 0;//找到最佳位置后,当前方块需要旋转的次数int Last1, Last2; //Last1为下一个方块未旋转时最下一个方格所在的行,Last2为旋转后最下一个方格所在的行memcpy(tBox1, NextBox, sizeof(tBox1)); memcpy(tBox2, NextBox, sizeof(tBox1)); for( tmpy=3; tmpy>=0; tmpy-- ) //统计tBox1中最下一个方格所在的行{for( tmpx=0; tmpx<4; tmpx++ ) if(tBox1[tmpy][tmpx]) break;if(tmpx<4) break;}Last1 = tmpy;BestX1 = 0, MaxY1 = 0, MinC1 = 100; BestX2 = 0, MaxY2 = 0, MinC2 = 100;//枚举从第0~COL-4列下落for( X=0; X<=COL-4; X++ ){for( Y=0; Y<=ROW-1; Y++ )if( !Test( Y, X, tBox1 ) ) break;Y--;c = count1(Y,X,tBox1);if( c<MinC1 || c==MinC1 && Y+Last1>MaxY1 )MinC1 = c, BestX1 = X, MaxY1 = Y+Last1;if( Y+Last1>MaxY2 || Y+Last1==MaxY2 && c<MinC2 )MinC2 = c, BestX2 = X, MaxY2 = Y+Last1;}//第1次旋转,旋转后为tBox1Last2 = RotateTest(tBox1, tBox2); memcpy(tBox1, tBox2, sizeof(tBox1));for( X=0; X<=COL-4; X++ ){for( Y=0; Y<=ROW-1; Y++ )if( !Test( Y, X, tBox1 ) ) break;Y--;c = count1(Y,X,tBox1);if( c<MinC1 || c==MinC1 && Y+Last2>MaxY1 )MinC1 = c, BestX1 = X, MaxY1 = Y+Last2, Rotates1 = 1;if( Y+Last2>MaxY2 || Y+Last2==MaxY2 && c<MinC2 )MinC2 = c, BestX2 = X, MaxY2 = Y+Last2, Rotates2 = 1;}//第2次旋转,旋转后为tBox1Last2 = RotateTest(tBox1, tBox2); memcpy(tBox1, tBox2, sizeof(tBox1));for( X=0; X<=COL-4; X++ ){for( Y=0; Y<=ROW-1; Y++ )if( !Test( Y, X, tBox1 ) ) break;Y--;c = count1(Y,X,tBox1);if( c<MinC1 || c==MinC1 && Y+Last2>MaxY1 )MinC1 = c, BestX1 = X, MaxY1 = Y+Last2, Rotates1 = 2;if( Y+Last2>MaxY2 || Y+Last2==MaxY2 && c<MinC2 )MinC2 = c, BestX2 = X, MaxY2 = Y+Last2, Rotates2 = 2;}//第3次旋转,旋转后为tBox1Last2 = RotateTest(tBox1, tBox2); memcpy(tBox1, tBox2, sizeof(tBox1));for( X=0; X<=COL-4; X++ ){for( Y=0; Y<=ROW-1; Y++ )if( !Test( Y, X, tBox1 ) ) break;Y--;c = count1(Y,X,tBox1);if( c<MinC1 || c==MinC1 && Y+Last2>MaxY1 )MinC1 = c, BestX1 = X, MaxY1 = Y+Last2, Rotates1 = 3;if( Y+Last2>MaxY2 || Y+Last2==MaxY2 && c<MinC2 )MinC2 = c, BestX2 = X, MaxY2 = Y+Last2, Rotates2 = 3;}MinC = MinC1, BestX = BestX1, MaxY = MaxY1, Rotates = Rotates1;if( MinC2==MinC1 || MaxY2>=MaxY1+2 )MinC = MinC2, BestX = BestX2, MaxY = MaxY2, Rotates = Rotates2;if( Rotates>0 ){for( int i=0; i<Rotates; i++ ){RotateTest(NextBox, tBox1);memcpy(NextBox, tBox1, sizeof(tBox1));}}return BestX;}int NewFall( ) //新的方块落下(如果能落下返回1,否则不能落下返回0(程序就该结束了)) {int y, x;CurrentY = 0; //当前方块的当前位置是指该方块(4×4大小)的左上角所在位置if(bAuto) CurrentX = BestStartX( );else CurrentX = COL / 2 - 2; //初始为(0,5)for( y = 0; y < 4; y++ ){for( x = 0; x < 4; x++ )CurrentBox[y][x] = NextBox[y][x];}BuildNextBox( ); //产生下一个随机的方块return Test( CurrentY, CurrentX, CurrentBox );}int no[400] = {3,3,5,1};void BuildNextBox( ) //产生下一个随机的方块{static int j=0;int i, y, x;i = rand()%MAX_CLASS; //随机生成0~6的整数for( y = 0; y < 4; y++ ){for( x = 0; x < 4; x++ )NextBox[y][x] = Box[i][y][x];}}//测试在(y,x)位置(左上角位置)是否能放置方块box,能放置返回1,否则返回0int Test( int y, int x, int box[4][4] ){int tmpy, tmpx;for( tmpy = 0; tmpy < 4; tmpy++ ){for( tmpx = 0; tmpx < 4; tmpx++ ){if( Map[tmpy + y][tmpx + x] && box[tmpy][tmpx] )return 0;}}return 1;}int Drop( ) //定时时间到,当前方块下降一行位置(如果能下降返回1,否则返回0){int NewY;NewY = CurrentY + 1;if( Test( NewY, CurrentX, CurrentBox ) ){CurrentY = NewY;return 1;}return 0;}void PutBox( ) //在当前位置(CurrentY,CurrentX)放置当前方块(此时当前方块已经不能下降了){int y, x;for( y = 0; y < 4; y++ ){for( x = 0; x < 4; x++ ){if( CurrentBox[y][x] )Map[CurrentY + y][CurrentX + x] = CurrentBox[y][x];}}}int Move( int Right ) //(通过方向键)移动方块,参数right为1表示向右移动,为0表示向左移动{int x;if( Right ) x = CurrentX + 1; //向右移动一列位置else x = CurrentX - 1; //向左移动一列位置if( Test( CurrentY, x, CurrentBox ) ){CurrentX = x;return 1;}return 0;}void Clear( ) //清除满足条件的行{int y, x; //循环变量int DelY, DelX; //循环变量int Full; //一行是否满的标志for( y = 0; y < ROW - 1; y++ ) //检查第0~22行{Full = 1;for( x = 1; x < COL - 1; x++ ) //检查每行的第1~12列{if( !Map[y][x] ){Full = 0; break;}}if( Full ) //第y行满了,删除该行,该行以上的其他行下移一行{iDeleteRows++; iTotalNum = iDeleteRows*100; //更新得分for( DelY = y; DelY > 0; DelY-- ){for( DelX = 1; DelX < COL - 1; DelX++ )Map[DelY][DelX] = Map[DelY-1][DelX];}for( DelX = 1; DelX < COL - 1; DelX++ ) //第0行置为0Map[0][DelX] = 0;}}}int Rotate( ) //测试旋转是否可行,如果可行则旋转当前方块{int y, x;int TmpBox[4][4];RotateTest( CurrentBox, TmpBox );if( Test( CurrentY, CurrentX, TmpBox ) ){for( y = 0; y < 4; y++ ){for( x = 0; x < 4; x++ )CurrentBox[y][x] = TmpBox[y][x];}return 1;}else return 0;}/*0000 0000 0000 //旋转规律是:Box3[y][x] = Box1[y][3-x] -> 方块绕竖直方向对称变换0100-> 0010-> 0010 //Box2[x][y] = Box3[y][x] -> 沿着主对角线对称变换(相当于矩阵转置)1110 0111 01100000 0000 0010 */int RotateTest( int Box1[4][4], int Box2[4][4] ) //旋转当前方块{ //新增返回值为:旋转后的Box2中最下一个方格所在的行int y, x;for( y = 0; y < 4; y++ ){for( x = 3; x >=0; x-- )Box2[x][y] = Box1[y][3 - x];}for( y=3; y>=0; y-- ) //统计Box2中最下一个方格所在的行{for( x=0; x<4; x++ ){if(Box2[y][x]) break;}if(x<4) break;}return y;}LRESULT CALLBACK WndProc( HWND hwnd, UINT message, //窗口处理函数WPARAM wParam, LPARAM lParam ){HDC hdc, hdcMem;int y, x;PAINTSTRUCT ps;HBITMAP hBitMap;HPEN hPen;HBRUSH hBrush;static int cxClient, cyClient; //窗口客户区宽度和高度char str[20]; //用于显示得分的变量switch( message ){case WM_CREATE:SetTimer( hwnd, tDown, tDownTime, NULL ); //开启两个定时器SetTimer( hwnd, tPaint, tPaintTime, NULL );srand( (unsigned)time( NULL ) );bAuto = false;Pause = false;InitMap( );BuildNextBox( ); //先随机产生一个方块NewFall( ); //方块落下并随机产生下一个方块sprintf( str, " 得分:%d", iTotalNum ); strcat( WindowTxt, str );SetWindowText(hwnd,WindowTxt);return 0;case WM_SIZE:cxClient = LOWORD( lParam ); //取得窗口客户区宽度和高度cyClient = HIWORD( lParam );return 0;case WM_TIMER:switch( wParam ){case tDown: //下降定时器if( !Drop( ) ) //如果不能下降则放置当前方块{PutBox( );MessageBeep( -1 );Clear( ); //清除//刷新得分sprintf( str, "%d", iTotalNum ); WindowTxt[36] = 0;strcat( WindowTxt, str ); SetWindowText(hwnd,WindowTxt);if( !NewFall( ) ) //如果新的方块不能落下,则程序结束{KillTimer(hwnd, tDown );KillTimer(hwnd, tPaint );//PostMessage( hwnd, WM_CLOSE, NULL, NULL );}}break;case tPaint: //重绘定时器InvalidateRect(hwnd, NULL, FALSE); //强制重绘窗口工作区break;}case WM_KEYDOWN:switch( wParam ){case VK_LEFT: //"向左"方向键if(bAuto) break;Move(0); break;case VK_RIGHT: //"向右"方向键if(bAuto) break;Move(1); break;case VK_UP: //"向上"方向键:旋转if(bAuto) break;Rotate( ); break;case VK_DOWN: //"向下"方向键:当前方块下移一行位置if(bAuto) break;MessageBeep( -1 ); Drop( ); break;case VK_RETURN: //回车键:暂停Pause = !Pause;if( Pause ) //暂停、自动求解时也可以暂停KillTimer( hwnd, tDown );else //启动{if(bAuto) SetTimer( hwnd, tDown, tDownTime/5, NULL );else SetTimer( hwnd, tDown, tDownTime, NULL );}break;case VK_SPACE:if(bAuto) break;while( 1 ) //使用永真循环,使得当前方块一直下降到不能下降为止{if( !Drop( ) ){PutBox( ); Clear( );sprintf( str, "%d", iTotalNum ); WindowTxt[36] = 0;strcat( WindowTxt, str ); SetWindowText(hwnd,WindowTxt);if( !NewFall( ) ) //如果新的方块不能落下,则程序结束{KillTimer(hwnd, tDown );KillTimer(hwnd, tPaint );//PostMessage( hwnd, WM_CLOSE, NULL, NULL );}break;}}break;case VK_F1:bAuto = !bAuto;if(bAuto) //自动求解{KillTimer(hwnd, tDown );SetTimer( hwnd, tDown, tDownTime/5, NULL );memcpy( WindowTxt+25, s2, strlen(s2) ); //修改标题}else{KillTimer(hwnd, tDown );SetTimer( hwnd, tDown, tDownTime, NULL );memcpy( WindowTxt+25, s1, strlen(s1) ); //修改标题}SetWindowText(hwnd,WindowTxt);break;}case WM_PAINT: //重绘窗口工作区hdc = BeginPaint( hwnd, &ps );hdcMem = CreateCompatibleDC( hdc );hBitMap = CreateCompatibleBitmap( hdc, cxClient, cyClient );SelectObject( hdcMem, hBitMap );//画地图最外面的矩形(4, 4, 246, 446)Rectangle( hdcMem, StartX + LEN * 1 - 1,StartY + LEN * 1 - 1,StartX + LEN * (COL - 1) + 1, StartY + LEN * (ROW - 1) + 1 );hPen = CreatePen( PS_SOLID, 1, RGB(180, 180, 180) );SelectObject( hdcMem, hPen );hBrush = CreateSolidBrush( RGB(250, 250, 250) );SelectObject( hdcMem, hBrush );for( y = 1; y < ROW - 1; y++ ) //画地图中的每一格{for( x = 1; x < COL - 1; x++ ){Rectangle( hdcMem, StartX + LEN * x, StartY + LEN * y,StartX + LEN * (x + 1), StartY + LEN * (y + 1) );}}DeleteObject( hPen );DeleteObject( hBrush );hPen = CreatePen( PS_SOLID, 1, RGB(180, 180, 180) ); SelectObject( hdcMem, hPen );hBrush = CreateSolidBrush( RGB(255, 100, 100) );SelectObject(hdcMem, hBrush);for( y = 1; y < ROW - 1; y++ ) //画出地图中每个被占据的方格{for( x = 1; x < COL - 1; x++ ){if( Map[y][x] ){Rectangle( hdcMem, StartX + LEN * x, StartY + LEN * y,StartX +LEN * (x + 1), StartY + LEN * (y + 1) );}}}for( y = 0; y < 4; y++ ) //画当前方块{for( x = 0; x < 4; x++ ){if( CurrentBox[y][x] ){if( y + CurrentY > 0 ){Rectangle( hdcMem, (x + CurrentX) * LEN + StartX,(y + CurrentY) * LEN +StartY,(x + CurrentX + 1) * LEN + StartX,(y + CurrentY + 1) * LEN + StartY );}}}}for( y = 0; y < 4; y++ )//在窗口右边区域画下一个方块{for( x = 0; x < 4; x++ ){if( NextBox[y][x] ){Rectangle( hdcMem, (x + COL) * LEN + StartX,(y + 2) * LEN + StartY,(x+ COL + 1) * LEN + StartX, (y + 3) * LEN + StartY );}}}DeleteObject( hPen );DeleteObject( hBrush );DeleteObject( hBitMap );BitBlt( hdc, 0, 0, cxClient, cyClient, hdcMem, 0, 0, SRCCOPY );DeleteDC( hdcMem );EndPaint( hwnd, &ps );return 0;case WM_DESTROY:KillTimer(hwnd, tDown );KillTimer(hwnd, tPaint );PostQuitMessage( 0 );return 0;}//end of switch( message )return DefWindowProc( hwnd, message, wParam, lParam );}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用C++编写计算器程序搞要本课程设计是在基于对话框的应用程序中模拟一个计算器,本计算器可以进行十进制下的四则运算(加、减、乘、除)和四则混合运算,可以把十进制转化为二进制或十六进制,可以进行一些常用的函数运算(比如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++语法非常灵活。
其优点是给用户编程带来书写上的方便。
其缺点是由于编译时对语法限制比较宽松,许多逻辑上的错误不容易发现,给用户编程增加了难度。
1.2计算器的介绍(1)在运行程序后,系统会弹出一个基于对话框的计算器界面,如下图所示:图1.1 计算器界面(2)在计算器程序中,主要通过一个编辑框来获取表达式和显示计算结果,表达式可以通过键盘和单击按钮2种方式输入,输入后的结果如下图所示:图1.2 输入表达式后的界面(3)在输入完表达式后,单击“=”后,开始对表达式进行计算,计算完成后,在编辑框中显示计算的结果。
图1.3 计算后的结果(4)计算器可以实现十进制转化为十六进制或二进制,其实现的操作为先输入一个十进制整数,再单击按钮“转化为二进制”或“转化为十六进制。
图1.4 输入一个十进制数100图1.5 100转化为二进制后的结果图1.6 100转化为十六进制后的结果(4)另外,计算器还可以实现一些简单的函数运算,实现的操作和十六进制/二进制转化类似,是先输入一个数字,在单击想要进行的函数的按钮,单击后就会在编辑框中显示运算的结果。
2算法的实现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) -'0')) //如果字符串str.GetAt(i)的内容是整数{if(rate==10.0) //整数部分itemp=itemp*rate+(str.GetAt(i)-'0');//获得整数AIISC码0-9对应的十进制为48-57else //小数部分{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);}GetAt(i):获取字符串中第i个字母isdigit(c):判断c是不是0-9的整数(2)如果字符串中有运算符和数字,但是没有括号。
程序调用函数void GetStr(CString str),这个函数的前半部分和函数void GetaStr(CString str)一样,都是获取数字的算法,但是因为表达式中可能有多个数字和运算符,所以我们需要定义2个数组,分别用来存放数字和运算符,当读取字符遇到运算符时,把变量itemp的值保存在数组a中,并把0赋给itemp,把10赋给rate,把运算符保存在数组b中。
当不在碰到运算符号时,把最后一个整数itemp 的值数组a中,把z的值赋给s。
(z的值表示运算符加数字一个有多少个,把这个值赋给s,可以在以后的计算中,控制循环的条件,避免造成不必要的误差。
)这个函数的代码如下:void CMyDlg::GetStr(CString str){int i=0,z=0;double rate=10.0,itemp=0.0;for(i=0;i<20;i++)a[i]=1000000.0; //对数组a[20]初始化 for(i=0;i<10;i++)b[i]=' '; //对数组b[10]初始化 i=0; //把0赋给ifor(;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,开始计算小数部分else if(str.GetAt(i)=='+') //如果str.GetAt(i)是加号{a[z]=itemp;itemp=0;//把itemp的值放入双精度数组a中,并把itemp的值改为0z++; //让z自加一次b[z]='+'; //把加号放入字符数组b中z++; //让z自加一次rate=10.0;//把10赋给rate,确保读取下个数字时,先计算整数部分}else if(str.GetAt(i)=='-') //如果str.GetAt(i)是减号{a[z]=itemp;itemp=0;//把itemp的值放入双精度数组a中,并把itemp的值改为0z++; //让z自加一次b[z]='-'; //把减号放入字符数组b中z++; //让z自加一次rate=10.0;//把10赋给rate,确保读取下个数字时,先计算整数部分}else if(str.GetAt(i)=='*') //如果str.GetAt(i)是乘号{a[z]=itemp;itemp=0;//把itemp的值放入双精度数组a中,并把itemp的值改为0z++; //让z自加一次b[z]='*'; //把减号放入字符数组b中z++; //让z自加一次rate=10.0;//把10赋给rate,确保读取下个数字时,先计算整数部分}else if(str.GetAt(i)=='/') //如果str.GetAt(i)是除号{a[z]=itemp;itemp=0;//把itemp的值放入双精度数组a中,并把itemp的值改为0z++; //让z自加一次b[z]='/'; //把除号放入字符数组b中z++; //让z自加一次rate=10.0;//把10赋给rate,确保读取下个数字时,先计算整数部分}}a[z]=itemp;//把最后一个整数itemp的值放入双精度数组a中s=z;//把z的值赋给变量s,用来控制计算结果的循环中的条件}(3) 如果字符串中有括号。
程序用函数void Bracket(CString str0)来解决括号问题,同样,函数以编辑框变量m_strResult为实参,主要思想是把m_strResult先分成3个字符串,比如一个表达式2*(2+3)-6,这个函数的目的是先把表达式2*(2+3)-6分成2*、2+3、-6三个字符串,再计算2+3后,把结果覆盖掉2+3所在的字符串,最后把3个字符串相加,这样就处理掉了括号的问题。
具体实现的算法:定义3个字符串变量str1、str2、str3,这三个变量都初始化为空变量,现在开始一个循环,当没有遇到字符“(”时,把每次得到的字符都加在字符串str1上,当遇到字符“(”时,把“(”后的字符都加在字符串str2上,直到遇到字符“)”。
当遇到字符“)”时,把“)”后的字符都加在字符串str3上,str2再调用函数计算出它的表达式的值,最后把3个字符串相加,这就解决了括号问题。
该函数代码如下:4+ ((2+3 )*7 )*7void CMyDlg::Bracket(CString str0){CString str1="",str2="",str3="";int i=0;for(;i<str0.GetLength();i++){if(str0.GetAt(i)=='(') //如果碰到了左括号{i++; //i自加一次,用来跳过左括号for(;i<str0.GetLength();i++){if(str0.GetAt(i)==')') break; //如果碰到右括号,跳出循环str2+=str0.GetAt(i); //把括号内的表达式赋给str2 }i++; //i自加一次,用来跳过右括号for(;i<str0.GetLength();i++){str3+=str0.GetAt(i); //把括号后边的表达式赋给str3 }}elsestr1+=str0.GetAt(i); //把括号前边的表达式赋给str3 }GetStr(str2);//调用GetStr(str2)函数,把str2里的数字和运算符保存在数组中GetResult(); //计算出表达式str2的值for(i=0;i<str0.GetLength();i++)if(str0.GetAt(i)=='(') //如果m_strResult中有括号str2.Format("%1f",a[0]); //把a[0]转化为字符串赋给str2 m_strResult=str1+str2+str3;//把str1,str2,str3的值加起来赋给m_strResult}2.2 计算出结果的算法在把表达式中的数字和运算符分别保存在数组后,接下来我们就要进行表达式的计算了,表达式的计算首先要考虑优先级的问题,这里先把所有的除法转化为乘法,再把除法后的数字取它的倒数,接下来就是进行乘法计算,每次乘法计算后都把计算的结果保存在计算的2个数中的前面的那个数上,并把乘号和后面的数字删除。