软件课程设计基于MFC的多功能计算器样本_第1页
软件课程设计基于MFC的多功能计算器样本_第2页
软件课程设计基于MFC的多功能计算器样本_第3页
软件课程设计基于MFC的多功能计算器样本_第4页
软件课程设计基于MFC的多功能计算器样本_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

题目基于MFC多功能计算器设计一、设计目的编写一种计算器。二、语言环境编程语言:C++开发环境:VS目的软件运营平台:Windows64位机三、软件功能:图形化界面。实现计算器功能。输入加减乘除表达式,可以计算其成果。基本功能:计算表达式,计算阶乘,计算组合数,次幂,求次幂后取余,简朴分数加减乘除计算。扩展功能:在以上功能完毕基本上,可完毕更高精度计算,实现简朴高精度加减乘除阶乘运算。

基于MFC多功能计算器设计摘要计算器是人们寻常生活中常用电子产品之一,在人们生活中有着非常广泛应用,随着科学进步,计算器种类和功能也更加丰富。本次课程设计旨在基于MFC框架设计一种多功能计算器,可以实现含括号表达式计算,三角函数、开方、阶乘、排列组合等数学计算,进制转换,超过longlong范畴整数运算以及简朴分数四则运算。本次设计多功能计算器是基于MFC框架,以C++编程语言完毕,计算器使用中缀表达式求值算法计算含括号表达式,使用C++原则库函数进行相应数学计算,运用Boost库实现高精度整数运算。本计算器不但功能丰富,并且具备美观、功能清晰且操作以便界面。经多次测试,本计算器能即时精确地获得所需计算成果,并且能在输入错误时进行相应解决,充分减少了计算时难度,节约了时间。通过本次课程设计,掌握了MFC基本框架,对基本算法有了更加进一步理解。核心词:多功能计算器;MFC;C++编程语言;表达式计算;高精度

目录课题分析 3总体设计 3详细设计 43.1普通计算与科学计算 43.2高精度计算 73.3其他计算 83.3.1分数计算 83.3.2组合数计算 83.3.3进制转换 8程序调试与问题解决 94.1输入表达式错误引发程序异常 94.2输入表达式格式有误 94.3计算排列组合溢出 10运行结果 10总结 12

课题分析本次设计为多功能计算器,需要实现各种功能,为了使界面更加美观,功能更加清晰明了,也为了让使用者便于操作,因而本计算器使用MFC中TabControl控件对计算器进行分页[1],将计算器分为了四个板块,分别为:普通计算、科学计算、高精度计算和其她计算。普通计算板块不但可以实现普通四则运算、次幂及取模运算,还可以通过使用中缀表达式求值算法计算表达式值[2];科学计算板块不但包括普通计算板块中功能,还可以进行三角函数、阶乘、根号以及对数运算;高精度板块可以实现大整数加减乘除次幂与取模计算;其她板块中具有分数四则运算、组合数计算以及进制转换功能。程序总体功能框图如图1。图1程序功能框图总体设计图2所示为整体设计流程框图。由于本次课程设计要实现功能较多,如果放到一种页面上,既不美观,功能也不清晰,于是本计算器使用了MFC中TabControl控件,将计算器分为四个某些,每个某些拥有不同功能。打开本计算器后,计算器变量自动初始化,接着顾客选取自己所需要功能模块进行操作。选取普通计算或者科学计算页面后,顾客需要点击计算器上按钮来输入所需计算表达式,顾客所输入表达式会在编辑框中显示出来,当顾客按下等于后,计算器会执行操作,计算当前编辑框中值,并将成果返回到成果框中进行显示;否则,计算器会继续等待顾客输入。选取高精度计算页面后,顾客可以进行超过64位整数加减乘除、次幂以及取模持续运算。顾客通过按钮输入两个变量以及运算符,按下等号即可得到答案,接着顾客可以选取继续按下运算符,使用本次得到答案作为变量继续运算,也可以重新输入进行运算。选取其她计算页面之后,可以看到该页面分为三个某些,分别是分数计算、组合数计算和进制转换。在分数计算某些,顾客通过键盘输入分数分子和分母,可以进行两个分数之间加减乘除运算;在组合数计算某些,顾客输入两个整数n和m,点击计算后可以得到A(n,m)与C(n,m)值;在进制转换某些,顾客输入一种数字,选取当前数字进制后,再点击需要转换进制即可得到转换后成果。图2整体设计流程图详细设计3.1普通计算与科学计算科学计算板块与普通计算板块相比,新增了圆周率按钮与三角函数、阶乘、根号与对数计算,其她功能与普通计算板块一致,因而一起阐明。一方面,给编辑框添加类型为Value控件变量,变量类型为CString,变量名为result。接下来为每个按键添加事件解决程序,并且给清空键C添加bool型变量Restarted,初始化为true;给等号添加bool型变量OperatorPressed,初始化为true;给小数点添加bool型变量pt,初始化为false;给左括号和右括号分别添加int型变量cntleft和cntright,初始化为0。每个按键事件解决程序如下所述:(1)按下0到9数字按钮。先将编辑框中内容更新到编辑框所相应变量result中,判断上一次按键与否为等于,或者上一次操作与否将编辑框清空,或者当前result末尾字符与否为”)”,若满足三个中任意一种,那么result等于当前所按下字符,否则,在result末尾追加当前所按下字符。更新当前编辑框关联变量result值到编辑框内。详细流程如图3a所示。图3a按下数字按钮图3b按下小数点按钮(2)按下小数点按钮。如果当前数字中没有浮现过小数点(pt为false)并且最后一位为运算符,则在result末尾追加“0.”,否则判断上一次按键与否为等于或上一次操作与否将编辑框清空或者result末尾与否为右括号,如果满足,那么也在末尾追加“0.”,否则在末尾追加“.”。更新变量到编辑框。过程如图3b所示。图3c按下双目运算符按钮图3d按下单目运算符按钮(3)按下运算符。在本计算器中,有双目运算符和单目运算符两种。如图3c所示,按下双目运算符按钮后,一方面需要判断当前已输入字符串末尾与否也是一种运算符,如果是则将之前运算符替代为当前所按下运算符,如果末尾是左括号,那么在末尾追加0和当前运算符;若前一位不是运算符且当前不是第一次按键,就在字符串末尾追加该运算符,否则字符串等于该运算符。这样做就避免了输入错误而导致计算错误甚至程序崩溃。如图3d所示,按下单目运算符之后,将编辑中字符转换为数字后进行计算,将成果转化为字符串显示出来即可。如果编辑框中还存在运算符,那么会取第一种运算符之前数字进行运算。图3e按下左括号按钮图3f按下右括号按钮(4)按下括号。如图3e所示,按下左括号后,先判断编辑框与否已经清空,若是,则result等于左括号,否则,找到从右往左第一种运算符,在该运算符背面加上一种左括号,左括号个数cntleft加一,更新result值到编辑框。如图3f所示,按下右括号后,一方面要判断右括号个数与否少于左括号个数,如果满足才干添加右括号,否则忽视该次添加操作;左括号个数不不大于右括号个数时,若result最后一位就是左括号,那么在其背面添加0和右括号,如果是其她运算符,那么去掉该运算符再添加右括号,如果是数字,则直接添加右括号。右括号个数cntright加一,更新result值到编辑框。(5)退格按钮与清空按钮。按下退格按钮时,若当前编辑框尚未清空,就将该字符串末尾一位删去,此时需要判断与否删除了左括号、右括号或者是小数点,删除左右括号时,相应cntleft和cntright需要减一,删除小数点时,小数点标志pt要变为false。按下清空按钮时,编辑框内容显示0,所有变量重新初始化。(6)按下等于按钮。该处为本计算器核心,使用了中缀表达式求值算法,如图3g所示。由于输入表达式是一种字符串,因而一方面需要通过循环将其中数字与字符提取出来。使用两个栈分别存储数字与运算符[3],如果当前运算符优先级比栈顶元素优先级高,则入栈,否则从数字栈中弹出两个元素,从符号栈中弹出一种符号,计算其成果,再将成果压入数字栈。最后表达式成果即为数字栈栈顶元素,将该数字转化为字符串后更新到编辑框即可。图3g按下等于按钮3.2高精度计算高精度计算某些可以进行持续四则运算与取模、次幂操作,每次两个变量参加运算,得到成果可以继续作为一种变量参加下一次运算。在高精度计算当中,按钮事件响应与普通计算和科学计算中按键事件响应是相似,编辑框关联CString类型变量result,给清空键添加bool类型变量Restarted,给等号添加bool类型变量OperatorPressed。图4高精度计算实现高精度办法有诸多,此处选用了一种较为便捷又精确操作,使用C++Boost库中multipleprecision工具。输入需要计算式子,按下等于即可进行计算,如果式子中包括两个及其以上双目运算符,只计算第一次浮现运算符和其图4高精度计算3.3其她计算3.3.1分数计算分数计算中,顾客输入待计算两个分数,点击所需要进行运算类型,再按下等号即可进行计算。计算过程模仿手动计算过程,a/b+c/d=(a*d+b*c)/(b*d),a/b-c/d=(a*d-b*c)/(b*d),a/b*c/d=ac/bd,a/b/c/d=a*d/b*c,最后再将得到成果化简。将成果分子与分母GCD(最大公约数)求出,分子与分母同步除以GCD即可得到答案。3.3.2组合数计算组合数计算中,顾客输入整数n和m,点击计算按钮,即可求出A(n,m)与C(n,m)值。计算过程与手动计算过程一致,求得n!,(n-m)!,A(n,m)=n!/(n-m)!,求得m!,C(n,m)=A(n,m)/m!。3.3.3进制转换进制转换中,顾客在转换数字框中输入需要转换数字,选取该数字当迈进制,点击需要转换进制即可在下方得到转换后成果。由于输入N进制数字是字符串,因而计算器会先将输入字符串转化为十进制整数,接着调用_itoa_s函数将该十进制数进行进制转换。程序调试与问题解决4.1输入表达式错误引起程序异常图5输入错误引起异常将基本功能编写完毕开始测试程序时,发现,如果输入表达式不规范,程序将会浮现异常,如图5所示。引起该异常错误输入有诸多状况,通过多次重复测试,发现了如下几种会引起该异常状况:(1)持续输入运算符。(2)右括号个数多于左括号个数。(3)运算符后直接加上右括号。(4)以运算符开头或者左括号后直接加上运算符。通过断点调试发现,计算器每次运算时,数字栈每次弹出两个元素,符号栈弹出一种元素,但是进行以上不规范操作,导致数字栈中元素只剩余一种时,符号栈中元素个数依然不不大于等于一,因而数字栈空时仍进行弹栈操作,浮现错误。做出如下解决:(1)在计算某些,每次判断数字栈或者符号栈与否为空,并且在输入时判断与否持续点击了运算符,如果是,只保存最后一次运算符。(2)保证右括号个数恒不大于等于左括号个数。(3)如果运算符后直接点击右括号按钮,则去掉该运算符后加上右括号。(4)若表达式以非*/%^运算符开头,则在前方补0,若左括号为运算符,则在左括号与运算符之间补0。4.2输入表达式格式有误除引起异常错误输入外,尚有各种错误输入格式,有如下解决:(1)以小数点或运算符开头。如表达式“*3+5”“(.3+5)”,在这种状况下,在小数点或者运算符前自动补零,使显示对的。(2)数字后加左括号。如输入“3+5(”,依照Windows自带计算器解决,该括号应当放在从右往左第一种运算符之后,应显示为“3+(5”。(3)左括号后加右括号。错误显示为“()”,同样按照Windows自带计算器解决,在两个括号中间补零。(4)一种数字中浮现各种小数点。最初可以输入“3.14159.2”这种不对的数字,因而添加一种叫做ptbool型变量,来判断该数字中与否已经浮现过小数点。4.3计算排列组合溢出计算A(100,50)时,是将100阶乘除以50阶乘,这个数字显然超过了longlong范畴,因而此处选用cpp_int进行计算。运营成果图6普通计算板块(1)选取普通计算板块,输入一种包括加减乘除、次幂和取模表达式,按下等于后,得到计算成果,与实际成果一致。图7科学计算板块(2)选取科学计算板块,计算sin(98),计算成果与Windows自带计算器成果一致。图8高精度计算板块(3)选取高精度计算板块,计算100!,计算成果与Windows自带计算器成果一致。图9a分数计算板块(一)图9b分数计算板块(二)(4)选取分数计算板块,计算2/5*4/6得到成果4/15,与实际成果一致,如图9a所示。当输入分数分母为0时,分母显示inputerror,如图9b所示。图10a排列组合板块(一)图10b排列组合板块(二)(5)选取计算排列组合板块,如图10a所示,计算A(100,20)与C(100,20),成果与实际计算成果一致。如图10b所示,当输入n不大于m、n不大于零、m不大于零时,提示error。图11a进制转换板块(一)图11b进制转换板块(二)(6)选取进制转换板块,如图11a所示,将十进制数45487转化为16进制数,得到成果b1af,与实际成果一致;如图11b所示,当输入待转换数字进制有误时,显示inputerror。总结本次课程设计,不但可以让咱们学习到新知识,同步也能反映咱们对所学知识掌握限度。从最开始茫然,不懂得如何去,做到逐渐掌握MFC框架基本应用,这段过程中,我基本知识和技能,以及自己自学能力都得到了很大提高。本次课程设计是用C++语言编写,并且使用了MFC框架。在这个过程中,最明显收获就是理解和较为纯熟地掌握并运用了VS开放工具来设计界面并编写程序。这个过程中最困难不是做完一种简朴计算器,而是在初步完毕之后不断地测试以及调试,发现程序中所存在问题,并一一解决。这个过程毫无疑问是非常漫长,但是我收获却是非常丰富。我懂得了在此后工作发展和学习实践过程中,要有细心与耐心,要肯付出努力,知难而上。通过本次课程设计,我专业知识以及能力都得到了很大提高,并且还让我理解到了自己可以提高空间尚有很大。在此后学习生活和工作当中,都要独立思考,自己动手操作,接受挑战,迎难而上。

参照文献:[1]侯俊杰.进一步浅出MFC[M].湖北:华中理工大学出版社,[2]王迤冉,王华东.表达式求值一种实现办法[J].周口师范学院学报,,18(2):31-33[3]李橙,丁国栋.栈在表达式求值中应用[J].电脑知识与技术,(34):8156-5157

//CalculatorDlg.cpp:实现文献//#include"stdafx.h"#include"Calculator.h"#include"CalculatorDlg.h"#include"afxdialogex.h"#include"map"#include"stack"#include"Page1.h"#include"Page2.h"usingnamespacestd;#ifdef_DEBUG#definenewDEBUG_NEW#endif//用于应用程序“关于”菜单项CAboutDlg对话框classCAboutDlg:publicCDialogEx{public: CAboutDlg();//对话框数据#ifdefAFX_DESIGN_TIME enum{IDD=IDD_ABOUTBOX};#endif protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持//实现protected: DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialogEx(IDD_ABOUTBOX){}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){ CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg,CDialogEx)END_MESSAGE_MAP()//CCalculatorDlg对话框CCalculatorDlg::CCalculatorDlg(CWnd*pParent/*=NULL*/) :CDialog(IDD_CALCULATOR_DIALOG,pParent){ m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCCalculatorDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); DDX_Control(pDX,IDC_TAB1,m_tab);}BEGIN_MESSAGE_MAP(CCalculatorDlg,CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_NOTIFY(TCN_SELCHANGE,IDC_TAB1,&CCalculatorDlg::OnTcnSelchangeTab1)END_MESSAGE_MAP()//CCalculatorDlg消息解决程序BOOLCCalculatorDlg::OnInitDialog(){ CDialog::OnInitDialog(); //将“关于...”菜单项添加到系统菜单中。 //IDM_ABOUTBOX必要在系统命令范畴内。 ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) { BOOLbNameValid; CStringstrAboutMenu; bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } //设立此对话框图标。当应用程序主窗口不是对话框时,框架将自动 //执行此操作 SetIcon(m_hIcon,TRUE); //设立大图标 SetIcon(m_hIcon,FALSE); //设立小图标 //TODO:在此添加额外初始化代码 //SetWindowText(_T("Calculator")); CRecttemprect(0,0,670,450); CWnd::SetWindowPos(NULL,0,0,temprect.Width(),temprect.Height(),SWP_NOZORDER|SWP_NOMOVE); //为TabControl增长两个页面 m_tab.InsertItem(0,_T("普通")); m_tab.InsertItem(1,_T("科学")); m_tab.InsertItem(2,_T("高精度")); m_tab.InsertItem(3,_T("其她")); m_page1.Create(IDD_DIALOG1,GetDlgItem(IDC_TAB1)); m_page2.Create(IDD_DIALOG2,GetDlgItem(IDC_TAB1)); m_page3.Create(IDD_DIALOG3,GetDlgItem(IDC_TAB1)); m_page4.Create(IDD_DIALOG4,GetDlgItem(IDC_TAB1)); //创立两个对话框 //设定在Tab内显示范畴 CRectrc; m_tab.GetClientRect(&rc); rc.top+=20; rc.bottom-=0; rc.left+=0; rc.right-=0; m_page1.MoveWindow(&rc); m_page2.MoveWindow(&rc); m_page3.MoveWindow(&rc); m_page4.MoveWindow(&rc); //分别设立隐藏和显示 m_page1.ShowWindow(true); m_page2.ShowWindow(false); m_page3.ShowWindow(false); m_page4.ShowWindow(false); m_tab.SetCurSel(0); //保存当前选取 returnTRUE;//除非将焦点设立到控件,否则返回TRUE}voidCCalculatorDlg::OnSysCommand(UINTnID,LPARAMlParam){ if((nID&0xFFF0)==IDM_ABOUTBOX) { CAboutDlgdlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID,lParam); }}//如果向对话框添加最小化按钮,则需要下面代码//来绘制该图标。对于使用文档/视图模型MFC应用程序,//这将由框架自动完毕。voidCCalculatorDlg::OnPaint(){ if(IsIconic()) { CPaintDCdc(this);//用于绘制设备上下文 SendMessage(WM_ICONERASEBKGND,reinterpret_cast<WPARAM>(dc.GetSafeHdc()),0); //使图标在工作区矩形中居中 intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //绘制图标 dc.DrawIcon(x,y,m_hIcon); } else { CDialog::OnPaint(); }}//当顾客拖动最小化窗口时系统调用此函数获得光标//显示。HCURSORCCalculatorDlg::OnQueryDragIcon(){ returnstatic_cast<HCURSOR>(m_hIcon);}voidCCalculatorDlg::OnTcnSelchangeTab1(NMHDR*pNMHDR,LRESULT*pResult){ //TODO:在此添加控件告知解决程序代码 intCurSel=m_tab.GetCurSel(); switch(CurSel) { case0: m_page1.ShowWindow(true); m_page2.ShowWindow(false); m_page3.ShowWindow(false); m_page4.ShowWindow(false); break; case1: m_page1.ShowWindow(false); m_page2.ShowWindow(true); m_page3.ShowWindow(false); m_page4.ShowWindow(false); break; case2: m_page1.ShowWindow(false); m_page2.ShowWindow(false); m_page3.ShowWindow(false); m_page4.ShowWindow(true); break; case3: m_page1.ShowWindow(false); m_page2.ShowWindow(false); m_page3.ShowWindow(true); m_page4.ShowWindow(false); break; } *pResult=0;}

//Page1.cpp:实现文献//#include"stdafx.h"#include"CalculatorDlg.h"#include"Calculator.h"#include"Page1.h"#include"afxdialogex.h"#include"map"usingnamespacestd;//CPage1对话框IMPLEMENT_DYNAMIC(CPage1,CDialogEx)CPage1::CPage1(CWnd*pParent/*=NULL*/) :CDialogEx(IDD_DIALOG1,pParent) ,OperatorPressed(true) ,Restarted(true) ,result(_T("0")) ,cntleft(0) ,cntright(0) ,pt(false) ,realans(_T("")){}CPage1::~CPage1(){}voidCPage1::DoDataExchange(CDataExchange*pDX){ CDialogEx::DoDataExchange(pDX); DDX_Text(pDX,IDC_EDIT1,result); DDX_Text(pDX,IDC_ans,realans);}BEGIN_MESSAGE_MAP(CPage1,CDialogEx) ON_BN_CLICKED(IDC_BUTTON7,&CPage1::OnBnClickedButton7) ON_BN_CLICKED(IDC_BUTTON0,&CPage1::OnBnClickedButton0) ON_BN_CLICKED(IDC_BUTTON1,&CPage1::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2,&CPage1::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON3,&CPage1::OnBnClickedButton3) ON_BN_CLICKED(IDC_BUTTON4,&CPage1::OnBnClickedButton4) ON_BN_CLICKED(IDC_BUTTON5,&CPage1::OnBnClickedButton5) ON_BN_CLICKED(IDC_BUTTON6,&CPage1::OnBnClickedButton6) ON_BN_CLICKED(IDC_BUTTON8,&CPage1::OnBnClickedButton8) ON_BN_CLICKED(IDC_BUTTON9,&CPage1::OnBnClickedButton9) ON_BN_CLICKED(IDC_BUTTON_plus,&CPage1::OnBnClickedButtonplus) ON_BN_CLICKED(IDC_BUTTON_sub,&CPage1::OnBnClickedButtonsub) ON_BN_CLICKED(IDC_BUTTON_multi,&CPage1::OnBnClickedButtonmulti) ON_BN_CLICKED(IDC_BUTTON_div,&CPage1::OnBnClickedButtondiv) ON_BN_CLICKED(IDC_BUTTON_back,&CPage1::OnBnClickedButtonback) ON_BN_CLICKED(IDC_BUTTON_left,&CPage1::OnBnClickedButtonleft) ON_BN_CLICKED(IDC_BUTTON_right,&CPage1::OnBnClickedButtonright) ON_BN_CLICKED(IDC_BUTTON_mod,&CPage1::OnBnClickedButtonmod) ON_BN_CLICKED(IDC_BUTTON_clear,&CPage1::OnBnClickedButtonclear) ON_BN_CLICKED(IDC_BUTTON_power,&CPage1::OnBnClickedButtonpower) ON_BN_CLICKED(IDC_BUTTON_equal,&CPage1::OnBnClickedButtonequal) ON_BN_CLICKED(IDC_BUTTON_point,&CPage1::OnBnClickedButtonpoint)END_MESSAGE_MAP()//CPage1消息解决程序voidCPage1::OnBnClickedButton0(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="0"; elseresult+="0"; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButton1(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="1"; elseresult+="1"; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButton2(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="2"; elseresult+="2"; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButton3(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="3"; elseresult+="3"; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButton4(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="4"; elseresult+="4"; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButton5(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="5"; elseresult+="5"; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButton6(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="6"; elseresult+="6"; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButton7(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="7"; elseresult+="7"; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButton8(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="8"; elseresult+="8"; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButton9(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="9"; elseresult+="9"; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButtonpoint(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(pt==false) { intpos=result.GetLength()-1; if(isop()) result+="0."; elseif(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="0."; elseresult+="."; OperatorPressed=false; Restarted=false; } pt=true; UpdateData(FALSE);}voidCPage1::OnBnClickedButtonplus(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(OperatorPressed==true)result=realans; intpos=result.GetLength()-1; if(isop()) { if(result.GetAt(pos)=='(') result+="0+"; else { result=result.Left(pos); result+="+"; } } elseif(Restarted==true) result="+"; else result+="+"; OperatorPressed=false; Restarted=false; pt=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButtonsub(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(OperatorPressed==true)result=realans; intpos=result.GetLength()-1; if(isop()) { if(result.GetAt(pos)=='(') result+="0-"; else { result=result.Left(pos); result+="-"; } } elseif(Restarted==true) result="-"; else result+="-"; OperatorPressed=false; Restarted=false; pt=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButtonmulti(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(OperatorPressed==true)result=realans; intpos=result.GetLength()-1; if(isop()) { if(result.GetAt(pos)=='(') result+="0*"; else { result=result.Left(pos); result+="*"; } } elseif(Restarted==true) result="0*"; else result+="*"; OperatorPressed=false; Restarted=false; pt=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButtondiv(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(OperatorPressed==true)result=realans; intpos=result.GetLength()-1; if(isop()) { if(result.GetAt(pos)=='(') result+="0/"; else { result=result.Left(pos); result+="/"; } } elseif(Restarted==true) result="0/"; else result+="/"; OperatorPressed=false; Restarted=false; pt=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButtonleft(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(OperatorPressed==true)result=realans; if(Restarted==true) result="("; else { intpos=result.GetLength()-1; result.MakeReverse(); intp=result.FindOneOf(_T("+-*/^%(")); if(p==-1)p=pos+1; result.Insert(p,'('); result.MakeReverse(); } ++cntleft; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButtonright(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(OperatorPressed==true)result=realans; intpos=result.GetLength()-1; if(isop()&&cntleft>cntright) { if(result.GetAt(pos)=='(') result+="0)"; else { result=result.Left(pos); result+=")"; } ++cntright; } if(cntleft>cntright) result+=")",++cntright; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButtonmod(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(OperatorPressed==true)result=realans; intpos=result.GetLength()-1; if(isop()) { if(result.GetAt(pos)=='(') result+="0%"; else { result=result.Left(pos); result+="%"; } } elseif(Restarted==true) result="0%"; else result+="%"; OperatorPressed=false; Restarted=false; pt=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButtonpower(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(OperatorPressed==true)result=realans; intpos=result.GetLength()-1; if(isop()) { if(result.GetAt(pos)=='(') result+="0^"; else { result=result.Left(pos); result+="^"; } } elseif(Restarted==true) result="0^"; else result+="^"; OperatorPressed=false; Restarted=false; pt=false; UpdateData(FALSE);}voidCPage1::OnBnClickedButtonback(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); OperatorPressed=false; intpos=result.GetLength()-1; if(result!="0"&&pos>0) { if(result.GetAt(pos)=='(') --cntleft; if(result.GetAt(pos)==')') --cntright; if(result.GetAt(pos)=='.') pt=false; result=result.Left(pos); } else { Restarted=true; pt=false; result="0"; } UpdateData(FALSE);}voidCPage1::OnBnClickedButtonclear(){ //TODO:在此添加控件告知解决程序代码 Restarted=true; pt=false; result="0"; cntleft=cntright=0; UpdateData(FALSE);}voidCPage1::OnBnClickedButtonequal(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); cntleft=cntright=0; map<char,int>mp; while(num.size())num.pop(); while(fac.size())fac.pop(); mp.clear(); mp['+']=1,mp['-']=1,mp['*']=2,mp['/']=2,mp['%']=2,mp['^']=3,mp['(']=0; CStrings=result; CStringc=L""; intlen=s.GetLength(); if(isop()) s=s.Left(len-1); inti=0; while(i<len) { if((i==0)&&(mp[s[i]]==2||mp[s[i]]==3)) { num.push(0); fac.push(s[i]); i++; } intj=i; if(isnum(i)) { while(j<len&&isnum(j)) { if(j==0&&s[j]=='.') c+='0'; c+=s[j]; j++; } doublex=_wtof(c); num.push(x); c=""; i=j-1; } elseif(s[i]=='(') fac.push(s[i]); elseif(s[i]==')') { while(fac.size()&&fac.top()!='(') num.push(cal()); if(fac.size())fac.pop(); } else { while(fac.size()&&mp[fac.top()]>=mp[s[i]]) num.push(cal()); fac.push(s[i]); } i++; } while(fac.size()&&num.size()) num.push(cal()); if(fabs(num.top()-0)<1e-8) num.top()=0; charch[1000]; sprintf_s(ch,"%.15g",num.top()); realans=ch; UpdateData(FALSE); OperatorPressed=true; pt=false;}doubleCPage1::getans(doublea,charch,doubleb){ if(ch=='+') returna+b; if(ch=='-') returna-b; if(ch=='*') returna*b; if(ch=='/') returna/b; if(ch=='%') { inttmp=a/b; doubleret=(double)tmp*b; returna-ret; } if(ch=='^') returnpow(a,b); return0.0;}boolCPage1::isnum(inti){ if(isdigit(result[i])||result[i]=='.') returntrue; if(i==0) { if(result[i]=='+'||result[i]=='-'||isdigit(result[i])) returntrue; returnfalse; } if((result[i-1]=='(')&&(result[i]=='+'||result[i]=='-')) returntrue; returnfalse;}boolCPage1::isop(){ intpos=result.GetLength()-1; boolop=false; if(result.GetAt(pos)=='.'||result.GetAt(pos)=='+'||result.GetAt(pos)=='-'||result.GetAt(pos)=='*') op=true; elseif(result.GetAt(pos)=='/'||result.GetAt(pos)=='%'||result.GetAt(pos)=='^'||result.GetAt(pos)=='(') op=true; returnop;}doubleCPage1::cal(){ if(fac.top()=='(') { fac.pop(); doublex=num.top(); num.pop(); returnx; } if(num.empty())return0; doublen1=num.top(); num.pop(); if(fac.empty())return0; charch=fac.top(); fac.pop(); if(num.empty())returnn1; doublen2=num.top(); num.pop(); returngetans(n2,ch,n1);}

//Page2.cpp:实现文献//#include"stdafx.h"#include"Calculator.h"#include"Page2.h"#include"afxdialogex.h"#include"map"#include"stack"usingnamespacestd;//CPage2对话框IMPLEMENT_DYNAMIC(CPage2,CDialogEx)CPage2::CPage2(CWnd*pParent/*=NULL*/) :CDialogEx(IDD_DIALOG2,pParent) ,result(_T("0")) ,Restarted(true) ,OperatorPressed(true) ,cntleft(0) ,cntright(0) ,pt(0) ,realans(_T("")){}CPage2::~CPage2(){}voidCPage2::DoDataExchange(CDataExchange*pDX){ CDialogEx::DoDataExchange(pDX); DDX_Text(pDX,IDC_EDIT2,result); DDX_Text(pDX,IDC_ans,realans);}BEGIN_MESSAGE_MAP(CPage2,CDialogEx) ON_BN_CLICKED(IDC_BUTTON_pi,&CPage2::OnBnClickedButtonpi) ON_BN_CLICKED(IDC_BUTTON_clear,&CPage2::OnBnClickedButtonclear) ON_BN_CLICKED(IDC_BUTTON0,&CPage2::OnBnClickedButton0) ON_BN_CLICKED(IDC_BUTTON1,&CPage2::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2,&CPage2::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON3,&CPage2::OnBnClickedButton3) ON_BN_CLICKED(IDC_BUTTON4,&CPage2::OnBnClickedButton4) ON_BN_CLICKED(IDC_BUTTON5,&CPage2::OnBnClickedButton5) ON_BN_CLICKED(IDC_BUTTON6,&CPage2::OnBnClickedButton6) ON_BN_CLICKED(IDC_BUTTON7,&CPage2::OnBnClickedButton7) ON_BN_CLICKED(IDC_BUTTON8,&CPage2::OnBnClickedButton8) ON_BN_CLICKED(IDC_BUTTON9,&CPage2::OnBnClickedButton9) ON_BN_CLICKED(IDC_BUTTON_point,&CPage2::OnBnClickedButtonpoint) ON_BN_CLICKED(IDC_BUTTON_equal,&CPage2::OnBnClickedButtonequal) ON_BN_CLICKED(IDC_BUTTON_lg,&CPage2::OnBnClickedButtonlg) ON_BN_CLICKED(IDC_BUTTON_sin,&CPage2::OnBnClickedButtonsin) ON_BN_CLICKED(IDC_BUTTON_cos,&CPage2::OnBnClickedButtoncos) ON_BN_CLICKED(IDC_BUTTON_tan,&CPage2::OnBnClickedButtontan) ON_BN_CLICKED(IDC_BUTTON_sqrt,&CPage2::OnBnClickedButtonsqrt) ON_BN_CLICKED(IDC_BUTTON_plus,&CPage2::OnBnClickedButtonplus) ON_BN_CLICKED(IDC_BUTTON_sub,&CPage2::OnBnClickedButtonsub) ON_BN_CLICKED(IDC_BUTTON_multi,&CPage2::OnBnClickedButtonmulti) ON_BN_CLICKED(IDC_BUTTON_div,&CPage2::OnBnClickedButtondiv) ON_BN_CLICKED(IDC_BUTTON_factorail,&CPage2::OnBnClickedButtonfactorail) ON_BN_CLICKED(IDC_BUTTON_power,&CPage2::OnBnClickedButtonpower) ON_BN_CLICKED(IDC_BUTTON_left,&CPage2::OnBnClickedButtonleft) ON_BN_CLICKED(IDC_BUTTON_right,&CPage2::OnBnClickedButtonright) ON_BN_CLICKED(IDC_BUTTON_back,&CPage2::OnBnClickedButtonback) ON_BN_CLICKED(IDC_BUTTON_mod,&CPage2::OnBnClickedButtonmod)END_MESSAGE_MAP()//CPage2消息解决程序voidCPage2::OnBnClickedButtonpi(){ //TODO:在此添加控件告知解决程序代码 /*3.09550*/ UpdateData(TRUE); intpos=result.GetLength()-1; if(isop()&&result.GetAt(pos)!='.') result+="3.062"; else result="3.062"; OperatorPressed=true; Restarted=false; UpdateData(FALSE);}voidCPage2::OnBnClickedButtonlg(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(OperatorPressed==true)result=realans; doubletmp=_wtof(result); if(tmp<0) result="inputerror"; else { tmp=log10(tmp); charch[1000]; sprintf_s(ch,"%.15g",tmp); realans=ch; } UpdateData(FALSE); OperatorPressed=true;}voidCPage2::OnBnClickedButtonsin(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(OperatorPressed==true)result=realans; doubletmp=_wtof(result); tmp=acos(-1.0)/180.0*tmp; tmp=sin(tmp); charch[1000]; sprintf_s(ch,"%.15g",tmp); realans=ch; UpdateData(FALSE); OperatorPressed=true;}voidCPage2::OnBnClickedButtoncos(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(OperatorPressed==true)result=realans; doubletmp=_wtof(result); tmp=acos(-1.0)/180.0*tmp; tmp=cos(tmp); charch[1000]; sprintf_s(ch,"%.15g",tmp); realans=ch; UpdateData(FALSE); OperatorPressed=true;}voidCPage2::OnBnClickedButtontan(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(OperatorPressed==true)result=realans; doubletmp=_wtof(result); tmp=acos(-1.0)/180.0*tmp; tmp=tan(tmp); charch[1000]; sprintf_s(ch,"%.15g",tmp); realans=ch; UpdateData(FALSE); OperatorPressed=true;}voidCPage2::OnBnClickedButtonsqrt(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); if(OperatorPressed==true)result=realans; doubletmp=_wtof(result); if(tmp<0) result="inputerror\n"; else { tmp=sqrt(tmp); charch[1000]; sprintf_s(ch,"%.15g",tmp); realans=ch; } OperatorPressed=true; UpdateData(FALSE);}voidCPage2::OnBnClickedButton0(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="0"; elseresult+="0"; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage2::OnBnClickedButton1(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="1"; elseresult+="1"; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage2::OnBnClickedButton2(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="2"; elseresult+="2"; OperatorPressed=false; Restarted=false; UpdateData(FALSE);}voidCPage2::OnBnClickedButton3(){ //TODO:在此添加控件告知解决程序代码 UpdateData(TRUE); intpos=result.GetLength()-1; if(OperatorPressed==true||Restarted==true||result.GetAt(pos)==')') result="3"; elseresult+="3"; Operator

温馨提示

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

评论

0/150

提交评论