通俗易懂版基于MFC科学计算器_第1页
通俗易懂版基于MFC科学计算器_第2页
通俗易懂版基于MFC科学计算器_第3页
通俗易懂版基于MFC科学计算器_第4页
通俗易懂版基于MFC科学计算器_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2013/6/22作者编写的科学强大的易懂的新手入门的科学计算器,基于MFC编写的科学计算器指导教师对课程设计的评定意见搞 要 本课程设计是在基于对话框的应用程序中模拟一个计算器,本计算器可以进行十进制下的四则运算(加、减、乘、除)和四则混合运算,可以把十进制转化为二进制或十六进制,可以进行一些常用的函数运算(比如sin、cos、tan、cot、sqrt、ln等),还可以支持带“(”,“)”符号的表达式的计算。系统开发平台为Windows XP,程序设计设计语言采用Visual C+6.0,程序运行平台为Windows 98/2000/XP。程序通过调试运行,初步实现了设计目标。关键词 程序设

2、计;计算器;C+;1 引言 在现代社会中,计算器已经进入了每一个家庭,人们在生活和学习中经常需要使用到计算器,它的出现大大减少了人们在计算方面的工作量,可以说它在人们生活和学习中是不可缺少的。1.1 C+介绍C+语言的主要特点表现在两个方面,一是全面兼容C语言,二是支持面向对象的程序设计方法1。(1) C+是一个更好的C,它保持了C语言的优点,大多数的C程序代码略作修改或不作修改就可在C+的集成环境下调试和运行。这对于继承和开发当前已在广泛的软件是非常重要的,可以节省大量的人力和物力。(2) C+是一种面向对象的程序设计语言它使得程序的各个模块的独立性更强,程序的可读性和可移植性更强,程序代码

3、的结构更加合理,程序的扩充性更强。这对于设计、编制和调试一些大型的软件尤为重要。 (3) C+集成环境不仅支持C+程序的编译和调试,而且也支持C程序的编译和调试。通常,C+程序环境约定:当源程序文件的扩展名为c时,则为C程序;而当源程序文件的扩展名为cpp时,则为C+程序。(4) C+语句非常简练,对语法限制比较宽松,因此C+语法非常灵活。其优点是给用户编程带来书写上的方便。其缺点是由于编译时对语法限制比较宽松,许多逻辑上的错误不容易发现,给用户编程增加了难度。3以下是详尽的代码在C*Dlg添加下面代码,这个自己一定要看懂,里面是各个按钮的响应函数,不是叫你直接复制粘贴,而是一个个双击按钮添加

4、代码,最后成了以下的样式。/ text2Dlg.cpp : 实现文件/#include "stdafx.h"#include "text2.h"#include "text2Dlg.h"#include "afxdialogex.h"#include"atlsimpstr.h"#ifdef _DEBUG#define new DEBUG_NEW#endif/ 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogExpublic:

5、CAboutDlg();/ 对话框数据enum IDD = IDD_ABOUTBOX ;protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持/ 实现protected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialogEx(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAbo

6、utDlg, CDialogEx)END_MESSAGE_MAP()/ Ctext2Dlg 对话框Ctext2Dlg:Ctext2Dlg(CWnd* pParent /*=NULL*/): CDialogEx(Ctext2Dlg:IDD, pParent), m_strResult(_T(""), OperatorPressed(false), Restarted(false), s(0), m_Edit3(_T(""), L(0), L1(0), PB(0), radio(0), m_strout(_T(""), m_MM3(_T(

7、""), m_Inv(false)m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);void Ctext2Dlg:DoDataExchange(CDataExchange* pDX)CDialogEx:DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, m_strResult);DDX_Text(pDX, IDC_EDIT3, m_Edit3);DDX_Text(pDX, IDC_MM3, m_MM3);BEGIN_MESSAGE_MAP(Ctext2Dlg, CDialogEx)ON_

8、WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_0, &Ctext2Dlg:OnBnClicked0)ON_BN_CLICKED(IDC_1, &Ctext2Dlg:OnBnClicked1)ON_BN_CLICKED(IDC_2, &Ctext2Dlg:OnBnClicked2)ON_BN_CLICKED(IDC_3, &Ctext2Dlg:OnBnClicked3)ON_BN_CLICKED(IDC_4, &Ctext2Dlg:OnBnClicked4)ON_BN_

9、CLICKED(IDC_5, &Ctext2Dlg:OnBnClicked5)ON_BN_CLICKED(IDC_6, &Ctext2Dlg:OnBnClicked6)ON_BN_CLICKED(IDC_7, &Ctext2Dlg:OnBnClicked7)ON_BN_CLICKED(IDC_8, &Ctext2Dlg:OnBnClicked8)ON_BN_CLICKED(IDC_9, &Ctext2Dlg:OnBnClicked9)ON_BN_CLICKED(IDC_POINT, &Ctext2Dlg:OnBnClickedPoint)ON_B

10、N_CLICKED(IDC_ADD, &Ctext2Dlg:OnBnClickedAdd)ON_BN_CLICKED(IDC_SUB, &Ctext2Dlg:OnBnClickedSub)ON_BN_CLICKED(IDC_mul, &Ctext2Dlg:OnBnClickedmul)ON_BN_CLICKED(IDC_DIV, &Ctext2Dlg:OnBnClickedDiv)ON_BN_CLICKED(IDC_EQUAL, &Ctext2Dlg:OnBnClickedEqual)ON_BN_CLICKED(IDC_BACKSPACE, &C

11、text2Dlg:OnBnClickedBackspace)ON_BN_CLICKED(IDC_C, &Ctext2Dlg:OnBnClickedC)ON_BN_CLICKED(IDC_SIN, &Ctext2Dlg:OnBnClickedSin)ON_BN_CLICKED(IDC_COS, &Ctext2Dlg:OnBnClickedCos)ON_BN_CLICKED(IDC_TAN, &Ctext2Dlg:OnBnClickedTan)ON_BN_CLICKED(IDC_SQRT, &Ctext2Dlg:OnBnClickedSqrt)ON_BN_C

12、LICKED(IDC_LKOUHAO, &Ctext2Dlg:OnBnClickedLkouhao)ON_BN_CLICKED(IDC_RKOUHAO, &Ctext2Dlg:OnBnClickedRkouhao)ON_BN_CLICKED(IDC_PI, &Ctext2Dlg:OnBnClickedPi)ON_BN_CLICKED(IDC_INT, &Ctext2Dlg:OnBnClickedInt)ON_BN_CLICKED(IDC_MOD, &Ctext2Dlg:OnBnClickedMod)ON_BN_CLICKED(IDC_CE, &C

13、text2Dlg:OnBnClickedCe)ON_BN_CLICKED(IDC_DAOSHU, &Ctext2Dlg:OnBnClickedDaoshu)ON_BN_CLICKED(IDC_JIAJIAN, &Ctext2Dlg:OnBnClickedJiajian)ON_BN_CLICKED(IDC_N, &Ctext2Dlg:OnBnClickedN)ON_BN_CLICKED(IDC_SQUARE, &Ctext2Dlg:OnBnClickedSquare)ON_BN_CLICKED(IDC_CUBE, &Ctext2Dlg:OnBnClicke

14、dCube)ON_BN_CLICKED(IDC_TENX, &Ctext2Dlg:OnBnClickedTenx)ON_BN_CLICKED(IDC_EXP, &Ctext2Dlg:OnBnClickedExp)ON_BN_CLICKED(IDC_LOG, &Ctext2Dlg:OnBnClickedLog)ON_BN_CLICKED(IDC_SINH, &Ctext2Dlg:OnBnClickedSinh)ON_BN_CLICKED(IDC_COSH, &Ctext2Dlg:OnBnClickedCosh)ON_BN_CLICKED(IDC_TANH,

15、 &Ctext2Dlg:OnBnClickedTanh)ON_BN_CLICKED(IDC_IN, &Ctext2Dlg:OnBnClickedIn)ON_BN_CLICKED(IDC_XY, &Ctext2Dlg:OnBnClickedXy)ON_BN_CLICKED(IDC_KAILIFANG, &Ctext2Dlg:OnBnClickedKailifang)ON_BN_CLICKED(IDC_RADIO1, &Ctext2Dlg:OnBnClickedRadio1)ON_BN_CLICKED(IDC_RADIO2, &Ctext2Dlg:O

16、nBnClickedRadio2)ON_BN_CLICKED(IDC_FE, &Ctext2Dlg:OnBnClickedFe)ON_BN_CLICKED(IDC_YX, &Ctext2Dlg:OnBnClickedYx)ON_BN_CLICKED(IDC_INV, &Ctext2Dlg:OnBnClickedInv)ON_BN_CLICKED(IDC_MC, &Ctext2Dlg:OnBnClickedMc)ON_BN_CLICKED(IDC_MR, &Ctext2Dlg:OnBnClickedMr)ON_BN_CLICKED(IDC_MS, &

17、;Ctext2Dlg:OnBnClickedMs)ON_BN_CLICKED(IDC_MADD, &Ctext2Dlg:OnBnClickedMadd)ON_BN_CLICKED(IDC_MSUB, &Ctext2Dlg:OnBnClickedMsub)ON_BN_CLICKED(IDC_SIN2, &Ctext2Dlg:OnBnClickedSin2)ON_BN_CLICKED(IDC_COS2, &Ctext2Dlg:OnBnClickedCos2)ON_BN_CLICKED(IDC_TAN2, &Ctext2Dlg:OnBnClickedTan2)

18、ON_BN_CLICKED(IDC_PI2, &Ctext2Dlg:OnBnClickedPi2)END_MESSAGE_MAP()/ Ctext2Dlg 消息处理程序BOOL Ctext2Dlg:OnInitDialog()CDialogEx:OnInitDialog();/ 将“关于.”菜单项添加到系统菜单中。/ IDM_ABOUTBOX 必须在系统命令范围内。ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMe

19、nu(FALSE);if (pSysMenu != NULL)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);/ 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动/

20、执行此操作SetIcon(m_hIcon, TRUE);/ 设置大图标SetIcon(m_hIcon, FALSE);/ 设置小图标/ TODO: 在此添加额外的初始化代码return TRUE; / 除非将焦点设置到控件,否则返回 TRUEvoid Ctext2Dlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialogEx:OnSysCommand(nID, lParam);/ 如果向对话框添加最小

21、化按钮,则需要下面的代码/ 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,/ 这将由框架自动完成。void Ctext2Dlg:OnPaint()if (IsIconic()CPaintDC dc(this); / 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc(), 0);/ 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON

22、);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ 绘制图标dc.DrawIcon(x, y, m_hIcon);elseCDialogEx:OnPaint();/当用户拖动最小化窗口时系统调用此函数取得光标/显示。HCURSOR Ctext2Dlg:OnQueryDragIcon()return static_cast<HCURSOR>(m_hIcon);void Ctext2Dlg:OnBn

23、Clicked0() /以下19和“.”都是一个道理,在此写一个说明一下UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResultif(OperatorPressed=true|Restarted=true) /如果按下了"=","AC","sqrt","tan","sin"等按忸时,m_strResult="0" /变量m_strResult的值为按下的按忸"0"(否则下面会出现03.的情况出现)else m_strR

24、esult+="0" /在按下数字键的情况下,则在m_strResult后加"0"OperatorPressed=false; / OperatorPressed是bool型的变量 Restarted=false; / Restarted是bool型的变量 UpdateData(FALSE); /把字符串变量m_strResult传给编辑框void Ctext2Dlg:OnBnClicked1()UpdateData(TRUE); if(OperatorPressed=true|Restarted=true)m_strResult="1&quo

25、t; else m_strResult+="1"OperatorPressed=false; Restarted=false;UpdateData(FALSE); void Ctext2Dlg:OnBnClicked2()UpdateData(TRUE); if(OperatorPressed=true|Restarted=true)m_strResult="2" else m_strResult+="2"OperatorPressed=false; Restarted=false;UpdateData(FALSE); void Ct

26、ext2Dlg:OnBnClicked3()UpdateData(TRUE); if(OperatorPressed=true|Restarted=true)m_strResult="3" else m_strResult+="3"OperatorPressed=false; Restarted=false;UpdateData(FALSE); void Ctext2Dlg:OnBnClicked4()UpdateData(TRUE); if(OperatorPressed=true|Restarted=true)m_strResult="4&

27、quot; else m_strResult+="4"OperatorPressed=false; Restarted=false;UpdateData(FALSE); void Ctext2Dlg:OnBnClicked5()UpdateData(TRUE); if(OperatorPressed=true|Restarted=true)m_strResult="5" else m_strResult+="5"OperatorPressed=false; Restarted=false;UpdateData(FALSE); void

28、 Ctext2Dlg:OnBnClicked6()UpdateData(TRUE); if(OperatorPressed=true|Restarted=true)m_strResult="6" else m_strResult+="6"OperatorPressed=false; Restarted=false;UpdateData(FALSE); void Ctext2Dlg:OnBnClicked7()UpdateData(TRUE); if(OperatorPressed=true|Restarted=true)m_strResult="

29、;7"else m_strResult+="7"OperatorPressed=false; Restarted=false;UpdateData(FALSE); void Ctext2Dlg:OnBnClicked8()UpdateData(TRUE); if(OperatorPressed=true|Restarted=true)m_strResult="8" else m_strResult+="8"OperatorPressed=false; Restarted=false;UpdateData(FALSE); vo

30、id Ctext2Dlg:OnBnClicked9()UpdateData(TRUE); if(OperatorPressed=true|Restarted=true)m_strResult="9" else m_strResult+="9"OperatorPressed=false; Restarted=false;UpdateData(FALSE); void Ctext2Dlg:OnBnClickedPoint()UpdateData(TRUE); if(OperatorPressed=true|Restarted=true)m_strResult

31、="." else m_strResult+="."OperatorPressed=false; Restarted=false;UpdateData(FALSE); void Ctext2Dlg:OnBnClickedAdd() /以下“- * /”都是一个道理,在此写一个说明一下UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult m_strResult+="+" /在变量m_strResult后加"+" OperatorPressed=false; Restarted

32、=false; /把bool变量OperatorPressed和Restarted的值改为falseUpdateData(FALSE); /把字符串变量m_strResult传给编辑框 void Ctext2Dlg:OnBnClickedSub()UpdateData(TRUE); m_strResult+="-" OperatorPressed=false; Restarted=false;UpdateData(FALSE); void Ctext2Dlg:OnBnClickedmul()UpdateData(TRUE); m_strResult+="*&quo

33、t; OperatorPressed=false; Restarted=false;UpdateData(FALSE); void Ctext2Dlg:OnBnClickedDiv()UpdateData(TRUE); m_strResult+="/" OperatorPressed=false; Restarted=false;UpdateData(FALSE); void Ctext2Dlg:OnBnClickedEqual() UpdateData(TRUE);L1=true;int p=0,i=0,g10=0,k=0,j;for(;i<m_strResult.

34、GetLength();i+)if(m_strResult.GetAt(i)='(')j=p;gj=i;p+;for(;k<p;k+)Bracket(m_strResult,&gj);/调用Bracket(m_strResult)函数,解决括号问题j-; GetStr(m_strResult); /调用函数GetStr(m_strResult),作用是把m_strResult转化成数字和加减乘除四则运算 GetResult(); /调用函数GetResult(),作用是计算出表达式的值m_Edit3.Format(_T("%1f"),a0);w

35、hile(L=1)MOD(m_strResult);L=0;while(PB='E')EXP10(m_strResult);PB='#'while(PB='X')Xy(m_strResult);PB='#'while(PB='c')SqrtMul(m_strResult);ClearZero(m_Edit3); UpdateData(FALSE);OperatorPressed=true;void Ctext2Dlg:OnBnClickedBackspace()UpdateData(TRUE); /把编辑框显示的字

36、符串传给相应的变量m_strResult if(m_strResult!="0"&&m_strResult.GetLength()>1) /判断编辑框是否只剩下“0”或者是否有字符在编辑框上m_strResult=m_strResult.Left(m_strResult.GetLength()-1); /把m_strResult左边的数(长度已经减一)重新赋给m_strResultelseRestarted=true; /把bool变量Restarted的值改为truem_strResult="0" /变量m_strResult的值

37、为按下的按忸"0"UpdateData(FALSE);/把字符串变量m_strResult传给编辑框 void Ctext2Dlg:OnBnClickedC()Restarted=true; /把bool变量Restarted的值改为truem_strResult="0" /变量m_strResult的值为按下的按忸"0"UpdateData(FALSE);/把字符串变量m_strResult传给编辑框 void Ctext2Dlg:OnBnClickedSin() /以下“cos tan sinh cosh tanh”都是一个道理,

38、在此写一个说明一下UpdateData(TRUE);/把编辑框显示的字符串传给相应的变量m_strResult double result; /定义一个局部变量double型的result if(radio=1) /判断是否按下度(这里还没有设置梯度的消息命令响应函数)result=sin(_wtof(m_strResult)*6.2831853071795864769/360.0); /计算sin(度)的公式else result=sin(_wtof(m_strResult);/计算sin(弧度)的公式m_Edit3.Format(_T("%1f"),result);/将

39、result的double型数据转换成字符串,并传递给编辑框2的变量m_Edit3ClearZero(m_Edit3); /清零m_strResult=m_Edit3; /将编辑框2的变量m_Edit3上的字符串赋值给编辑框1的变量m_strResultOperatorPressed=true; /把bool变量OperatorPressed的值改为true UpdateData(FALSE); /把字符串变量m_strResult,m_Edit3传给各自的编辑框 void Ctext2Dlg:OnBnClickedCos()UpdateData(TRUE);double result;if(

40、radio=1)result=cos(_wtof(m_strResult)*6.2831853071795864769/360.0);else result=cos(_wtof(m_strResult);m_Edit3.Format(_T("%1f"),result);ClearZero(m_Edit3);m_strResult=m_Edit3;OperatorPressed=true; UpdateData(FALSE);void Ctext2Dlg:OnBnClickedTan()UpdateData(TRUE);double result; if(radio=1)re

41、sult=tan(_wtof(m_strResult)*6.2831853071795864769/360.0);else result=tan(_wtof(m_strResult);m_Edit3.Format(_T("%1f"),result);ClearZero(m_Edit3);m_strResult=m_Edit3;OperatorPressed=true; UpdateData(FALSE);void Ctext2Dlg:OnBnClickedSqrt()UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult double

42、 result; /定义一个局部变量double型的result result=sqrt(_wtof(m_strResult);/计算sqrtm_Edit3.Format(_T("%1f"),result);/将result的double型数据转换成字符串,并传递给编辑框2的变量m_Edit3ClearZero(m_Edit3); /清零OperatorPressed=true;/把bool变量OperatorPressed的值改为true UpdateData(FALSE);/把字符串变量m_Edit3传给编辑框double Ctext2Dlg:GetaStr(CStri

43、ng str) /这个函数的作用是将只有数字和.的字符串转成double的数值,即相当于_wtof()这个函数/这个函数也是自己添加int i=0;double rate=10.0,itemp=0.0;for(;i<str.GetLength();i+) if(isdigit(str.GetAt(i) /如果字符串str.GetAt(i)的内容是整数 if(rate=10.0) /整数部分itemp=itemp*rate+(str.GetAt(i)-'0');/获得整数else /小数部分itemp=itemp+rate*(str.GetAt(i)-'0'

44、);/获得小数rate=rate/10; /每次让rate小10倍else if(str.GetAt(i)='.') /如果str.GetAt(i)是小数点rate=0.1; /让rate=0.1,开始计算小数部分 return (itemp);void Ctext2Dlg:OnBnClickedLkouhao()UpdateData(TRUE); /把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed=true|Restarted=true)m_strResult="(" /变量m_strResult的值为按下的按

45、忸"(" else m_strResult+="(" /在按下数字键的情况下,则在m_strResult后加"("OperatorPressed=false; Restarted=false; /把bool变量OperatorPressed和Restarted的值改为falseUpdateData(FALSE); /把字符串变量m_strResult传给编辑框 void Ctext2Dlg:OnBnClickedRkouhao()UpdateData(TRUE); if(OperatorPressed=true|Restarted=t

46、rue)m_strResult=")" else m_strResult+=")"OperatorPressed=false; Restarted=false;UpdateData(FALSE); void Ctext2Dlg:Bracket(CString str0,int *h)/这个代码也是自己添加CString str1=_T(""),str2=_T(""),str3=_T("");int i=0;for(;i<str0.GetLength();i+) if(*h=i) /如果碰到了左括号 i+; /i自加一次,用来跳过左括号 for(;i<str0.GetLength();i+)if(str0.GetAt(i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论