用MFC编写的计算器程序源代码

合集下载

开发一个简单计算器程序-基于对话框

开发一个简单计算器程序-基于对话框

开发一个简单科学计算器(基于对话框模式的应用程序)一. 开发目标及软件功能开发一个科学计算器程序,要求采用基于对话框模式的应用程序,至少具有加、减、乘、除四个基本功能,并在此基础上扩展平方、开方、三角函数等功能。

(1)仔细阅读操作过程,学习如何根据编译信息,定位语法错误。

(2)将警告与错误一律看作是错误。

(3)学习并模仿书上的程序书写风格。

二. 编程步骤1. 启动Visual C++6.0,选择File | new 菜单项,弹出New 对话框。

单击Projects 选项卡,项目类型选择MFC AppWizard(exe),在Project name中填入工程名,在Location中填用户子目录路径(设置用户程序子目录的目的是,将所有编程时产生的中间文件和最终执行程序文件全部放在自己的目录中,以便管理)。

2. 在程序向导的第1步选择建立一个基于对话框(Dialog based)的应用程序,点击“Finish”结束向导。

3. 在对话框上添加各类控件,设计对话框的界面如图所示。

在对话框中右键点击,弹出属性设置对话框(Dialog Properties),标题(caption)中填入“迷你计算器”;其余各控件的参数设置如下表所示。

4. 为对话框中的控件添加相应的成员变量:点击菜单“View →ClassWizard”,点击“Member Variables”标签项,为对话框中的三个编辑框控件添加对应的成员变量如图所示。

添加成员变量的步骤为:选中“IDC_FIRST”,点击“Add Viarable”,在弹出的对话框中,指定成员变量名为“m_first”,分类为“Value”,变量类型为“double”,点击“OK”确定。

其余依此类推。

5. 为运算符按钮添加相应的消息映射函数:点击菜单“View →ClassWizard”,选中“Message Maps”标签,目标ID号中选择“IDC_ADD”,在“Messages”中选择“BN_CLICKED”,双击,弹出“添加成员函数”对话框,默认函数名为“OnAdd”,点击“OK”。

MFC计算器

MFC计算器

《C++面向对象程序设计》实验报告学院:信息科学与工程学院专业:学号:姓名:一.题目:利用MFC框架编写Windows附件中所示的简易计算器二.功能描述:1.能够实现最基本的加,减,乘,除四则基本运算。

2.界面有清空,退格按钮,方便用户计算使用。

3.此计算器具有开方,取倒数,求对数的高级运算。

三.概要设计:1.Windows消息处理机制通过对教材的阅读,对Windows程序的消息处理机制有个大致的了解。

Windows的程序都是通过消息来传送数据,并且存在异常处理等不需要用户参与的系统消息,用户消息就是鼠标的单击,双击等。

2.界面的设计如图,简易的计算器界面主要使用菜单中相关控件,并合理的布置各个按钮的位置,使得界面让用户看起来整洁简单。

3.框架描述Windows 简易计算器在资源视图画好界面添加控件的同时,通过属性修改名称为各个按钮和编辑框添加不同的函数四则运算+,-,*,/ 1/x,lgx等函数退格和清空键4.建立的变量和控件的命名,对应的消息处理函数命名表ID CAPTION Message Handler IDC_BUTTON0 0 OnButton0()IDC_BUTTON1 1 OnButton1()IDC_BUTTON2 2 OnButton2()IDC_BUTTON3 3 OnButton3()IDC_BUTTON4 4 OnButton4()IDC_BUTTON5 5 OnButton5()IDC_BUTTON6 6 OnButton6()IDC_BUTTON7 7 OnButton7()IDC_BUTTON8 8 OnButton8()IDC_BUTTON9 9 OnButton9()IDC_BUTTON10 . OnButton11()IDC_BUTTON11 = OnButtonequal() IDC_BUTTON12 + OnButtonadd()IDC_BUTTON13 - OnButtoncut()IDC_BUTTON14 * OnButtonmultiply() IDC_BUTTON15 / OnButtonremove() IDC_BUTTON16 1/x OnButton1x()IDC_BUTTON17 lg OnButtonlg()IDC_BUTTON18 sqrt OnButtonsqrt()IDC_BUTTON19 Backspace OnButtonbackspace() IDC_BUTTON20 C(清空) OnButtonclear()5.下图是基本对话框中所有的类四.详细设计:1.新建工程,选择MFC AppWizard[exe],并命名工程的名称为mycalculator2.选择基本对话框3.通过控件添加各种按钮和编辑框(对话框右边的“Controls”控件箱提供了可用于对话框的各种组建,在此次计算器中,基本上只用到上面四个控件,对话框只能通过控件来实现它们的功能,把控件中的数据保存在对话框类的数据成员中,应用程序才能通过这些数据成员获取控件中的数据)4.考虑用户们的习惯,把编辑框的显示的数字属性由靠左改成靠右(选中编辑框,右击选择属性-样式,排列文本改为向左)5.用同样的方法改变按钮的标题,其他按钮同理6.为美观改变对话框的标题为“计算器”7.右击编辑框添加类向导,添加变量m_result,且type为CString//可通过其改变类型和名称8.实现每个按钮的功能,双击按钮,为按钮添加函数,可以改变函数的名称① 0~9和小数点的函数大致类似void CMycalculatorDlg::OnButton1(){// TODO: Add your control notification handler code herem_result +=_T("1");UpdateData(FALSE);}函数_T()可以对字符串进行操作,UpdateData(FALSE)可以把数据传到文本框里面,小数点与数字同样这样处理。

计算器编程c语言

计算器编程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编程简单计算器

MFC编程简单计算器

第一步:设置界面,变量及函数首先打开VC,选择MFC AppWizard[exe],设定好路径和工程名(这里我设置工程名为为“My”)。

这里要注意的是在创建向导步骤1的时候,我们选择“基本对话框”。

之后我们可以点击完成便看到以下界面此时我们把当前页面上原配的控件按Delete全部清除(如下图)1、设置界面接着我们按照MFC自带的控件选项进行我们本次计算器的控件添加(以下是控件)我们在原先清空的界面中依次用上图控件画出一个基本的计算器页面(如下图)。

上图我们用按钮控件添加一共15个按钮,分别是数字“ 0 ~ 9”以及“+ - * /”。

每个控件“属性”都有属于它自己的ID,默认的按钮按键为IDC_BUTTON0,而且Cap当然我们为了“顾名思义”,对控件ID进行修改成我们容易辨认的(也可以不改),添加完控件并修改ID之后。

(如下图)这里我们把数字按钮0 设置ID为IDC_BUTTON14_NUM0,其他的依次类推2、添加变量添加3个成员变量和一个CEdit类的变量具体添加方法,就是右键主对话框CMyDlg->Add Member Variable 也可以是在菜单栏中选择“查看”->“建立类向导”这里我们把3个编辑框控件内的变量都改变为double型的(因为进行四则运算难免出现小数点)之后再在控件IDC_EDIT3中选择"Add Variable"并且数据类型选择 Control类型此时变量自动改为了 CEdit类这步的意思是说我们把编辑框控件3的设置为CEdit类并且设置一个成员对象是m_CResult。

3、添加消息相应函数完成修改ID后,就需给控件添加消息响应了,基本操作可以是直接双击控件,便会有向导提示。

MFC默认下了的响应信息都为On_开头,而且以下显示的是数字5的消息响应.之后所有的依次类推,这步骤一般不对成员函数名称做任何修改,直接点击OK即可到此为止我们基本上完成了计算器页面的前半部分预备工作,下来是我们的对控件具体实现代码的添加第2步:添加代码1、基本控件代码首先从加法开始void CMyDlg::OnButton1(){// TODO: Add your control notification handler code hereUpdateData();double n_result;n_result = m_num1 + m_num2;m_result = n_result;char sz[20];sprintf(sz,"%f",m_result);m_CResult.SetWindowText(sz);}UpdateData() 是MFC的窗口函数,用来刷新数据的由于我们进行基本运算需要更新数据所以必须添加这个函数。

VC计算器-小闹钟-通讯录设计(含源文件)

VC计算器-小闹钟-通讯录设计(含源文件)

面向对象Windows程序设计选题:计算器、小闹钟、通讯录学号:姓名:院(系):信息工程学院专业:信息完成日期:指导老师:老师题目一:利用MFC框架编写简易计算器一.需求分析即要实现简单计算器的功能,包括加、减、乘、除等运算功能,还要实现数据的输入、输出、计算、显示及程序退出等功能。

二.总体设计1.程序的创建.使用软件Visual C++ 6.0.,首先,新建一个MFC 基于对话框的工程。

点击文件-新建,在工程选项卡里选择MFC AppWizard[exe],给工程命名Jisuan。

点击确定。

创建一个基于对话框的应用程序。

2.界面的设计按如图所示向对话框添加控件,且按如图所示一样排版。

4.为控件添加成员变量和消息处理函数为IDC_FIRNUM 增加一个变量,点Add Variable…,我们为它增加一个 float 型的变量,命名为m_Firnum。

给第二个编辑框增加float变量m_Secnum。

第三个编辑框增加float变量m_Result。

按ctrl+w选择第一个选项卡 Message Maps,从IDs 中选择IDC_JIA,即加这个按钮,从 Messages 中选择 BN_CLICKED,即当被单击的时候,然后点 AddFunction…为其添加函数然后弹出对话框,为函数命名,选择默认即可,点击OK。

同样为-,*,/添加一样的响应函数。

结果如图:三、编程说明与实现添加如下代码:void CJisuanDlg::OnJia(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum+m_Secnum;UpdateData(false);}void CJisuanDlg::OnJian(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum-m_Secnum;UpdateData(false);}void CJisuanDlg::OnCheng(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum*m_Secnum;UpdateData(false);}void CJisuanDlg::OnChu(){// TODO: Add your control notification handler code hereUpdateData(true);m_Result=m_Firnum/m_Secnum;UpdateData(false);}这里有一个UpdateData(Bool)函数。

c++面向对象程序设计MFC简单计算器实验报告.doc

c++面向对象程序设计MFC简单计算器实验报告.doc

计算机与信息工程学院《程序设计基础》课程设计报告题目名称:60.编写一个能实现简单功能的计算器学生姓名:刘沛东学生学号:2011508154专业班级:电子信息工程(1)班指导教师:高攀1 课程设计的题目编写一个能实现简单功能的计算器2 题目要求1. 有一个计算器图形。

2. 能实现加、减、乘、除及乘方的运算。

3. 当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数字键要改变颜色 例如:输入数字1 时,在计算器图形上的1键变为红色。

4. 屏幕、图形颜色、形状自定3 总体设计3.1 总体框架图1 系统框架开始结束键入第一个按钮键入第二个按钮 显 示 结 果加 法减 法乘 法除 法乘 方清 零3.2 系统功能说明在VC++6.0中绘制计算器界面,各控件的设置对0~9控件设定相应的ID和其他属性:图2 “1”控件设置对“+、-、*、\”控件设定相应的ID和其他属性:图2 “+”控件设置对其它控件设定相应的ID和其他属性:图3 其它控件设置主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。

拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。

4 程序详细设计4.1系统主调模块图5 程序流程图4.2各模块详细设计 4.2.1 建立的变量,控件的命名,对应的消息处理函数对应表IDCAPTION Message Handler IDD_CALC_DIALOG 简易计算器 N/A IDC_NUM0 0 OnNum0 IDC_NUM1 1 OnNum1 IDC_NUM2 2 OnNum2 IDC_NUM3 3 OnNum3 IDC_NUM4 4 OnNum4 IDC_NUM5 5 OnNum5 IDC_NUM66OnNum6实现文件.cpp显示计算器界面开始执行工程全局对象资源文件.rc 模块定义文件.def头文件.h执行Afxmain()创建窗口实现窗口类注册SetwindowVoidVoid点击鼠标发出消息Void等待消息处理Void Void clc::onAdd()文本框中显示结果 程序运行结IDC_NUM7 7 OnNum7IDC_NUM8 8 OnNum8IDC_NUM9 9 OnNum9IDC_NEG +/- OnNegIDC_PT .OnPtIDC_DIV / OnDivIDC_MUL * OnMulIDC_MIN - OnMinIDC_ADD + OnAddIDC_BACKSPACE BACK OnBackspaceIDC_CE CE OnCeIDC_CLEAR C OnClearIDC_EQU = OnEquIDC_DIS N/A N/AOnCal(double num)变量定义:double poz; //保存小数点的位置,初始化为1,表示poz-1个小数点。

visual 2015 mfc 计算器 代码

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。

基于vc++mfc的科学计算器程序实验报告

基于vc++mfc的科学计算器程序实验报告

实验报告课程名称:windows软件开发实习实验项目:科学计算器工业大学实验报告(适用计算机程序设计类)专业班级:软件1006 学号:101201622 :鑫可实验名称:附件A 工业大学实验报告(适用计算机程序设计类)专业班级:软件1006 学号:101201622 :鑫可实验步骤或程序:一、关于Visual C++:Visual C++6.0由Microsoft开发, 它不仅是一个C++ 编译器,而且是一个基于Windows 操作系统的可视化集成开发环境(integrated development environment,IDE)。

Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。

这些组件通过过一个名为Developer Studio的组件集成为和谐的开发环境。

Microsoft的主力软件产品。

Visual C++是一个功能强大的可视化软件开发工具。

自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。

虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。

所以实际中,更多的是以Visual C++6.0为6平台。

Visual C++6.0以拥有“语法高亮”,自动编译功能以及高级除错功能而著称。

比如,它允许用户进行远程调试,单步执行等。

还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。

其编译及创建预编译头文件(stdafx.h)、最小重建功能及累加连结(link)著称。

这些特征明显缩短程序编辑、编译及连结的时间花费,在大型软件计划上尤其显著。

二、设计要点1、基本要求:设计的系统界面要美观大方,操作合理,有必要的提示。

VC6.0制作简易计算器MFC[整理]

VC6.0制作简易计算器MFC[整理]

1、单击File(文件)菜单,选中New(新建),创建新工程。

2、选择工程栏中MFC AppWizard[exe]应用程序,并命名工程名称为calculator.(如图)3、选择MFC应用程序为“基于对话框”类型,其他选项默认。

单击完成(如图)4、修改界面。

经过前3步骤,VC6.0生成的工作界面如图所示。

先将对话框中的“TODO:在这里设置对话控制”静态文字控件和“确定”按钮控件删除,再使用工具箱将界面拖动控件修改为如图所示的界面。

该图所示是使用工具箱的控件拖放制作的计算器初始界面。

由于这些控件都有默认的名字,所以我们要对控件进行改名,右击Button1按钮,选中Properties(属性)选项以修改控件的属性,如图所示。

在弹出的对话框中,将Button1按钮的Caption(标题)属性修改为“+”,此时初始界面同时变成相应的“+”如下图所示。

修改后的界面如图所示,控件的Caption属性就是控件显示出来的值。

按照前文所讲述的方式,将界面上的按钮控件和静态文本控件的Caption属性都做相应的修改,修改后的界面如图所示。

5、为Edit(编辑)控件添加类的成员变量。

首先,右击Edit控件,选择ClassWizard(建立类向导)选项,如下图所示。

在弹出的对话框中,选择上方MemberVariables选项卡,选中DIC_EDIT1,然后单击单击右侧的Add Variable按钮,如图所示。

单击Add Variable按钮后会跳出,如图所示的对话框,该对话框是设置成员变量的命名和数据类型,在此可以命名为m_data1.注意:控件的ID只是标记一个控件,程序中不能直接控制ID,只能通过修改变量来改变控件的状态。

00相应的,再将另外两个Edit控件命名,本项目就将这3个Edit控件命名为:●IDC_EDIT1:m_data1,类型为double.●IDC_EDIT2:m_data2,类型为double.●IDC_EDIT3:m_result,类型为double.6、添加按钮控件的消息处理函数。

MFC计算器介绍

MFC计算器介绍

基于对话框实验,写一个计算器,实验结果:工具:VS2010遇到的问题:编译遇到字符串不能转换为char *,在字符串前面加_T解决了。

1.首先新建一个MFC项目,在工具框里面拖出工具,摆好布局,修改caption和ID栏2.在头文件添加CString num1;CString num2;CStringm_result;boolisresult;int witch;在初始化函数里面初始化// TODO: 在此添加额外的初始化代码num1="";num2="";isresult=false;witch=0;3.数字键代码voidCcalculatorDlg::OnBnClickednum1(){// TODO: 在此添加控件通知处理程序代码if(isresult==false){num1+="1";m_result=num1;UpdateData(false);}if(isresult==true){num2+="1";m_result=num2;UpdateData(false);}}运算符键代码:voidCcalculatorDlg::OnBnClickedjia(){// TODO: 在此添加控件通知处理程序代码isresult=true;witch=1;}等于键代码:voidCcalculatorDlg::OnBnClickeddengyu(){// TODO: 在此添加控件通知处理程序代码UpdateData(true);double number1=_ttof(num1);double number2=_ttof(num2);double result=0.0;switch(witch){ case 1: result=number1+number2;break;case 2: result=number1+number2;break;case 3: result=number1+number2;break;case 4: result=number1+number2;break;}m_result="";m_result.Format(_T("%lf"),result);UpdateData(false);}点号代码:voidCcalculatorDlg::OnBnClickeddot(){if(isresult==false){num1+=".";m_result=num1;UpdateData(false);}if(isresult==true){num2+=".";m_result=num2;UpdateData(false);}}3.这些函数是双击相应键添加框架,自己完善细节的。

用c语言编写的计算器源代码

用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);}本人拙作,如有不足之处请谅解。

mfcc 的纯c代码

mfcc 的纯c代码

mfcc 的纯c代码(原创版)目录1.MFCC 简介2.MFCC 的纯 C 代码实现3.总结正文一、MFCC 简介MFCC(Mel 频率倒谱系数)是一种音频特征提取算法,被广泛应用于语音识别领域。

它能够将音频信号转换成一组能够表征音频信号特性的参数,从而实现对音频信号的快速、有效的分析。

MFCC 算法源于 Mel 频率尺度,其目的是将音频信号的频率成分映射到 Mel 频率尺度上,以便更好地匹配人耳的听觉特性。

二、MFCC 的纯 C 代码实现在实际应用中,MFCC 算法通常需要高效的计算性能。

为此,有人实现了 MFCC 算法的纯 C 代码,以便在嵌入式设备或者对性能要求较高的场景中使用。

以下是一个简单的 MFCC 纯 C 代码实现:```c#include <stdio.h>#include <stdlib.h>#include <math.h>#include <complex.h>// 计算 MFCC 的纯 C 代码实现void compute_mfcc(const float *input, float *output, intnum_samples, float sample_rate, float window_size, floatwindow_step, float mel_freq_min, float mel_freq_max) { // 预处理:预加重、分帧、Hamming 窗//...// 计算谱for (int i = 0; i < num_samples; i++) {// 计算短时傅里叶变换//...// 计算幅度谱//...// 计算 MFCCfloat mel_freq;float mel_val;for (mel_freq = mel_freq_min; mel_freq <=mel_freq_max; mel_freq += mel_freq_step) {mel_val = 0.0;for (int j = 0; j < window_size; j++) {mel_val += output[i * window_size + j] * exp(-2.0 * I * M_PI * mel_freq * (j - window_size / 2) / sample_rate);}output[i * num_mfcc + mel_freq - mel_freq_min] = sqrtf(mel_val * mel_val);}}}```三、总结MFCC 算法在音频处理领域具有广泛应用,其纯 C 代码实现为开发者提供了一种高效、可移植的解决方案。

MFC实现计算器

MFC实现计算器

// 计算器Dlg.cpp : implementation file//#include "stdafx.h"#include "计算器.h"#include "iostream.h"#include "计算器Dlg.h"#include "stdlib.h"#include "math.h"#ifdef _DEBUGvoid CMyDlg::OnButtonR(){// TODO: Add your control notification handler code hereif(flag==false){int i;double current;cur2d=atof(m_result);if(opp=="+")m_final=cur1d+cur2d;elseif(opp=="-")m_final=cur1d-cur2d;elseif(opp=="*")m_final=cur1d*cur2d;elseif(opp=="/"){if(cur2d!=0.0)m_final=cur1d/cur2d;elsem_final=cur1d;}elseif(opp=="^"){for(i=1,current=cur1d;i<cur2d;i++)cur1d*=current;m_final=cur1d;}opp="";cur1d=m_final;m_result="";}else//当选项为扩展的计算器时{pushs(cur1);while(c_top!=-1){if(Topc()!="("){pushs(Topc());popc();}else{m_result="输入有误!!!";UpdateData(false);return;}}while(s_top!=-1){if(Tops()=="")pops();else{pushc(Tops());pops();}}//c_stack中存放的是后缀表达式;while(c_top!=-1){pushs(Topc());popc();if(Tops()=="+"){pops();CString a="";cur2d=atof(Tops());pops();cur1d=atof(Tops());pops();cur1d+=cur2d;a.Format("%f",cur1d);pushs(a);}elseif(Tops()=="-"){pops();CString a="";cur2d=atof(Tops());pops();cur1d=atof(Tops());pops();cur1d-=cur2d;a.Format("%f",cur1d);pushs(a);}elseif(Tops()=="*"){pops();CString a="";cur2d=atof(Tops());pops();cur1d=atof(Tops());pops();cur1d*=cur2d;a.Format("%f",cur1d);pushs(a);}elseif(Tops()=="/"){pops();CString a="";cur2d=atof(Tops());pops();cur1d=atof(Tops());pops();cur1d/=cur2d;a.Format("%f",cur1d);pushs(a);}}/////////////////////////////////if(s_top!=0){m_result="输入有误!!!";UpdateData(false);return;}elsem_final=atof(Tops());}//======================================================= UpdateData(FALSE);}void CMyDlg::OnButton1(){// TODO: Add your control notification handler code hereif(flag==false)m_result+="1";else{m_String+="1";cur1+="1";}UpdateData(FALSE);}void CMyDlg::OnButton2(){// TODO: Add your control notification handler code hereif(flag==false)m_result+="2";else{m_String+="2";cur1+="2";}UpdateData(FALSE);}void CMyDlg::OnChangeEdit1(){// TODO: If this is a RICHEDIT control, the control will not// send this notification unless you override the CDialog::OnInitDialog()// function and call CRichEditCtrl().SetEventMask()// with the ENM_CHANGE flag ORed into the mask.// TODO: Add your control notification handler code here}void CMyDlg::OnButton4(){// TODO: Add your control notification handler code here if(flag==false)m_result+="3";else{m_String+="3";cur1+="3";}UpdateData(FALSE);}void CMyDlg::OnButton5(){// TODO: Add your control notification handler code here if(flag==false)m_result+="4";else{cur1+="4";m_String+="4";}UpdateData(FALSE);}void CMyDlg::OnButton6(){// TODO: Add your control notification handler code here if(flag==false)m_result+="5";else{cur1+="5";m_String+="5";} UpdateData(FALSE);}void CMyDlg::OnButton7(){// TODO: Add your control notification handler code here if(flag==false)m_result+="6";else{m_String+="6";cur1+="6"; }UpdateData(FALSE);}void CMyDlg::OnButton8(){// TODO: Add your control notification handler code here if(flag==false)m_result+="7";else{cur1+="7";m_String+="7";}UpdateData(FALSE);}void CMyDlg::OnButton9(){// TODO: Add your control notification handler code here if(flag==false)m_result+="8";else{cur1+="8";m_String+="8";}UpdateData(FALSE);}void CMyDlg::OnButton10(){// TODO: Add your control notification handler code here if(flag==false)m_result+="9";else{m_String+="9";cur1+="9";}UpdateData(FALSE);}void CMyDlg::OnButton11(){ if(flag==false){ count++;if(count==1)cur1d=atof(m_result);opp="+";m_result="";}//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ else//扩展运算中操作符的作用{m_String+="+";pushs(cur1);//转换为后缀表达式if(c_top==-1)pushc("+");elseif(Topc()=="(")pushc("+");else{while(true){if(c_top==-1)break;if(Topc()=="(")break;pushs(Topc());popc();}pushc("+");}cur1="";}// TODO: Add your control notification handler code hereUpdateData(FALSE);}//----------------------------------------------------------------------------------------- void CMyDlg::OnButton12(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);opp="-";m_result="";}else{m_String+="-";pushs(cur1);//转换为后缀表达式if(c_top==-1)pushc("-");elseif(Topc()=="(")pushc("-");else{while(true){if(Topc()=="(")break;if(c_top==-1)break;pushs(Topc());popc();}pushc("-");}cur1="";}UpdateData(FALSE);// TODO: Add your control notification handler code here}//*********************************************************** void CMyDlg::OnButton13(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);opp="*";m_result="";}else{m_String+="*";pushs(cur1);if(c_top==-1)pushc("*");else //符号栈不为空的情况while(true){if(Topc()=="+"){pushc("*");break;}if(Topc()=="-"){pushc("*");break;}if(Topc()=="*"){pushs(Topc());popc();}if(Topc()=="/"){pushs(Topc());popc();}if(c_top==-1||Topc()=="("){pushc("*");break;}}cur1="";}UpdateData(FALSE);// TODO: Add your control notification handler code here}///////////////////////////////////////////////////////////////////////////////////////////// void CMyDlg::OnButton14(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);opp="/";m_result="";}else{m_String+="/";pushs(cur1);if(c_top==-1)pushc("/");elsewhile(true){if(Topc()=="+"){pushc("/");break;}if(Topc()=="-"){pushc("/");break;}if(Topc()=="*"){pushs(Topc());popc();}if(Topc()=="/"){pushs(Topc());popc();}if(c_top==-1||Topc()=="("){pushc("/");break;}}cur1="";}UpdateData(FALSE);// TODO: Add your control notification handler code here }void CMyDlg::On_Pot(){if(flag==false)m_result+=".";else{cur1+=".";m_String+=".";}UpdateData(false);// TODO: Add your control notification handler code here }void CMyDlg::On_0(){if(flag==false)m_result+="0";else{ cur1+="0";m_String+="0";}UpdateData(false);// TODO: Add your control notification handler code here }void CMyDlg::Ongenhao(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);m_result="";if(cur1d>=0.0){m_final=double(sqrt(cur1d));cur1d=m_final;}elsem_final=cur1d;}UpdateData(false);// TODO: Add your control notification handler code here }void CMyDlg::OnMiOption(){if(flag==false){count++;if(count==1)cur1d=atof(m_result);opp="^";m_result="";}UpdateData(false);// TODO: Add your control notification handler code here}//CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC void CMyDlg::OnClear() //清空所有变量{m_final=0.0;count=0;cur1d=0.0;cur2d=0.0;cur1="";cur2="";m_String="";c_top=-1;s_top=-1;UpdateData(false);m_result="";// TODO: Add your control notification handler code here }void CMyDlg::OnR1(){// TODO: Add your control notification handler code hereflag=false;UpdateData(false);}void CMyDlg::OnR2(){// TODO: Add your control notification handler code here flag=true;UpdateData(false);}CString CMyDlg::Topc(){return c_stack[c_top];}CString CMyDlg::Tops(){return S[s_top];}void CMyDlg::pushc(CString in){ c_top++;c_stack[c_top]=in;}void CMyDlg::pushs(CString in){ s_top++;S[s_top]=in;}void CMyDlg::popc(){c_top--;}void CMyDlg::pops(){s_top--;}void CMyDlg::OnL()//输入左括号{if(flag==true)//为扩展的计算器时方为有效{m_String+="(";pushc("(");cur1="";}UpdateData(false);// TODO: Add your control notification handler code here }void CMyDlg::OnR(){if(flag==true){m_String+=")";pushs(cur1);int count=0;for(int i=0;i<c_top;i++){if(c_stack[i]=="(")break;}if(i==c_top)//没有找到左括号{m_result="输入错误!!!";UpdateData(false);return;}else{while(Topc()!="("){pushs(Topc());popc();}popc();//弹出左括号cur1="";}}UpdateData(false);// TODO: Add your control notification handler code here }。

MFC基于对话框设计的简易计算器源代码

MFC基于对话框设计的简易计算器源代码
return TRUE;
return CDialog::PreTranslateMessage(pMsg);
}
void CCALDlg::OnButton9()
{
// TODO: Add your control notification handler code here
UpdateData(true);
m_edit3=m_edalse);
}
void CCALDlg::OnButton7()
{
// TODO: Add your control notification handler code here
if(m_edit1==0)
{
MessageBox("不能对0求倒数");
return;
}
m_edit3=1/m_edit1;
UpdateData(false);
}
void CCALDlg::OnButton6()
{
// TODO: Add your control notification handler code here
{
if(pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_RETURN)
return TRUE;
if(pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_ESCAPE)
}
void CCALDlg::OnButton2()
{
// TODO: Add your control notification handler code here

开发一个简单计算器程序-基于对话框

开发一个简单计算器程序-基于对话框
6.在加法计算按钮的消息影射函数OnAdd和得到计算结果的消息影射函数OnEqual中分别输入下列代码:
void CCalculatorDlg::OnAdd()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);//得到用户输入的数据
控件类型
ID号
Caption
其它
Button
IDC_ADD

Button
IDC_SUB

Button
IDC_MUL
×
Button
IDC_DIV
/
Button
IDC_SIN
sin
Button
IDC_COS
cos
Button
IDC_SQU
x^2
Button
IDC_REC
1/x
Button
IDC_EQUAL
5.为运算符按钮添加相应的消息映射函数:点击菜单“View→ClassWizard”,选中“Message Maps”标签,目标ID号中选择“IDC_ADD”,在“Messages”中选择“BN_CLICKED”,双击,弹出“添加成员函数”对话框,默认函数名为“OnAdd”,点击“OK”。同理,为其它各运算对应的ID号添加成员函数。
其中UpdateData( )是MFC的窗口函数,用来刷新数据。当括号内的变量为TRUE时,用窗体上控件中的内容来更新和控件相关联的成员变量值;当括号内的变量为FALSE时,正好相反,将控件的关联成员变量的值传给控件并在控件中显示出来。
同理,在其它运算按钮的消息影射函数中添加相应的计算代码如下:
void CCalculatorDlg::OnCos()

科学计算器源代码

科学计算器源代码

科学计算器源代码以下是一个简单的科学计算器的源代码,包含了基本的数学运算、三角函数、指数和对数运算、阶乘和组合运算等功能。

```#include <iostream>#include <cmath>using namespace std;//计算器类class ScientificCalculatorpublic://基本运算double add(double a, double b)return a + b;}double subtract(double a, double b)return a - b;}double multiply(double a, double b)return a * b;}double divide(double a, double b)if (b != 0)return a / b;} elsecout << "Error: Division by zero!" << endl; return 0;}}//三角函数运算double sine(double angle)return sin(angle);}double cosine(double angle)return cos(angle);}double tangent(double angle)return tan(angle);}//指数和对数运算double exponent(double x) return exp(x);}double logarithm(double x) return log10(x);}//阶乘运算double factorial(int n)if (n == 0)return 1;} elseint result = 1;for (int i = 1; i <= n; i++) result *= i;}return result;}}//组合运算if (n >= r)return factorial(n) / (factorial(r) * factorial(n - r));} elsecout << "Error: Invalid input!" << endl;return 0;}}};//主函数int maiScientificCalculator calculator;//进行一些简单的计算cout << "Addition: " << calculator.add(5, 3) << endl;cout << "Subtraction: " << calculator.subtract(5, 3) << endl;cout << "Multiplication: " << calculator.multiply(5, 3) << endl;cout << "Division: " << calculator.divide(5, 3) << endl;//三角函数运算cout << "Sine: " << calculator.sine(0.5) << endl;cout << "Cosine: " << calculator.cosine(0.5) << endl;cout << "Tangent: " << calculator.tangent(0.5) << endl;//指数和对数运算cout << "Exponent: " << calculator.exponent(2) << endl;cout << "Logarithm: " << calculator.logarithm(100) << endl;//阶乘和组合运算cout << "Factorial: " << calculator.factorial(5) << endl;return 0;```这个科学计算器的源代码使用了面向对象的编程思想,将不同的数学运算封装成类的成员函数。

C语言计算器程序源代码

C语言计算器程序源代码

C语⾔计算器程序源代码//strcmp(s1,s2) 当s1⼤于s2时,返回1 ,s1⼩于s2时,返回-1,相等时,返回0 #include "stdio.h"#include "ctype.h"#include "string.h"#include "math.h"#define MAX 256#define STACK_SIZE 128#define WORD_LEN 8#define POP 1#define PUSH 0#define ERR -1#define END 2#define OPER 0#define NUM 1#define WORD 2#define ADD 1#define SUB 2#define MUL 3#define DIV 4#define POW 5#define FAC 6#define BRA_L 7#define BRA_R 8#define SIN 9#define COS 10#define TAN 11#define CTG 12#define LG 13 //以10为底的常⽤对数//#define LN 14//#define LOG 15//⾏标为当前操作符代号,列标为栈顶元素代号//2表⽰计算结束,0表⽰当前操作符进栈,1表⽰栈顶操作符出栈// \0 + - * / ^ ! ( ) sin cos tg ctg lgint Priority[14][14]={2, 1, 1, 1, 1, 1, 1,-1,-1, 1, 1, 1, 1, 1, /* \0 */0, 1, 1, 1, 1, 1, 1, 0,-1, 1, 1, 1, 1, 1, /* + */0, 1, 1, 1, 1, 1, 1, 0,-1, 1, 1, 1, 1, 1, /* - */0, 0, 0, 1, 1, 1, 1, 0,-1, 1, 1, 1, 1, 1, /* * */0, 0, 0, 1, 1, 1, 1, 0,-1, 1, 1, 1, 1, 1, /* / */0, 0, 0, 1, 1, 1, 1, 0,-1, 0, 0, 0, 0, 0, /* ^ */0, 0, 0, 0, 0, 0, 1, 0,-1, 0, 0, 0, 0, 0, /* ! */0, 0, 0, 0, 0, 0,-1, 0,-1, 0, 0, 0, 0, 0, /* ( */-1,1, 1, 1, 1, 1, 1, 1,-1, 1, 1, 1, 1, 1, /* ) */0, 0, 0, 0, 0, 0,-1, 0,-1, 0, 0, 0, 0, 0, /* sin */0, 0, 0, 0, 0, 0,-1, 0,-1, 0, 0, 0, 0, 0, /* cos */0, 0, 0, 0, 0, 0,-1, 0,-1, 0, 0, 0, 0, 0, /* tg */0, 0, 0, 0, 0, 0,-1, 0,-1, 0, 0, 0, 0, 0, /* ctg */0, 0, 0, 0, 0, 0,-1, 0,-1, 0, 0, 0, 0, 0}; /* lg */char KeyWord[36][WORD_LEN+1]={"sin", //前12个为函数,多余的⽤于扩展"cos","tan","tg","ctg","lg","","","","","","","","","","help", // 后⾯为命令,多余的为扩展"version","set","digit", //精度,⼩数点后的位数"color","radian", //弧度"degree", //⾓度"file","clr","clear","window", //窗⼝模式"fullscr", //全屏模式"","","","","","","","",""};int OperCode(char c){int code;switch(c){case '\0':code=0;break;case '+':code=1;break;case '-':code=2;break;case '*':code=3;break;case '/':code=4;break;case '^':code=5;break;case '!':code=6;break;case '(':code=7;break;case ')':code=8;break;case 's':code=9;break; //sincase 'c':code=10;break; //coscase 't':code=11;break; //tgcase 'C':code=12;break; //ctgcase 'l':code=13;break; //log default:code=-1;break;};return code;}int WordCode(char* word){int i;for(i=0;i<25;i++)if(strcmp(KeyWord[i],word)==0) break;if(i>=25)return -1;else}void help(){printf("显⽰帮助信息!\n");return;}void version(){printf("显⽰版本信息!\n");return;}void Err(int errcode,int position,char *p){printf("\n ERR:%d Position:%d %s",errcode,position,p); return;}double long factorial(int i){if(i==1 || i==0)return(1.0);elsereturn(i*factorial(i-1));}main(){char Expression[MAX+1];int Operator[STACK_SIZE];int OperStackTop;double long Number[STACK_SIZE];int NumStackTop;double long NumList[STACK_SIZE];int NumCursor,NumListSize;int OperList[STACK_SIZE];int OperCursor,OperListSize;int WordList[STACK_SIZE];int WordCursor,WordListSize;int Index[MAX+1];int IndexCursor,IndexSize;char Word[WORD_LEN+1];double long num,num1,num2,weight,tempnum;int Oper;int isDecimal,isErr,isNumber,isEnd;char CurrentOper;int i,j,k,m,n;char ch;num=0.0;num2=0.0;tempnum=0.0;Oper=-1;while(1){for(i=0;i<=MAX;i++) //表达式初始化,中间表索引初始化{Expression[i]='\0';Index[i]=-1;}for(i=0;i{Operator[i]='0';Number[i]=0.0;NumList[i]=0.0;OperList[i]=-1;WordList[i]=-1;}NumStackTop=-1; //栈顶指针初始化OperStackTop=0; //操作符栈压⼊\0Operator[OperStackTop]=OperCode('\0');NumCursor=0; //各种中间表指针初始化,各种中间表的长度初始化NumListSize=0;OperCursor=0;OperListSize=0; //操作符表中先写⼊第⼀个操作符'\0'WordCursor=0;WordListSize=0;IndexCursor=0;IndexSize=0;// Index[0]=OPER;printf("Cal>"); //初始化完成,输出提⽰符i=0;while((ch=getchar())!='\n'){if(i>MAX) /*输⼊超长,则出错*/{Err(0,i,"输⼊的表达式长度超过规定值!\n");isErr=1;break;}if(isupper(ch))ch=tolower(ch);Expression[i]=ch;i++;}if(isErr==1){isErr=0;continue;}if(strlen(Expression)==0) //直接回车continue;if(strcmp("end",Expression)==0 ||strcmp("exit",Expression)==0 || strcmp("quit",Expr ession)==0)break;//⼀下代码为编译预处理,主要处理负号,并检查括号是否配对k=0;for(i=0;Expression[i]!='\0';i++){if((i==0&&Expression[i]=='-') || (i>0&&Expression[i]=='-'&&Expression[i-1]=='(')){for(j=strlen(Expression);j>i;j--)Expression[j]=Expression[j-1];Expression[i]='0';}if(Expression[i]=='(') //检查括号k++;if(Expression[i]==')')k--;}if(k>0) //如果括号不配对{Err(1,-1,"缺少右括号 )\n");continue;}if(k<0){Err(1,-1,"缺少左括号 (\n");continue;}//编译预处理结束i=0; //词法分析while(1){if(Expression[i]=='\0'){OperList[OperListSize]=OperCode(Expression[i]);OperListSize++;Index[IndexSize]=OPER;IndexSize++;// printf("IndexSize=%d,Index[IndexSize]=%d,Expression[i]=%c\n",IndexSize,Index[IndexSize],Expression[i]); break;}isDecimal=0;isNumber=0;while(isdigit(Expression[i])||Expression[i]=='.') //读取数字{isNumber=1;if(Expression[i]=='.'){if((i<(MAX-1) && !isdigit(Expression[i+1])) || (i+1)==MAX) //不正确的⼩数点位置{Err(2,i,"⼩数点位置不正确!\n");isErr=1;isNumber=0;i++;break;}isDecimal=1;weight=0.1;i++;continue;}if(isDecimal==0)num=num*10.0+(double long)(Expression[i]-'0');{num=num+(double long)(Expression[i]-'0')*weight;weight=weight*0.1;}i++;} //数字读完if(isErr==1)break;if(isNumber==1) //如果刚才成功读取了数字,则数字⼊栈{NumList[NumListSize]=num;NumListSize++;isNumber=0;num=0.0;Index[IndexSize]=NUM;// printf("IndexSize=%d,Index[IndexSize]=%d\n",IndexSize,Index[IndexSize]); IndexSize++;}for(k=0;k<=WORD_LEN;k++)Word[k]='\0';j=0;while(isalpha(Expression[i])){if(j>=WORD_LEN) //超过长度仍然未匹配,则出错{Err(3,i,"单词长度超过规定值/未定义的单词:");printf("%s\n",Word);isErr=1;break;}Word[j]=Expression[i];j++;// printf("WORD:%s\n",Word);if(WordCode(Word)==-1) //匹配不成功{if(!isalpha(Expression[i+1]))//匹配不成功,但是下⼀个字符已经不是字母,{Err(4,i,"未定义的单词:"); //则出错,并跳出循环printf("%s\n",Word);isErr=1;break;} //匹配不成功且还能继续读取字符,则继续读取下⼀个字母i++;continue;}else //匹配成功,则单词⼊表,读取下⼀个字符{switch(WordCode(Word)){case 0:ch='s';break;case 1:ch='c';break;case 2:case 3:ch='t';break;case 4:ch='C';case 5:ch='l';break;default:ch='\0';WordList[WordListSize]=WordCode(Word);WordListSize++;Index[IndexSize]=WORD;IndexSize++;break;};if(ch!='\0'){OperList[OperListSize]=OperCode(ch);OperListSize++;Index[IndexSize]=OPER;IndexSize++;}i++;break;}} //单词读完if(isErr==1)break;if(Expression[i]==' ')i++;if(!isdigit(Expression[i]) && !isalpha(Expression[i]) && Expression[i]!='\0') {if(OperCode(Expression[i])==-1){isErr=1;Err(5,i,"未定义的操作符:");printf("%c\n",Expression[i]);break;}else{OperList[OperListSize]=OperCode(Expression[i]);OperListSize++;Index[IndexSize]=OPER;IndexSize++;i++;}} //操作符读完if(isErr==1)break;} //词法分析结束if(isErr==1){isErr=0;continue;}/* for(k=0;kprintf("NumList[%d]=%f\n",k,NumList[k]);for(k=0;kprintf("OperList[%d]=%d\n",k,OperList[k]);for(k=0;kprintf("WordList[%d]=%d\n",k,WordList[k]);for(k=0;kprintf("Index[%d]=%d\n",k,Index[k]);printf("\n\n IndexCursor=%d IndexSize=%d,\n",IndexCursor,IndexSize);printf("OperStacktop=%d,Operator[OperStackTop]=%d,NumStackTop=%d\n",OperStackTop,Operator[OperStackTop],NumStackTop); // continue;*/isEnd=0;IndexCursor=0;while(1){if(Index[IndexCursor]==NUM){if(NumCursor<0 || NumListSize<0){Err(10,-1,"索引列表与操作数列表信息不匹配\n");isErr=1;break;}NumStackTop++;Number[NumStackTop]=NumList[NumCursor];NumCursor++;IndexCursor++;continue;} //数字处理if(Index[IndexCursor]==OPER){m=OperList[OperCursor];n=Operator[OperStackTop];switch(Priority[m][n]){case ERR:Err(20,IndexCursor,"不可预见的错误!\n");isErr=1;break;case PUSH:OperStackTop++;Operator[OperStackTop]=m;OperCursor++;IndexCursor++;break;case END:isEnd=1;break;case POP:Oper=Operator[OperStackTop];OperStackTop--;switch(Oper){case BRA_L: IndexCursor++;OperCursor++;break;case ADD:if(NumStackTop>=1){num2=Number[NumStackTop];NumStackTop--;num1=Number[NumStackTop];NumStackTop--;tempnum=num1+num2;NumStackTop++;Number[NumStackTop]=tempnum;num1=0.0;num2=0.0;tempnum=0.0;}else{Err(11,IndexCursor,"加法运算缺少操作数!\n");isErr=1;}break;case SUB:if(NumStackTop>=1){num2=Number[NumStackTop];NumStackTop--;num1=Number[NumStackTop];NumStackTop--;tempnum=num1-num2;NumStackTop++;Number[NumStackTop]=tempnum;num1=0.0;num2=0.0;tempnum=0.0;}else{Err(12,IndexCursor,"减法运算缺少操作数!\n");isErr=1;}break;case MUL:if(NumStackTop>=1){num2=Number[NumStackTop];NumStackTop--;num1=Number[NumStackTop];NumStackTop--;tempnum=num1*num2;NumStackTop++;Number[NumStackTop]=tempnum;num1=0.0;num2=0.0;tempnum=0.0;}else{Err(13,IndexCursor,"乘法运算缺少操作数!\n");isErr=1;}break;case DIV:if(NumStackTop>=1){num2=Number[NumStackTop];NumStackTop--;if(num2==0.0){Err(14,IndexCursor,"除数为 0 ,不能进⾏除法运算!\n"); isErr=1;break;}num1=Number[NumStackTop];NumStackTop--;tempnum=num1/num2;NumStackTop++;Number[NumStackTop]=tempnum;num1=0.0;num2=0.0;tempnum=0.0;}else{Err(15,IndexCursor,"除法运算缺少操作数!\n"); isErr=1;}break;case POW:if(NumStackTop>=1){num2=Number[NumStackTop]; NumStackTop--;num1=Number[NumStackTop]; NumStackTop--;tempnum=pow(num1,num2); NumStackTop++;Number[NumStackTop]=tempnum;num1=0.0;num2=0.0;tempnum=0.0;}else{Err(16,IndexCursor,"乘⽅运算缺少操作数!\n"); isErr=1;}break;case FAC:if(NumStackTop>=0){num2=Number[NumStackTop]; NumStackTop--;tempnum=factorial(num2); NumStackTop++;Number[NumStackTop]=tempnum;num2=0.0;tempnum=0.0;}else{Err(17,IndexCursor,"阶乘运算缺少操作数!\n"); isErr=1;}break;case SIN:if(NumStackTop>=0){num2=Number[NumStackTop]; NumStackTop--;tempnum=sin(num2);NumStackTop++;Number[NumStackTop]=tempnum;num2=0.0;tempnum=0.0;}{Err(18,IndexCursor,"正弦函数缺少参数!\n"); isErr=1;}break;case COS:if(NumStackTop>=0){num2=Number[NumStackTop]; NumStackTop--;tempnum=cos(num2);NumStackTop++;Number[NumStackTop]=tempnum;num2=0.0;tempnum=0.0;}else{Err(19,IndexCursor,"余弦函数缺少参数!\n"); isErr=1;}break;case TAN:if(NumStackTop>=0){num2=Number[NumStackTop]; NumStackTop--;tempnum=tan(num2);NumStackTop++;Number[NumStackTop]=tempnum;num2=0.0;tempnum=0.0;}else{Err(20,IndexCursor,"正切函数缺少参数!\n");isErr=1;}break;case CTG:if(NumStackTop>=0){num2=Number[NumStackTop]; NumStackTop--;tempnum=1.0/tan(num2); NumStackTop++;Number[NumStackTop]=tempnum;num2=0.0;tempnum=0.0;}else{Err(21,IndexCursor,"余切函数缺少参数!\n"); isErr=1;}break;/* case LN:if(NumStackTop>=0)num2=Number[NumStackTop]; NumStackTop--;if(num2<=0.0){Err(20,IndexCursor,"⾃然对数函数真数:"); printf(" %f ⼩于0!\n",num2);isErr=1;break;}tempnum=log(num2);NumStackTop++;Number[NumStackTop]=tempnum;num2=0.0;tempnum=0.0;}else{Err(17,IndexCursor,"⾃然对数函数缺少参数!\n"); isErr=1;}break; */case LG:if(NumStackTop>=0){num2=Number[NumStackTop]; NumStackTop--;if(num2<=0.0){Err(23,IndexCursor,"常⽤对数函数真数:"); printf(" %f ⼩于0!\n",num2);isErr=1;break;}tempnum=log10(num2);NumStackTop++;Number[NumStackTop]=tempnum;num2=0.0;tempnum=0.0;}else{Err(22,IndexCursor,"常⽤对数函数缺少参数!\n"); isErr=1;}break;default:Err(100,IndexCursor,"运算符(代码:"); printf(" %d )暂不⽀持!\n",Oper);isErr=1;break;/*#define SIN 9#define COS 10#define TAN 11#define CTG 12#define LOG 13 */}; //switch 语句结束break;};//switchif(isErr==1 || isEnd==1)break;continue;} //运算符处理if(Index[IndexCursor]==WORD){printf(" 单词尚未处理!\n");break;}//在这⾥处理单词}//核⼼计算结束if(isErr==1){isErr=0;continue;}if(NumStackTop>0){Err(1000,-1,"多余的操作数:");printf("%f!\n",Number[NumStackTop]);}elseif(NumStackTop==0 && isEnd==1){if(fabs(Number[NumStackTop])>1e20) printf(" %.20e\n",Number[NumStackTop]); elseprintf(" %f\n",Number[NumStackTop]); isEnd=0;}}//主循环结束}//主函数结束。

VS2024下计算器的MFC编程实现

VS2024下计算器的MFC编程实现

VS2024下计算器的MFC编程实现MFC(Microsoft Foundation Classes)是Windows 平台上的一个基础类库,用于创建界面友好的Windows应用程序。

通过MFC,我们可以使用C++语言来编写Windows应用程序,并且能够充分利用Windows操作系统的各种功能。

计算器是一个经典的应用程序,可以通过MFC来实现。

下面我们将通过以下步骤来编写一个简单的计算器程序。

1.创建一个新的MFC应用程序项目在Visual Studio 2024中,选择File -> New -> Project,然后选择Visual C++ -> MFC -> MFC Application,并设置相应的项目名称和位置。

点击OK按钮创建项目。

2.设计界面在资源视图中,打开Dialog文件夹,双击IDD_CALCULATOR_DIALOG查看对话框。

在对话框中,我们可以添加按钮、文本框等控件来设计计算器的界面。

3.添加控件和事件处理函数在对话框中添加控件,如按钮、文本框等。

为按钮添加事件处理函数,在事件处理函数中实现计算器的相应功能。

例如,我们可以添加以下按钮:-数字按钮0-9-运算符按钮+、-、*、/-清空按钮C-等号按钮=-小数点按钮.对于数字按钮0-9,我们可以为每个按钮添加一个点击事件处理函数,将对应的数字添加到文本框中。

对于运算符按钮,我们可以为每个按钮添加一个点击事件处理函数,根据当前点击的运算符更新计算器的状态。

对于清空按钮C,我们可以为其添加一个点击事件处理函数,在事件处理函数中清空文本框的内容。

对于等号按钮=,我们可以为其添加一个点击事件处理函数,在事件处理函数中根据计算器的状态进行相应的计算,并将结果显示在文本框中。

对于小数点按钮.,我们可以为其添加一个点击事件处理函数,在事件处理函数中向文本框中添加一个小数点。

4.实现计算功能在事件处理函数中,我们可以使用字符串转换函数和数学运算函数来实现计算器的相应功能。

可视化编程课程设计(含源码)计算器系统实现

可视化编程课程设计(含源码)计算器系统实现

设计题目:计算器系统实现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)源代码编写错误通过查阅资料,请教同学,逐步一一解决。

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

END_MESSAGE_MAP()
// CJiSuanQiDlg 消?息¢处鋦理え?程ì序ò
BOOL CJiSuanQiDlg::OnInitDialog() {
CDialogEx::OnInitDialog();
// 将?“°关?于 ?..”±菜?单蹋?项?添 ?加ó到?系μ统?菜?单蹋?中D。£
// 使?图?标括?在ú工¤作痢?区?矩?形?中D居ó中D int 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;
void CJiSuanQiDlg::OnBnClickedButton5() {
UpdateData(); m_num=m_num*10+5; UpdateData(FALSE);// TODO: 在ú此?添 ?加ó控?件t通 ?知a处鋦理え?程ì序ò代洙?码? }
void CJiSuanQiDlg::OnBnClickedButton6() {
UpdateData(); m_num=m_num*10+3; UpdateData(FALSE);// TODO: 在ú此?添 ?加ó控?件t通 ?知a处鋦理え?程ì序ò代洙?码? }
void CJiSuanQiDlg::OnBnClickedButton4() {
UpdateData(); m_num=m_num*10+4; UpdateData(FALSE);// TODO: 在ú此?添 ?加ó控?件t通 ?知a处鋦理え?程ì序ò代洙?码? }
// 绘?制?图?标括? dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } }
//当獭?用?户§拖?动ˉ最?小?化ˉ窗洹?口ú时骸?系μ统?调獭?用?此?函ˉ数簓取?得?光a标括? //显?示?。£ HCURSOR CJiSuanQiDlg::OnQueryDragIcon() {
// 用?于 ?应畖用?程ì序ò“°关?于 ?”±菜?单蹋?项?的? CAboutDlg 对?话°框ò
class CAboutDlg : public CDialogEx { public:
CAboutDlg();
// 对?话°框ò数簓据Y enum { IDD = IDD_ABOUTBOX };
protected: virtual void DoDataExchange(CDataExchange* pDX);
return static_cast<HCURSOR>(m_hIcon);
}
void CJiSuanQiDlg::OnBnClickedButton2() {
UpdateData(); m_num=m_num*10+2; UpdateData(FALSE);// TODO: 在ú此?添 ?加ó控?件t通 ?知a处鋦理え?程ì序ò代洙?码? }
BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) {
pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } }
// TODO: 在ú此?添 ?加ó额?外猘的?初?始?化ˉ代洙?码?
return TRUE; // 除y非?将?焦1点?设Θ?置?到?控?件t,?否?则ò返う?回? TRUE }
void CJiSuanQiDlg::OnSysCommand(UINT nID, LPARAM lParam) {
if ((nID & 0xFFF0) == IDM_ABOUTBOX) {
// IDM_ABOUTBOX 必?须?在ú系μ统?命ü令?范?围§内ú。£ ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) {
void CJiSuanQiDlg::OnBnClickedButton8() {
UpdateData(); m_num=m_num*10+8; UpdateData(FALSE);// TODO: 在ú此?添 ?加ó控?件t通 ?知a处鋦理え?程ì序ò代洙?码? }
void CJiSuanQiDlg::OnBnClickedButton9() {
CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } }
// 如?果?向ò对?话°框ò添 ?加ó最?小?化ˉ按恪?钮¥,?则ò需è要癮下?面?的?代洙?码? // 来ぁ?绘?制?该?图?标括?。£对?于 ?使?用?文?档苔?视酣?图?模£型í的? MFC 应畖用?程ì序 ò,? // 这a将?由 ?框ò架ü自?动ˉ完 ?成é。£
// 设Θ?置?此?对?话°框ò的?图?标括?。£当獭?应畖用?程ì序ò主÷窗洹?口ú不?是?对?话°框
ò时骸?,?框ò架ü将?自?动ˉ
// 执′行D此?操ù作痢?
SetIcon(m_hIcon, TRUE);
// 设Θ?置?大洙?图?标括?
SetIcon(m_hIcon, FALSE);
// 设Θ?置?小?图?标括?
{ m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CJiSuanQiDlg::DoDataExchange(CDataExchange* pDX) {
CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_num); DDX_Text(pDX, IDC_EDIT2, m_1); DDX_Text(pDX, IDC_EDIT3, m_2); DDX_Text(pDX, IDC_EDIT4, m_two); }
// DDX/DDV 支§持?
// 实害?现? protected:
DECLARE_MESSAGE_MAP() };
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { }
void CAboutDlg::DoDataExchange(CDataExchange* pDX) {
BEGIN_MESSAGE_MAP(CJiSuanQiDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON2, &CJiSuanQiDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON1, &CJiSuanQiDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON3, &CJiSuanQiDlg::OnBnClickedButton3) ON_BN_CLICKED(IDC_BUTTON4, &CJiSuanQiDlg::OnBnClickedButton4) ON_BN_CLICKED(IDC_BUTTON5, &CJiSuanQiDlg::OnBnClickedButton5) ON_BN_CLICKED(IDC_BUTTON6, &CJiSuanQiDlg::OnBnClickedButton6) ON_BN_CLICKED(IDC_BUTTON7, &CJiSuanQiDlg::OnBnClickedButton7) ON_BN_CLICKED(IDC_BUTTON8, &CJiSuanQiDlg::OnBnClickedButton8) ON_BN_CLICKED(IDC_BUTTON9, &CJiSuanQiDlg::OnBnClickedButton9) ON_BN_CLICKED(IDC_BUTTON10, &CJiSuanQiDlg::OnBnClickedButton10) ON_BN_CLICKED(IDC_BUTTON11, &CJiSuanQiDlg::OnBnClickedButton11) ON_BN_CLICKED(IDC_BUTTON13, &CJiSuanQiDlg::OnBnClickedButton13) ON_BN_CLICKED(IDC_BUTTON14, &CJiSuanQiDlg::OnBnClickedButton14) ON_BN_CLICKED(IDC_BUTTON15, &CJiSuanQiDlg::OnBnClickedButton15) ON_BN_CLICKED(IDC_BUTTON16, &CJiSuanQiDlg::OnBnClickedButton16) ON_BN_CLICKED(IDC_BUTTON12, &CJiSuanQiDlg::OnBnClickedButton12)
相关文档
最新文档