📄 alculator.cpp
字号:
// alculator.cpp : implementation file
//
#include "stdafx.h"
#include "p09005435.h"
#include "alculator.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Calculator dialog
Calculator::Calculator(CWnd* pParent /*=NULL*/)
: CDialog(Calculator::IDD, pParent)
{
//{{AFX_DATA_INIT(Calculator)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void Calculator::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(Calculator)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(Calculator, CDialog)
//{{AFX_MSG_MAP(Calculator)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Calculator message handlers
void move(double *p,char *q,int *r) //移动三个数组。
{
for(;*r!=2;r++)
*r=*(r+2);
for(;*q!='#';q++)
*q=*(q+1);
for(;*p!=9005435.09005435;p++)
*p=*(p+1);
}
///////////////////////////////////////////////////////////////////////////////////////////////
void add(double *p,char *q,int *r) //计算加法函数。
{
double *x=p;
char *y=q;
int *z=r;
*(p-1)=(*(p-1))+(*p);
move(x,y,z);
}
void jian(double *p,char *q,int *r) //计算减法函数。
{
double *x=p;
char *y=q;
int *z=r;
*(p-1)=(*(p-1))-(*p);
move(x,y,z);
}
void mutp(double *p,char *q,int *r) //计算乘法函数。
{
double *x=p;
char *y=q;
int *z=r;
*(p-1)=(*(p-1))*(*p);
move(x,y,z);
}
void div(double *p,char *q,int *r) //计算除法函数。
{
if(*p==0)
{
AfxMessageBox("笨蛋,除数为零了!"); //除数为零处理。
}
double *x=p;
char *y=q;
int *z=r;
*(p-1)=(*(p-1))/(*p);
move(x,y,z);
}
//////////////////////////////////////////////////////////////////////////////////////////////
void include(double *p,char *q,int *r) //括号处理。
{
double *x=p;
char *y=q;
int *z=r;
for(r++,q++;(*q)!='#';r++)
{
if((*r)==1)
p++;
else if(*q=='(')
include(p,q,r); //递归调用。
else
q++;
}
p=x;q=y;r=z; //指针还原。
for(q++,r++;*q!=')';r++) //计算括号内乘除。
{
if(*r==1)
p++;
else if (*q=='*')
{ mutp(p,q,r);r--;}
else if (*q=='/')
{ div(p,q,r);r--;}
else
q++;
}
p=x;q=y;r=z; //指针还原。
for(q++,r++;*q!=')';r++) //计算括号内加减。
{
if(*r==1)
p++;
else if (*q=='+')
{ add(p,q,r);r--;}
else if (*q=='-')
{ jian(p,q,r);r--;}
else
q++;
}
p=x;q=y;r=z;
for(;*y!='#';y++) //对两个数组调整。
*y=*(y+2);
for(;*z!=2;z++)
*(z+1)=*(z+3);
*r=1;
}
/////////////////////////////////////分离字符串函数。///////////////////
void seperate(double a[],char b[],int c[],char Formula[], int &countint, int &countchar , int &count,int l)
{
for(int i=0;i<l;i++)
{
if((('0'<=Formula[i])&&(Formula[i]<='9'))||(Formula[i]=='.'))
{
char s[20]; //找到有数就把它分离出来。
int n=0,cc=0;
double m=0.0;
for(i;(i<l)&&((('0'<=Formula[i])&&(Formula[i]<='9'))||(Formula[i]=='.'));i++)
{
s[cc]=Formula[i];
cc++;
}
i--;
for(int j=0; j<cc;j++)
{
if(s[j]=='.')
n=j;
}
if(n==0)
n=cc;
for(j=0;j<cc;j++) //将数变为duoble型。
{
if(s[j]!='.')
{
switch (s[j])
{
case '0':
m+=0;
break;
case '1':
if(n-j>0) m+=1*pow(10,(n-j-1));
else m+=1*pow(10,(n-j));
break;
case '2':
if(n-j>0) m+=2*pow(10,(n-j-1));
else m+=2*pow(10,(n-j));
break;
case '3':
if(n-j>0) m+=3*pow(10,(n-j-1));
else m+=3*pow(10,(n-j));
break;
case '4':
if(n-j>0) m+=4*pow(10,(n-j-1));
else m+=4*pow(10,(n-j));
break;
case '5':
if(n-j>0) m+=5*pow(10,(n-j-1));
else m+=5*pow(10,(n-j));
break;
case '6':
if(n-j>0) m+=6*pow(10,(n-j-1));
else m+=6*pow(10,(n-j));
break;
case '7':
if(n-j>0) m+=7*pow(10,(n-j-1));
else m+=7*pow(10,(n-j));
break;
case '8':
if(n-j>0) m+=8*pow(10,(n-j-1));
else m+=8*pow(10,(n-j));
break;
case '9':
if(n-j>0) m+=9*pow(10,(n-j-1));
else m+=9*pow(10,(n-j));
break;
}
}
}
a[countint]=m;
countint++;
c[count]=1;
}
else //把符号分离出来。
{
b[countchar]=Formula[i];
countchar++;
c[count]=0;
}
count++;
}
c[count]=2; //给每一数组设一结尾。
b[countchar]='#';
a[countint]=9005435.09005435;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
void Calculator::OnOK()
{
char Formula[100];
GetDlgItemText(IDC_ENTER,Formula,100); //读取。
int l=0;
l=strlen(Formula);
double a[20];
int c[40],count=0,countint=0,countchar=0; //定义三个数组,分别存放数、符号和标记它们的位置关系。
char b[20];
double *p=a;
int *r=c;
char *q=b;
seperate(a,b,c,Formula,countint,countchar,count,l); //分析字符串。
for(;*r!=2;r++) //计算括号。
{
if(*r==1)
p++;
else if((*q)=='(')
include(p,q,r);
else
q++;
}
q=b;p=a;r=c; //指针还原。
for(;*q!='#';r++) //计算乘除。
{
if(*r==1)
p++;
else if (*q=='*')
{ mutp(p,q,r);r--;}
else if (*q=='/')
{ div(p,q,r);r--;}
else
q++;
}
q=b;p=a;r=c; //指针还原。
for(;*q!='#';r++) //计算加减。
{
if(*r==1)
p++;
else if (*q=='+')
{ add(p,q,r);r--;}
else if (*q=='-')
{ jian(p,q,r);r--;}
else
q++;
}
char *h; //将结果改为字符串输出。
h=new char[20];
a[0]=a[0]*1.0;
_gcvt(a[0],15,h);
SetDlgItemText(IDC_PRINT,h);
delete h;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -