点击这里给我发消息 点击这里给我发消息

一个计算四则表达式的模板

添加时间:2013-12-7
    相关阅读: 模板 程序 C++ VC
副标题#e#

    很方便的函数模板,可以并且只可以计算含括号的四则表达式只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)

    参数解释:

    istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定

    返回值:

    返回非0表示计算成功,0表示计算失败有错误

    程序代码:

       namespace fy_Exp{
   namespace {template <class _T>
   inline _T GetExpValue(_T t[], char& csym){
    char c=csym; csym=0;
    switch(c){
     case '+':return t[0] += t[1];
     case '-':return t[0] -= t[1];
     case '*':return t[0] *= t[1];
     default: return t[0] /= t[1];//case '/':
    }
  }}
  template <class _T, class _Tstream>
  /* _Tstream: inputstream, _T: get return value
  * Return nonzero if get value successfully */
  int GetExpValue(_Tstream& istrin, _T& nReturn){
   _T t[3] = {0}; //雨中飞燕之作
   char csym[3] = "++";
   int nLevel = 1, nERR = 0;
   if(!(istrin>>t[1]))istrin.clear();
   for(;;){
    if(istrin>>csym[2]){
     switch(csym[2]){
      case '(':
      if(!csym[1]){nLevel=0x100; nERR=1;}else
      if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
      else{nLevel=0x100; nERR=1;}
     break;
     case ')':
     {nLevel = 0x100;}break;
      case '+':case '-':case '*':case '/':
      {csym[nLevel++] = csym[2];}break;
       case ' ':case '\r':case '\n':case '\t':continue;
       default:
      {nLevel=0x100; nERR=1;}
      }
      if(nLevel==0x100)break;
      if(nLevel&0x10 || istrin>>t[2]){
      nLevel &= 0xF;
      if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
      if(csym[1]=='*'||csym[1]=='/'){
       GetExpValue(t+1, csym[1]);
      }
      else{
       GetExpValue(t, csym[0]);
       t[1]=t[2];csym[0]=csym[1];csym[1]=0;
      }
      nLevel = 1;
     }
     else istrin.clear();
    }
    else{nERR = -1; break;}
   }
   if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
   else nReturn=GetExpValue(t, csym[0]);
   return nERR==-1?1:0;
  }}

 

#p#副标题#e#

 

    函数模板使用示例:

    在以上那段代码的后面加上以下代码:

    程序代码:

 #include<strstream>
  #include<iostream>
  #include<string>
  using namespace std;
  int main(void)
  {
   string s1;
   while(cin>>s1)
   {
    istrstream isin(s1.data());
    double d;
    if(fy_Exp::GetExpValue(isin, d))
    {
     cout<<d<<endl;
    }
    else
    {
     cout<<"ERROR"<<endl;
     }
   }
   return 0;
  }

 

    然后编译执行就可以了。

    其它:TC++上一定编译错误,不保证在VC6上也能通过编译建议使用VC7或VC更高版本,或者使用GNU C++编译

相关一个计算四则表达式的模板

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册