当前位置:文档之家› 通俗易懂版基于MFC科学计算器

通俗易懂版基于MFC科学计算器

通俗易懂版基于MFC科学计算器
通俗易懂版基于MFC科学计算器

2013/6/22

作者编写的科学强大的易懂的新手入门的科学计算器,

基于MFC编写的科学计算器

指导教师对课程设计的评定意见

搞要本课程设计是在基于对话框的应用程序中模拟一个计算器,本计算器可以进行十进制下的四则运算(加、减、乘、除)和四则混合运算,可以把十进制转化为二进制或十六进制,可以进行一些常用的函数运算(比如sin、cos、tan、cot、sqrt、ln等),还可以支持带“(”,“)”符号的表达式的计算。系统开发平台为Windows XP,程序设计设计语言采用Visual C++6.0,程序运行平台为Windows 98/2000/XP。程序通过调试运行,初步实现了设计目标。

关键词程序设计;计算器;C++;

1 引言

在现代社会中,计算器已经进入了每一个家庭,人们在生活和学习中经常需要使用到计算器,它的出现大大减少了人们在计算方面的工作量,可以说它在人们生活和学习中是不可缺少的。

1.1C++介绍

C++语言的主要特点表现在两个方面,一是全面兼容C语言,二是支持面向对象的程序设计方法[1]。

(1) C++是一个更好的C,它保持了C语言的优点,大多数的C程序代码略作修改或不作修改就可在C++的集成环境下调试和运行。这对于继承和开发当前

已在广泛的软件是非常重要的,可以节省大量的人力和物力。

(2) C++是一种面向对象的程序设计语言它使得程序的各个模块的独立性更强,程序的可读性和可移植性更强,程序代码的结构更加合理,程序的扩充性更强。这对于设计、编制和调试一些大型的软件尤为重要。

(3) C++集成环境不仅支持C++程序的编译和调试,而且也支持C程序的编译和调试。通常,C++程序环境约定:当源程序文件的扩展名为c.时,则为C 程序;而当源程序文件的扩展名为cpp.时,则为C++程序。

(4) C++语句非常简练,对语法限制比较宽松,因此C++语法非常灵活。其优点是给用户编程带来书写上的方便。其缺点是由于编译时对语法限制比较宽松,许多逻辑上的错误不容易发现,给用户编程增加了难度。

3以下是详尽的代码

在C***Dlg添加下面代码,这个自己一定要看懂,里面是各个按钮的响应函数,不是叫你直接复制粘贴,而是一个个双击按钮添加代码,最后成了以下的样式。

// 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 CDialogEx

{

public:

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(CAboutDlg, 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(""))

, 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_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_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_BN_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, &Ctext2Dlg::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_CLICKED(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, &Ctext2Dlg::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::OnBnClickedCube)

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, &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::OnBnClickedRadio2)

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, &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)

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 = GetSystemMenu(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);

}

}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

// 执行此操作

SetIcon(m_hIcon, TRUE); // 设置大图标

SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码

return TRUE; // 除非将焦点设置到控件,否则返回TRUE }

void Ctext2Dlg::OnSysCommand(UINT nID, LPARAM lParam) {

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialogEx::OnSysCommand(nID, lParam);

}

}

// 如果向对话框添加最小化按钮,则需要下面的代码

// 来绘制该图标。对于使用文档/视图模型的MFC 应用程序,// 这将由框架自动完成。

void Ctext2Dlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND,

reinterpret_cast(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中

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;

// 绘制图标

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialogEx::OnPaint();

}

}

//当用户拖动最小化窗口时系统调用此函数取得光标

//显示。

HCURSOR Ctext2Dlg::OnQueryDragIcon()

{

return static_cast(m_hIcon);

}

void Ctext2Dlg::OnBnClicked0() //以下1~9和“.”都是一个道理,在此写一个说明一下

{

UpdateData(TRUE); //把编辑框显示的字符串传给相应的变量m_strResult

if(OperatorPressed==true||Restarted==true) //如果按下了"=","AC","sqrt","tan","sin"等按忸时,

m_strResult="0"; //变量m_strResult的值为按下的按忸"0"(否则下面会出现03...的情况出现)

else

m_strResult+="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";

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 Ctext2Dlg::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";

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 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="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);

}

void 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=".";

else

m_strResult+=".";

OperatorPressed=false;

Restarted=false;

UpdateData(FALSE);

}

void Ctext2Dlg::OnBnClickedAdd() //以下“- * /”都是一个道理,在此写一个说明一下

{

UpdateData(TRUE); //把编辑框显示的字符串传给相应的变量m_strResult m_strResult+="+"; //在变量m_strResult后加"+"

OperatorPressed=false;

Restarted=false; //把bool变量OperatorPressed和Restarted的值改为false

UpdateData(FALSE); //把字符串变量m_strResult传给编辑框

}

void Ctext2Dlg::OnBnClickedSub()

{

UpdateData(TRUE);

m_strResult+="-";

OperatorPressed=false;

Restarted=false;

UpdateData(FALSE);

}

void Ctext2Dlg::OnBnClickedmul() {

UpdateData(TRUE);

m_strResult+="*";

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,g[10]={0},k=0,j;

for(;i

{

if(m_strResult.GetAt(i)=='(')

{

j=p;

g[j]=i;

p++;

}

}

for(;k

{

Bracket(m_strResult,&g[j]);//调用Bracket(m_strResult)函数,解决括号问题

j--;

}

GetStr(m_strResult); //调用函数GetStr(m_strResult),作用是把m_strResult转化成数字和加减乘除四则运算

GetResult(); //调用函数GetResult(),作用是计算出表达式的值

m_Edit3.Format(_T("%1f"),a[0]);

while(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); //把编辑框显示的字符串传给相应的变量m_strResult if(m_strResult!="0"&&m_strResult.GetLength()>1) //判断编辑框是否只剩下“0”或者是否有字符在编辑框上

m_strResult=m_strResult.Left(m_strResult.GetLength()-1); //把m_strResult左边的数(长度已经减一)重新赋给m_strResult

else

{

Restarted=true; //把bool变量Restarted的值改为true

m_strResult="0"; //变量m_strResult的值为按下的按忸"0"

}

UpdateData(FALSE);//把字符串变量m_strResult传给编辑框

}

void Ctext2Dlg::OnBnClickedC()

{

Restarted=true; //把bool变量Restarted的值改为true

m_strResult="0"; //变量m_strResult的值为按下的按忸"0"

UpdateData(FALSE);//把字符串变量m_strResult传给编辑框

}

void Ctext2Dlg::OnBnClickedSin() //以下“cos tan sinh cosh tanh”都是一个道理,在此写一个说明一下

{

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);//将result的double型数据转换成字符串,并传递给编辑框2的变量m_Edit3

ClearZero(m_Edit3); //清零

m_strResult=m_Edit3; //将编辑框2的变量m_Edit3上的字符串赋值给编辑框1的变量m_strResult

OperatorPressed=true; //把bool变量OperatorPressed的值改为true

UpdateData(FALSE); //把字符串变量m_strResult,m_Edit3传给各自的编辑框

}

void Ctext2Dlg::OnBnClickedCos()

{

UpdateData(TRUE);

double result;

if(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)

result=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 result; //定义一个局部变量double型的result

result=sqrt(_wtof(m_strResult));//计算sqrt

m_Edit3.Format(_T("%1f"),result);//将result的double型数据转换成字符串,并传递给编辑框2的变量m_Edit3

ClearZero(m_Edit3); //清零

OperatorPressed=true;//把bool变量OperatorPressed的值改为true

UpdateData(FALSE);//把字符串变量m_Edit3传给编辑框

}

double Ctext2Dlg::GetaStr(CString str) //这个函数的作用是将只有数字和.的字符串转成double的数值,即相当于_wtof()这个函数

//这个函数也是自己添加

{

int i=0;

double rate=10.0,itemp=0.0;

for(;i

{

if(isdigit(str.GetAt(i))) //如果字符串str.GetAt(i)的内容是整数

{

if(rate==10.0) //整数部分

itemp=itemp*rate+(str.GetAt(i)-'0');//获得整数

else //小数部分

{

itemp=itemp+rate*(str.GetAt(i)-'0');//获得小数

rate=rate/10; //每次让rate小10倍

}

}

else if(str.GetAt(i)=='.') //如果str.GetAt(i)是小数点rate=0.1; //让rate=0.1,开始计算小数部分

}

return (itemp);

}

void Ctext2Dlg::OnBnClickedLkouhao()

{

UpdateData(TRUE); //把编辑框显示的字符串传给相应的变量m_strResult if(OperatorPressed==true||Restarted==true)

m_strResult="("; //变量m_strResult的值为按下的按忸"("

else

m_strResult+="("; //在按下数字键的情况下,则在m_strResult后加"("

OperatorPressed=false;

Restarted=false; //把bool变量OperatorPressed和Restarted的值改为false

UpdateData(FALSE); //把字符串变量m_strResult传给编辑框

}

void Ctext2Dlg::OnBnClickedRkouhao()

{

UpdateData(TRUE);

if(OperatorPressed==true||Restarted==true)

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

{

if(*h==i) //如果碰到了左括号

{

i++; //i自加一次,用来跳过左括号

for(;i

{

if(str0.GetAt(i)==')') break; //如果碰到右括号,跳出循环

str2+=str0.GetAt(i); //把括号内的表达式赋给str2 }

i++; //i自加一次,用来跳过右括号

for(;i

{

str3+=str0.GetAt(i); //把括号后边的表达式赋给str3 }

}

else

str1+=str0.GetAt(i); //把括号前边的表达式赋给str3 }

GetStr(str2);

//调用GetStr(str2)函数,把str2里的数字和运算符保存在数组中

GetResult(); //计算出表达式str2的值

for(i=0;i

if(str0.GetAt(i)=='(') //如果m_strResult中有括号

str2.Format(_T("%1f"),a[0]); //把a[0]转化为字符串赋给str2 m_strResult=str1+str2+str3;

//把str1,str2,str3的值加起来赋给m_strResult

}

void Ctext2Dlg::GetResult()//自己定义添加这个函数,代码如下

{

int i=0,x=0,y=1,t=0,z=1;

//这个循环的目的是把所有除法运算都改为乘法计算

for(i=0;i<=s;i++)

{

if(b[i]=='/') //当循环遇到除号时

{

a[i+1]=1/a[i+1]; //把a[i+1]的值改为1/a[i+1]

b[i]='*'; //把b[i]的值改为乘号}

}

//这个循环可以对所有乘法进行计算

for(i=0;i<=s;i++)

{

if(b[i]=='*') //当循环遇到乘号时

{

//如果i-t==2(再上次循环中,t被赋值成了i,这次2个值只相差2,说明表达式的情况是连续乘法,比如2*3*4)以2*3*4为例,在这个条件之前,函数已经进行了2*3的运算,其计算结果保存在原来的2中,把2的值覆盖了,这个条件的作用是让2*3的结果再和4相乘,结果保存在原来的2中

if(i-t==2)

{

a[t-z]=a[t-z]*a[i+1];

//进行乘法运算,把结果保存在前面的数组元素中

z=z+2;

//这里引进变量z,可以解决很多数连续相乘的问题,比如2*2*2*2*2*2 }

else

a[i-1]=a[i-1]*a[i+1];

//碰到乘号后把乘号前后2个数字相乘,结果保存在前面的数组元素

a[i+1]=1000000.0; //对乘号后面的数字初始化为0.0

b[i]=' '; //对乘号初始化为空格

//2数相乘后把乘号及其后面的数字初始化了,如果是2*3*4的情况,将会无法计算*4,所以要用开始的条件语句来解决

t=i; //把i的值赋给t }

}

//这个循环的目的是对数组a和b进行整理,因为已经进行了乘法和除法运算,进行运算的时候,把一些数字和运算符初始化了这个函数的作用可以使中间一些初始化了的数字和符号被后面的数字和符号代替,让数组可以重新排列for(i=0;i<=s;i++)

{

if(a[i]!=1000000.0) //如果a[i]的值不为0.0

{

a[x]=a[i]; //把a[i]的值赋给a[x]

x+=2; //x自加2 }

if(b[i]!=' ') //如果b[i]的值不为空格

{

b[y]=b[i]; //把b[i]的值赋给b[y]

y=y+2; //y自加2 }

}

//这个循环是进行最后的加减法运算

for(i=0,x=2;i<=y-2;i++)

//这里i的上限小于等于y-2,可以保证不进行多余的运算

{

if(b[i]=='+') //如果b[i]等于加号{

a[0]=a[0]+a[x];

x+=2;

}

//把加号后的数字和a[0]相加,结果保存在a[0]中

else if(b[i]=='-') //如果b[i]等于减号{

a[0]=a[0]-a[x];

x+=2;

}

//把减号后的数字和a[0]相减,结果保存在a[0]中

}

}

void Ctext2Dlg::GetStr(CString str)//这个自己根据类向导自己定义的函数,添加{

int i=0,z=0;

double rate=10.0,itemp=0.0;

for(i=0;i<20;i++)

a[i]=1000000.0; //对数组a[20]初始化

for(i=0;i<10;i++)

b[i]=' '; //对数组b[10]初始化

i=0; //把0赋给i

相关主题
文本预览
相关文档 最新文档