⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alculator.cpp

📁 MFC小程序
💻 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 + -