计算表达式(加减乘除括号小数立方)

本文分享了一款使用C++编写的简易表达式计算器代码,该计算器支持加减乘除、指数运算、小数和括号,适用于学习C++语言的基础语法和数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用c++在原本只要求的加减基础上写了一个简易的表达式计算器,加入了中小括号,小数,还有立方。 新手上路,有许多不足之处,望体谅。下面直接上代码吧!

#include<iostream>
#include<string.h>
#include<math.h>
#include<stack>
using namespace std;
char c[1001];
int i=0;//当前锁定坐标
int len;//表达式长度
double num(int &i){
   double sum=0;
   bool isdot=false;
   double temp=0.1;
   while(c[i]>='0' && c[i]<='9'){
       if(!isdot){
           sum=sum*10+c[i]-'0';
       }
       else{
           sum=sum+(c[i]-'0')*temp;
           temp/=10;
       }
       i++;
       if(c[i]=='.'){
           i++;
           isdot=true;
       }
   }
   return sum;
}
double cal(double a,double b,char sign){
   if(sign=='^'){
       return pow(b,a);
   }
   if(sign=='+'){
       return a+b;
   }
   if(sign=='-'){
       return b-a;
   }
   if(sign=='/'){
       if(a==0){
           cout<<"ERROR";
           exit(0);
       }
       return b/a;
   }
   return a*b;
}
void check(char a){
   if(a=='+' || a=='-' || a=='*' || a=='/' || a=='^'){
       cout<<"ERROR";
       exit(0);
   }
}
int main(){
   cin>>c;
   len=strlen(c);
   stack<char>signal;
   stack<double>number;
   while(i<len){
       if(c[i]!='1'&&c[i]!='2'&&c[i]!='3'&&c[i]!='4'&&c[i]!='5'&&c[i]!='6'&&c[i]!='7'&&c[i]!='8'&&c[i]!='9'&&c[i]!='0'&&c[i]!='-'&&c[i]!='+'&&c[i]!='/'&&c[i]!='*'&&c[i]!='^'&&c[i]!='('&&c[i]!=')'&&c[i]!='['&&c[i]!=']'){
           cout<<"ERROR";
           exit(0);
       }
       if(c[i]>='0' && c[i]<='9'){
           number.push(num(i));
           continue;
       }
       if(c[i]=='+' || c[i]=='-'){
           check(c[i+1]);
           while(!signal.empty() && signal.top()!='(' && signal.top()!='['){
               char temp=signal.top();
               signal.pop();
               double a,b;
               a=number.top();
               number.pop();
               if(number.empty()){
                   b=0;
               }
               else{
                   b=number.top();
                   number.pop();
               }
               number.push(cal(a,b,temp));
           }
           signal.push(c[i]);
           i++;
           continue;
       }
       if(c[i]=='*' || c[i]=='/'){
           check(c[i+1]);
           while(!signal.empty() && signal.top()!='('&&signal.top()!='[' && signal.top()!='+' && signal.top()!='-'){
               char temp=signal.top();
               signal.pop();
               double a,b;
               a=number.top();
               number.pop();
               b=number.top();
               number.pop();
               number.push(cal(a,b,temp));
           }
           signal.push(c[i]);
           i++;
           continue;
       }
       if(c[i]=='^'){
           check(c[i+1]);
           while(!signal.empty() && signal.top()!='(' &&signal.top()!='['&& signal.top()!='+' && signal.top()!='-' && signal.top()!='*' && signal.top()!='/'){
               char temp=signal.top();
               signal.pop();
               double a,b;
               a=number.top();
               number.pop();
               b=number.top();
               number.pop();
               number.push(cal(a,b,temp));
           }
           signal.push(c[i]);
           i++;
           continue;
       }
       if(c[i]=='['){
           signal.push(c[i]);
           i++;
           continue;
       }
       if(c[i]=='('){
           signal.push(c[i]);
           i++;
           continue;
       }
       if(c[i]==']'){
           while(signal.top()!='['){
               if(signal.empty()){
                   cout<<"ERROR";
                   exit(0);
               }
               char temp=signal.top();
               signal.pop();
               double a,b;
               a=number.top();
               number.pop();
               b=number.top();
               number.pop();
               number.push(cal(a,b,temp));
           }
           signal.pop();
           i++;
           continue;
       }
       if(c[i]==')'){
           while(signal.top()!='('){
               if(signal.empty()){
                   cout<<"ERROR";
                   exit(0);
               }
               char temp=signal.top();
               signal.pop();
               double a,b;
               a=number.top();
               number.pop();
               b=number.top();
               number.pop();
               number.push(cal(a,b,temp));
           }
           signal.pop();
           i++;
           continue;
       }
       
   }
   while(!signal.empty() && signal.top()!='(' && signal.top()!='['){
       char temp=signal.top();
       signal.pop();
       double a,b;
       a=number.top();
       number.pop();
       b=number.top();
       number.pop();
       number.push(cal(a,b,temp));
   }
   cout<<number.top()<<endl;
   return 0;
}

输入输出样例(不需要加等号):在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值