关于C++实现简单计算器功能的疑问

      最近帮同学写了个关于计算器功能实现的C++代码,要求的是实现+,-,*,/,并且提示错误,我是用字符串来接收,然后在拆开,我是用二维字符串来接收,一行是数字,一行是符号。实现是实现了,可是清除和存储是什么东西?怎么实现。还有我发现我这样做的话如果有括号加进来怎么办?萌新程序员求解?有没有更好一点的思想,大佬们。
#include<iostream>
#include<cmath>
#include<string>

using namespace std;

//判断算术是不是符合标准
bool panduan(string sb){
	bool a = false;
	int j=0,i=0;
	char b[100]; 
	strncpy(b,sb.c_str(),sb.length());
	//确保开头是数字
	if(b[0]<='9'&&b[0]>='0'&&b[sb.length()-1]=='='){
		//确保只有一个“=”号
	for(j=0;j<sb.length();j++){
		if(b[j]=='='){
		i++;
		}
	}
	if (i==1){
		//确保表达式只有数字和加减乘除等号
		for(j=0;j<sb.length();j++){
			if(b[j]<='9'&&b[j]>='0'||b[j]=='='||b[j]=='+'||b[j]=='-'||b[j]=='*'||b[j]=='/'){
			a=true;
			}
			else {
			cout<<"biaodashi is err"<<endl;
			a=false;
			break;
			}
		}
	}
	else{
		string err="denghao is error!!";
		cout<<err<<endl;
		a = false;
	}
	//确保符号之间不相连
	for(j=0;j<sb.length()-2;j++){
		if(b[j]=='='||b[j]=='+'||b[j]=='-'||b[j]=='*'||b[j]=='/'){
			if(b[j+1]=='='||b[j+1]=='+'||b[j+1]=='-'||b[j+1]=='*'||b[j+1]=='/'){
			a=false;
			cout<<"fuhao is error!"<<endl;
			break;
			}
		}
	}}
	else {cout<<"biaodashi is error!"<<endl;}
//	for(j=0;j<sb.length();j++){
//	cout<<b[j]<<endl;
//	}
	return a;
}

//计算结果
double jisuan(string sb){
double sum = 0;
int k=0,i,j;
char b[100];
strncpy(b,sb.c_str(),sb.length());
char c[20][10];//最多计算不超过10位的数字,每个表达式不超过10个数
//按符号切割字符串,偶数存数,奇数存符号
for(i=0;i<20;i=i+2){
	for(j=0;j<10;j++){
		if(b[k]=='='||b[k]=='+'||b[k]=='-'||b[k]=='*'||b[k]=='/'){
		  c[i+1][0]=b[k];
		  k++;
		break;
		}
		else{
		c[i][j]=b[k];
		k++;
		}
	}
}
//开始运算,先找到*或/
for(i=1;i<20;i=i+2){
	if(c[i][0]=='*'){
	  double a1,a2;
      sscanf(c[i-1],"%lf",&a1);
//	  cout<<a1<<endl;
	  sscanf(c[i+1],"%lf",&a2);
//	  cout<<a2<<endl;
	  a1=a1*a2;
//	  cout<<a1<<endl;
//将记录保存在i-1的位置,删除后两个节点
	  sprintf(c[i-1],"%lf",a1);
	  for(int j=i;j<18;j++){
		  for(int k=0;k<10;k++){
			  c[j][k]=c[j+2][k];
		  }
	  }
	  i=i-2;
	}
	if(c[i][0]=='/'){
	  double a1,a2;
      sscanf(c[i-1],"%lf",&a1);
	  sscanf(c[i+1],"%lf",&a2);
	  a1=a1/a2;
	  sprintf(c[i-1],"%lf",a1);
	 for(int j=i;j<18;j++){
		  for(int k=0;k<10;k++){
			  c[j][k]=c[j+2][k];
		  }
	  }
	 i=i-2;
	}
}
//再算加减
sscanf(c[0],"%lf",&sum);
for(i=1;i<20;i=i+2){
	if(c[i][0]=='+'){
	double a1;
	sscanf(c[i+1],"%lf",&a1);
	sum+=a1;
	}
  	if(c[i][0]=='-'){
	double a1;
	sscanf(c[i+1],"%lf",&a1);
	sum-=a1;
	}

}
//for(i=0;i<10;i++){
//	for(j=0;j<20;j++){
//		cout<<c[i][j];
//}
//	cout<<endl;
//}
return sum;
}

int main(){
string sb;
cout<<"-------------------欢迎使用------------------------"<<endl;
cout<<"制作人:"<<endl;
cout<<"输入C退出程序"<<endl;
cout<<"---------------------------------------------------"<<endl;
while(1){
cin>>sb;
if(sb=="c"){
	cout<<"感谢您的使用!!!!!"<<endl;
	break;
}
else{
bool a = panduan(sb);
	if(a){
		cout<<jisuan(sb)<<endl;
	}
}
}
return 0;
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值