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

📄 计算器dlg.cpp

📁 一个还不错的计算器,我自己写的,花了不少时间,功能比较多
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	countE(s);//计算常数e
	countLn(s);//计算对数
	countT(s);//计算三角函数	
	count3(s);//三级计算
	count2(s);//二级计算
	count1(s,1);//一级计算
	False1(s);//错误判断
	return s;
}

void CMyDlg::False1(CString & s)
{
	if(s.Find('.')!=s.ReverseFind('.'))
		False(s);
}

int CMyDlg::countPi(CString & s)
{
	int a=s.Find("Pi");
	if(-1==a)
		return -1;

	if((a>0 && (isdigit(s[a-1]) || '.'==s[a-1])) || (a<s.GetLength()-2 && (isdigit(s[a+2]) || '.'==s[a+2]))){
		False(s);
		return -1;
	}
	s.Replace(s.Mid(a,2),"3.1415926535897932384626433832795");
	sum=3.1415926535897932384626433832795;
	
	countPi(s);
	return 0;
}

int CMyDlg::countE(CString & s)
{
	int a=s.Find('E');
	if(-1==a)
		return -1;

	if((a>0 && (isdigit(s[a-1]) || '.'==s[a-1])) || (a<s.GetLength()-1 && (isdigit(s[a+1]) || '.'==s[a+1]))){
		False(s);
		return -1;
	}
	s.Replace(s.Mid(a,1),"2.718281828459045");
	sum=2.718281828459045;
	
	countE(s);
	return 0;
}

int CMyDlg::countLn(CString & s)
{
	return 0;
}

int CMyDlg::countT(CString & s)//字符串计算(*)
{
	int a=s.Find('n'),S=s.Find('s'),G=s.Find('g'),T=s.Find('t'),n=s.Find('N'),m=s.Find('G');
	if(-1==a && -1==S && -1==G && -1==T && -1==n && -1==m)
		return -1;
	a=max(max(a,S),max(max(m,n),max(G,T)));


if('N'==s[a]){
	if(a>1 && (isdigit(s[a-2]) || '.'==s[a-2])){
		False(s);
		return -1;
	}
}
else{
	if(a>2 && (isdigit(s[a-3]) || '.'==s[a-3])){
		False(s);
		return -1;
	}
}


	int x=a;
	if(a<s.GetLength()-1 && ('-'==s[a+1] || '+'==s[a+1]))
		if(a==s.GetLength()-2 || !(isdigit(s[a+2]) || s[a+2]==46)){
			False(s);
			return -1;
		}
		else x=a+1;
	int f=-1;
	for(int i=x+1;i<s.GetLength();i++)//后
		if(isdigit(s[i]) || s[i]==46)	f=i;
		else
			if('e'==s[i])	f=++i;
			else		break;

	if(-1==f){
		False(s);
		return -1;
	}

	CString s2=s.Mid(a+1,f-a);
	False1(s2);
	double b=strtod(s2,&stop);
	if(('N'==s[a] || 'G'==s[a]) && b<=0){
		False(s);
		return -1;
	}
	if(('n'==s[a] || 'g'==s[a] || 's'==s[a] || 't'==s[a]) && 1==three)
		b=b/180*3.1415926535897932384626433832796;
	double g;

	switch(s[a]){
	case 'N':
		g=log(b);
		break;
	case 'G':
		g=log10(b);
		break;
	case 'n':
		g=sin(b);
		break;
	case 's':
		g=cos(b);
		break;
	case 'g':
		g=tan(b);
		break;
	case 't':
		if(0==b){
			False(s);
			return -1;
		}
		g=1/tan(b);
		break;}

if(s[a]=='N')
	s.Replace(s.Mid(a-1,f-a+2),gcvt(g,15,e));
else
	s.Replace(s.Mid(a-2,f-a+3),gcvt(g,15,e));
	countT(s);
	return -1;
}

int CMyDlg::count3(CString & s)
{
	int a=s.Find('^');
	if(-1==a)
		return -1;

	int b=-1,f=-1;int x=a;	
	for(int i=a-1;i>=0;i--)//前
		if(isdigit(s[i]) || s[i]==46)	b=i;
		else
			if(('+'==s[i] || '-'==s[i]) && i>0 && 'e'==s[i-1])
				b=--i;
			else
				if(i<a-1 && ('+'==s[i] || '-'==s[i]) && (0==i || ('.'!=s[i-1] && !isdigit(s[i-1]))))//可以考虑去了"i<a-1"
					b=i;
				else break;

	if(-1==b){
		False(s);
		return -1;
	}
	CString s2=s.Mid(b,a-b);
	False1(s2);
	double d=strtod(s2,&stop);

	
	if(a<s.GetLength()-1 && ('-'==s[a+1] || '+'==s[a+1]))//后
		if(a==s.GetLength()-2 || !(isdigit(s[a+2]) || s[a+2]==46)){
			False(s);
			return -1;
		}
		else x=a+1;

	for(i=x+1;i<s.GetLength();i++)
		if(isdigit(s[i]) || s[i]==46)	f=i;
		else
			if('e'==s[i])	f=++i;
			else		break;

	if(-1==f){
		False(s);
		return -1;
	}
	s2=s.Mid(a+1,f-a);
	False1(s2);
  	double c=strtod(s2,&stop);

	double g=pow(d,c);

	gcvt(g,16,e);
	s.Replace(s.Mid(b,f-b+1),e);

	count3(s);
	return -1;
}

int CMyDlg::count2(CString & s)
{
	int a=s.Find("*"),z=s.Find("/");
	if(-1==a && -1==z)
		return -1;

	if(-1==a || -1==z)
		a=max(a,z);
	else a=min(a,z);

	int b=-1,f=-1;int x=a;	
		for(int i=a-1;i>=0;i--)//前
		if(isdigit(s[i]) || s[i]==46)	b=i;
		else
			if(('+'==s[i] || '-'==s[i]) && i>0 && 'e'==s[i-1])
				b=--i;
			else
				if(i<a-1 && ('+'==s[i] || '-'==s[i]) && (0==i || ('.'!=s[i-1] && !isdigit(s[i-1]))))//可以考虑去了"i<a-1"
					b=i;
				else break;

	if(-1==b){
		False(s);
		return -1;
	}
	CString s2=s.Mid(b,a-b);
	False1(s2);
	double d=strtod(s2,&stop);//str.Format

	
	if(a<s.GetLength()-1 && ('-'==s[a+1] || '+'==s[a+1]))//后
		if(a==s.GetLength()-2 || !(isdigit(s[a+2]) || s[a+2]==46)){
			False(s);
			return -1;
		}
		else x=a+1;

	for(i=x+1;i<s.GetLength();i++)
		if(isdigit(s[i]) || s[i]==46)	f=i;
		else
			if('e'==s[i])	f=++i;
			else		break;

	if(-1==f){
		False(s);
		return -1;
	}
	s2=s.Mid(a+1,f-a);
	False1(s2);
  	double c=strtod(s2,&stop);

	double g;
	if('*'==s[a])
		g=d*c;
	else{
		if(0==c){
			False(s);
			return -1;
		} 
		g=d/c;
	}

	gcvt(g,16,e);
	s.Replace(s.Mid(b,f-b+1),e);

	count2(s);
	return -1;
}

int CMyDlg::count1(CString & s,int y)
{
	int a=s.Find("+",y),z=s.Find("-",y);
	if(-1==a && -1==z)
		return -1;

	if(-1==a || -1==z)
		a=max(a,z);
	else a=min(a,z);

	if(a>0 && 'e'==s[a-1]){
		count1(s,a+1);
		return 0;
	}

	CString s2;
	double d;int b=-1,f=-1;int x=a;

if(0==a)//可以在这里增加正负的运算级
	d=0;
else{
		for(int i=a-1;i>=0;i--)//前
		if(isdigit(s[i]) || s[i]==46)	b=i;
		else
			if(('+'==s[i] || '-'==s[i]) && i>0 && 'e'==s[i-1])
				b=--i;
			else
				if(i<a-1 && ('+'==s[i] || '-'==s[i]) && (0==i || ('.'!=s[i-1] && !isdigit(s[i-1]))))//可以考虑去了"i<a-1"
					b=i;
				else break;

	if(-1==b){
		False(s);
		return -1;
	}
	s2=s.Mid(b,a-b);
	False1(s2);
	d=strtod(s2,&stop);//str.Format
}
	
	if(a<s.GetLength()-1 && ('-'==s[a+1] || '+'==s[a+1]))
		if(a==s.GetLength()-2 || !(isdigit(s[a+2]) || s[a+2]==46)){
			False(s);
			return -1;
		}
		else x=a+1;

	for(int i=x+1;i<s.GetLength();i++)
		if(isdigit(s[i]) || s[i]==46)	f=i;
		else
			if('e'==s[i])	f=++i;
			else		break;
	if(-1==f){
		False(s);
		return -1;
	}
	s2=s.Mid(a+1,f-a);
	False1(s2);
  	double c=strtod(s2,&stop);

	double g;
	if('+'==s[a])
	g=d+c;
	else g=d-c;

	gcvt(g,16,e);
	s.Replace(s.Mid(b,f-b+1),e);

	count1(s,1);
	return -1;
}

void CMyDlg::OnButton21() //-------------------------进制转换-------------------------------
{
	Two(2);
}

void CMyDlg::OnButton22() 
{
	Two(8);
}

void CMyDlg::OnButton23() 
{
	Two(10);
}

void CMyDlg::OnButton24() 
{
	Two(16);
}

void CMyDlg::Two(int a)
{
	char f[80];
	if(-1==str.Find('=')){
		CString s=str;
		brack(s);
		sum=strtod(s,&stop);
	}
	_itoa(sum,f,a);
	str+="\r\n=";
	str+=f;
	UpdateData(false);
}

void CMyDlg::OnRadio1() //------------------弧度---------------------------
{
	three=1;
}

void CMyDlg::OnRadio2() 
{
	three=0;	
}

void CMyDlg::OnButton36() //--------------------------------储存M--------------------------------------
{
	char f[80];
	if(-1==str.Find('=')){
		CString s=str;
		brack(s);
		sum=strtod(s,&stop);
	}

	double suM=sum+strtod(M,&stop);;
	gcvt(suM,16,f);
	M=f;
	UpdateData(false);	
}

void CMyDlg::OnButton37() 
{
	char f[80];
	if(-1==str.Find('=')){
		CString s=str;
		brack(s);
		sum=strtod(s,&stop);
	}

	double suM=strtod(M,&stop)-sum;
	gcvt(suM,16,f);
	M=f;
	UpdateData(false);
}

void CMyDlg::OnButton38() 
{
	M="";	
	UpdateData(false);
}

void CMyDlg::OnButton39() 
{
	str+=M;	
	UpdateData(false);
}

void CMyDlg::OnButton40() 
{
	char f[80];
	if(-1==str.Find('=')){
		CString s=str;
		brack(s);
		sum=strtod(s,&stop);
	}

	double suM=strtod(M,&stop)*sum;
	gcvt(suM,16,f);
	M=f;
	UpdateData(false);
	
}

void CMyDlg::OnButton41() 
{
	char f[80];
	if(-1==str.Find('=')){
		CString s=str;
		brack(s);
		sum=strtod(s,&stop);
	}

	double suM=strtod(M,&stop)/sum;
	gcvt(suM,16,f);
	M=f;
	UpdateData(false);	
}

void CMyDlg::False(CString &s)
{
	MessageBox("错误\n对不起你的输入错误","错误");	
	s="";
	test=1;
}

void CMyDlg::OnButton34() 
{
	char f[80];
	if(-1==str.Find('='))
		{
		CString s=str;
		brack(s);
	}
	sum=fabs(sum);
	gcvt(sum,16,f);
	str+="\r\n=";
	str+=f;
	UpdateData(false);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -