最近帮同学写了个关于计算器功能实现的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;
}