• c++四则运算代码


      1 //Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->  //一个能处理四则运算的程序,实现语言C++,支持嵌套括号,可以处理实数,源码见下面:
      2  #include<iostream>
      3  #include <stdio.h>
      4  #include <string.h>
      5  
      6  #include<cmath>
      7  using namespace std;
      8  const int MAX=1000;
      9  
     10  
     11  
     12  class Input
     13  {
     14  public:
     15      Input()
     16      {
     17          for( int i = 0;i < MAX;i++ )
     18              Str_input[i] = '';
     19      }   
     20      char Str_input[MAX];
     21  }in;
     22  
     23  
     24  class Output
     25  {
     26  public:
     27      Output()
     28      {
     29          result = 0;
     30      }   
     31      void getRes( double res )
     32      {
     33          result = res;
     34      }
     35      double printRes()
     36      {
     37 //         cout<<"这个表达式的结果为:"<<result<<endl;
     38    return result;
     39      }
     40  private:
     41      double result;
     42  };
     43  
     44  template <class Type>       
     45  class STACK{                 //定义栈类
     46     private:
     47         Type base[MAX];
     48         int Size;
     49     public:
     50         STACK(){Size=0;};
     51         void push(Type a)     //入栈
     52         {
     53             base[Size]=a;
     54             Size++;
     55         }
     56         Type pop()            //出栈
     57         {
     58             return base[--Size];
     59         }
     60         int size()
     61         {
     62    return Size;
     63   }
     64  };
     65  
     66  
     67  
     68  class Calculate_Cla
     69  {
     70  public:
     71      bool IsData(char);
     72      bool IsSym(char);
     73      int IsPar(char);
     74      bool Check(char *);
     75      int setPri(char);                 //判断符号的优先极别
     76      double ToData(char*);               //把字符串转化为数值
     77      double Call(double,double,char);    //具体按符号计算
     78      int GetMatch(char* buffer,int pos); //利用栈找到匹配的括号
     79      void Opr( STACK<char>&, STACK<double>&, int& ); //利用栈计算
     80      double Calculate(char*, double& );   //字符串的读入及调配
     81  
     82  };
     83  bool Calculate_Cla::IsData(char ch)      //判断输入计算的数字是否为0-9  添加科学计数法e
     84  {
     85      return ((ch>='0'&&ch<='9')||ch=='.'||ch=='e')?true:false;//添加科学计数法e
     86  }
     87  bool Calculate_Cla::IsSym(char ch)      //判断是否输入非法运算符
     88  {
     89      return (ch=='+'||ch=='-'||ch=='*'||ch=='/')?true:false;
     90  }
     91  int Calculate_Cla::IsPar(char ch)  //判断是否'()'
     92  {
     93      if(ch=='(')
     94         return 1;
     95      if(ch==')')
     96         return -1;
     97      return 0;
     98  }
     99  bool Calculate_Cla::Check(char *ch)//检验小数点个数,>1报错 l
    100  {
    101      int a=0;
    102      for(int i=0;i<strlen(ch);i++)
    103          if(ch[i]=='.')
    104              a++;
    105          if(a>1)
    106              return false;
    107          return true;
    108  }
    109  int Calculate_Cla::setPri(char ch)          //符号的优先极别
    110  {
    111      switch(ch)
    112      {
    113      case '+':
    114          return 0;
    115      case '-':
    116          return 0;
    117      case '*':
    118          return 1;
    119      case '/':
    120          return 1;
    121      default:
    122          return -1;
    123      }
    124  }         
    125  double Calculate_Cla::ToData(char* ch)   //将数字转化为数值
    126  {
    127      int i,j,k,sumn=0;
    128      double sum=0.0,p=0.0,q=0.0;
    129   int summ=0;//科学计数法所表示的数据e
    130      if(!Check(ch)) return 0.0;
    131      for(i=0;i<strlen(ch);i++)             //读入整数部分
    132      {
    133          if(ch[i]!='.')
    134              sumn=sumn*10+(ch[i]-'0');
    135          else break;
    136      }
    137   if(strchr(ch, 'e')!=NULL)//判断是否为科学计数法e
    138   {/////////
    139   if(i<strlen(ch))
    140        for(j=i+1;j<strlen(ch);j++)        //小数部分,到e为止
    141     {
    142      if(ch[j]!='e')
    143           sum=sum*10+(ch[j]-'0');
    144      else break;
    145     }
    146   sum /= pow(10.0,(double)(strlen(ch)-6-i)); //有错
    147   if(ch[j]=='e'&&j<strlen(ch))
    148   {
    149 //    if(ch[j]!='')      //科学计数法部分e
    150     for(k=j+2;k<=j+4;k++)
    151        summ=summ*10+(ch[k]-'0');// ch[j]的ascii码减去0的ascii码
    152     if(ch[j+1]=='-')
    153     {
    154      double p=(sum+sumn)/pow(10,summ);
    155      return ((sum+sumn)/pow(10,summ));                    //返回值
    156     }
    157     if(ch[j+1]=='+')
    158     {
    159      double q=(sum+sumn)*pow(10,summ);
    160       return ((sum+sumn)*pow(10,summ));
    161     }
    162    }
    163   }/////////////////
    164   else if(strchr(ch, 'e')==NULL)//如果不含科学计数法e
    165   {
    166   if(i<strlen(ch))
    167    for(j=i+1;j<strlen(ch);j++)        //小数部分
    168     sum=sum*10+(ch[j]-'0');
    169   sum /= pow(10.0,(double)(strlen(ch)-1-i));
    170   return (sum+sumn);                      //返回值
    171   }
    172  }
    173  double Calculate_Cla::Call(double sum,double data,char ch)
    174  {
    175      double ans=0.0;
    176      switch(ch)
    177      {
    178      case '+':
    179          ans=sum+data;        
    180          break;
    181      case '-':
    182          ans=sum-data;
    183          break;
    184      case '*':
    185          ans=sum*data;
    186          break;
    187      case '/':
    188          if( data!=0.0 )
    189              ans=sum/data;
    190          else
    191          {
    192              cout<<"程序出现除0错误,终止!
    ";
    193              system("pause");
    194              exit(1);
    195          }
    196          break;
    197      default:ans=0.0;
    198          break;    
    199      }
    200      return ans;
    201  }
    202  int Calculate_Cla::GetMatch(char* buffer,int pos)     //利用栈找到匹配的括号
    203  {
    204      STACK<char> Temp;
    205      int i;
    206      for(i=pos;i<strlen(buffer);i++)
    207      {
    208          if(IsPar(buffer[i])==1)//左括号l
    209              Temp.push('0');
    210          if(IsPar(buffer[i])==-1)//右括号l
    211          {
    212              Temp.pop();//出栈l
    213              if(Temp.size()==0) return i;
    214          }
    215      }
    216      return -1;
    217  }
    218  void Calculate_Cla::Opr(STACK<char>& symbol,STACK<double>& data,int& mark)//运算符操作l
    219  {
    220      double sum;
    221      while(symbol.size()!=0)//运算符栈大小不为0,l
    222      {
    223          char tem=symbol.pop();//出栈l
    224          int temp=setPri(tem);//优先级l
    225          symbol.push(tem);//入栈l
    226          if(temp<mark)
    227              break;
    228          else
    229    {
    230              sum=Call(data.pop(),data.pop(),symbol.pop());
    231              data.push(sum);
    232          }
    233      }
    234  }
    235  double Calculate_Cla::Calculate(char* buffer,double& sum)   //字符串读入和各个函数调配
    236  {
    237      STACK<double> data;
    238      STACK<char> symbol;
    239      double ans;
    240      char temp[MAX];
    241      int ct=0,mark=0,tp=0;
    242      data.push(sum);//入栈l
    243      while(ct<=strlen(buffer))
    244      {
    245          if(IsData(buffer[ct]))            //如果是数字或小数点
    246          {
    247              while( ct < strlen(buffer) && IsData(buffer[ct]) )
    248     {
    249      temp[tp++]=buffer[ct++];
    250     }
    251    if(temp[tp-1]=='e')
    252    {
    253     for(int k=0;k<=3;k++)
    254      temp[tp++]=buffer[ct++];
    255     temp[tp]='';
    256    }
    257    else temp[tp]='';
    258              tp=0;                         //读到非数字也非小数为止
    259              ans=ToData(temp);             //把读到的字符串转化为数
    260              data.push(ans);      //将数字存入栈中l
    261             
    262              if(ct==strlen(buffer))        //已经独到字符串末尾
    263              {
    264                  mark=0;
    265                  Opr(symbol,data,mark);    //计算
    266                  sum=data.pop();           //此时data栈中还剩一个数据,即是结果
    267                  return sum;               //返回结果
    268              }
    269              else
    270     {
    271                  int mark=setPri(buffer[ct]);
    272                  Opr(symbol,data,mark);     //计算
    273              }
    274          }
    275          else if(IsSym(buffer[ct])&&buffer[ct-1]!='e')         //如果是运算符且不为指数部分
    276       symbol.push(buffer[ct++]);     //运算符入symbol栈
    277          else
    278          {
    279              char BF[100];int k=0;          //如果都不是,则只能是括号
    280              while( IsPar( buffer[ct] )!=1 && ct <= strlen(buffer) )
    281                  BF[k++] = buffer[ct++];
    282              BF[k]='';     
    283              if(IsPar(buffer[ct])==1)       //一旦读到左括号,寻找它匹配的右括号
    284              {
    285                  int i,j;
    286                  char Temp[100];
    287                  for(i=ct+1,j=0;i<GetMatch(buffer,ct);i++,j++)
    288                      Temp[j]=buffer[i];     //把这对括号中的字符串存入Temp
    289                  Temp[j]='';
    290                  data.push(Calculate(Temp,sum)); //递归调用Calculate直到没有括号
    291                             //然后开始计算,值层层返回最后将最终结果放入data栈
    292                  ct+=(strlen(Temp)+1);       //跳过已经处理完的字符
    293                  if(ct+1==strlen(buffer))    //这里考虑字符串以括号结尾的情况
    294                  {
    295                      mark=0;
    296                      Opr(symbol,data,mark);
    297                      sum=data.pop();
    298                      return sum;
    299                  }
    300                  else
    301                  {
    302                      mark=setPri(buffer[ct+1]); //不是的话继续计算
    303                      Opr(symbol,data,mark);
    304                  }
    305                  ct++;                           //读入下一个字符
    306              }
    307          }
    308      }
    309      return 0.;
    310  }
    311  
    312  
    313  
    314  class CheckStr
    315  {
    316  public:
    317      static int check( char *str )
    318      {
    319          int i;
    320          STACK<char> Temp;
    321          for( i = 0;i < strlen(str);i++ )
    322          {
    323              char t = str[i];
    324              if( !(  (int(str[i]) <= 57 && int(str[i]) >= 48) || str[i]=='(' || str[i]==')' || str[i]=='*'
    325                  || str[i]=='+' || str[i]=='-' || str[i]=='/' || str[i]=='.'||str[i]=='e')   )       //检测是否含有非法字符 添加科学计数法e
    326                  return 2;
    327              else if( str[i]=='(' )  
    328                  Temp.push('0');
    329              else if( str[i]==')' )
    330              {
    331                  if( Temp.size()<=0 )                                      //检测括号是否匹配,右括号是否过多
    332                      return 1;
    333                  else
    334                      Temp.pop();
    335              }
    336          }
    337          if( Temp.size()!=0 )                                                //检测括号是否匹配,左括号是否过多
    338              return 1;
    339          return 0;
    340      }
    341  };
    342  
    343 double function(char*Str_input)//Str_input代入equation[][]
    344  {
    345      double sum=0.0;
    346      cout.precision(12);
    347     
    348      Calculate_Cla cl;
    349      Output out;
    350  
    351      while(1)
    352      {
    353    Str_input;//输入模块
    354          int res = CheckStr::check(Str_input); //判断模块 in.Str_input
    355          if( res == 0 )
    356              break;
    357          else if( res == 1 )
    358              cout<<"输入字符串括号不匹配,请重新输入:
    ";
    359          else if( res == 2 )
    360              cout<<"输入字符串有非法字符,请重新输入:
    ";
    361          else
    362          {}
    363      }
    364      out.getRes( cl.Calculate(Str_input,sum) ); //计算模块
    365 //   out.printRes();                               //输出模块
    366      system("pause");
    367 //     return 0;
    368   return out.printRes();
    369  }
    370  void main()
    371  {
    372   char *fun="12.3e-001+(-4.56e+002)";
    373 //  char *fun="1.23+(-456)";
    374   double C=function(fun);
    375   cout<<"这个表达式的结果为:"<<C<<endl;
    376  }
  • 相关阅读:
    Webservise如何Webservise实现打印
    GridView和FormView中对时间的末尾处理
    WebService系统结构设计
    Panel的用法
    Div+CSS选项卡
    java运行环境配置
    电子商务购物车
    电子商务配置管理
    电子商务订单生成
    spring+redis+mysql做缓存操作 look
  • 原文地址:https://www.cnblogs.com/lyunyu/p/3288397.html
Copyright © 2020-2023  润新知