您的位置:首页 > 其它

自己写的四则运算,可加括号

2013-01-10 11:22 453 查看
#include<iostream>

#include<vector>

 

using namespace std;

double getnumber(char*&p)

{

 bool falg=true;

double num=0;

double prec=1;//小数点位数

double fnum=0;

if(*p=='-')

{falg=false;//数据为负数

p++;

}

while(*p)

{

if(*p>='0'&&*p<='9')

{num=num*10+*p-'0';p++;}

else

if(*p=='.')

{       p++;

 while(*p)

 {

        if(*p>='0'&&*p<='9')

  {

   prec=prec*0.1;

   fnum+=prec*(*p-'0');

   p++;

          }

  else

   break;

 }

}

else

break;

}

if(!falg)

return -(num+fnum);

return num+fnum;

}

//这个函数让p指向了下一个

bool Issign(char*&p,double&num)

{

 if(*p>='0'&&*p<='9')

 {

  //利用传入参数返回数据

  num=getnumber(p);

  return false;//非运算符号

 }

 else

  return true;//返回的p指向当前的运算符号

}

//利用这个计算

double complicate(double a,double b,char*p)

{

switch(*p)

{

case '+':return a+b;

case '-':return a-b;

case '*':return a*b;

case '/':return a/b;

}

}

//利用这个判断两个符号的优先级别

bool chose(char la,char rb)

{

 if(la=='*'||la=='/')

  return true;  //当优先级是左边比较高或者左右相等时,统一先算左边

 if(rb=='*'||rb=='/')//右边比较高时先算右边

  return false;

 return true;

}

//利用上面这个计算,当我们计算条件:遇到‘)’或者p为空且符号数组不为空时

//则调用下面这个函数

//作用,只进行一次括号内运算或者空

void complicateEx(vector<char>&sv,vector<double>&nv)

{

 bool falg=true;

 char rb;

 char*c;

 while(sv.size()!=0)

 {

  rb=sv.back();

  sv.pop_back();

  if(rb=='(')

   return ;

  else

  {

   char p;

/////////////////////////////////////在字符vector中选择合适的符号

   if(sv.size()!=0)

   {

    char la=sv.back();

             sv.pop_back();

    if(la=='(')//假如存在前一字符,不过为‘(’

    {

     p=rb;

    double b=nv.back();

    nv.pop_back();

   double a=nv.back();

    nv.pop_back();

    double num=complicate(a,b,&p);

    nv.push_back(num);

    return ;

   

   

    }

    else

    if(chose(la,rb))//返回真,左边为合适的

    {

     //nv.push_back()

     sv.push_back(rb);//所以押回rb

       p=la;

    falg=false;//说明要弹出三个

    }

    else//返回false,右边为合适的,所以押回左边

    { p=rb;   sv.push_back(la);     }

   }

   else

    p=rb;//假如不存在前一字符

/////////////////////////////////////////////

   

  

//存在两个字符情况,假如为la,则要弹出三个,假如是rb或者‘(’则只用弹出两个

   

   double b=nv.back();

   nv.pop_back();

   double a=nv.back();

    nv.pop_back();

  double c;

   if(!falg)

   {

    c=nv.back();

     nv.pop_back();

              //nv.push_back(b);

     double mid;

     mid=b;

     b=a;

     a=c;

     c=mid;

   }

   double num=complicate(a,b,&p);

   nv.push_back(num);

   if(!falg)

   {

    falg=true;

    nv.push_back(c);

   }

  }

 }

}

//封装一个压入函数

void push(char*&p,vector<char>&sv,vector<double>&nv)

{

double num;

             while(*p)

            {

    char pe=*p;

              if(*p==')')

     {

      p++;

      return ;

     }

     else

      if(Issign(p,num))

      { sv.push_back(pe); p++; }

      else

       nv.push_back(num);

                   

    }

 

}

void main()

{

vector<char> sv;

vector<double> nv;

char ch[40];

memset(ch,0,40);

cin.getline(ch,40);

char*p=ch;

while(*p)

{

 push(p,sv,nv);

 complicateEx(sv,nv);

}

cout<<nv.back();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  四则运算
相关文章推荐