| 導購 | 订阅 | 在线投稿
分享
 
 
 

C++计算四则表达式的模板

2008-06-01 02:11:04  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  在9月8日那天我特意编写给大家分享的,一个很方便的C++函数模板,可以并且只可以计算含括号的四则表达式,只有一个函数接口:int GetEXPValue(_Tstream& istrin, _T& nReturn)

  参数解释:

  istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流

  nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定

  返回值:

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

  程序代码:

  

  以下是引用片段:

  namespace fy_Exp{

  namespace {template

  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

  /* _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;

  }}

  函数模板使用示例:

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

  

  以下是引用片段:

  程序代码:

  #include

  #include

  #include

  using namespace std;

  int main(void)

  {

  string s1;

  while(cin>>s1)

  {

  istrstream isin(s1.data());

  double d;

  if(fy_Exp::GetExpValue(isin, d))

  {

  cout<

  }

  else

  {

  cout<<"ERROR"<

  }

  }

  return 0;

  }

  然后编译执行就可以了。

  其它:TC++上一定编译错误,不保证在VC6上也能通过编译。

  建议使用VC7或VC更高版本,或者使用GNU C++编译
 
 
 
  在9月8日那天我特意编写给大家分享的,一个很方便的C++函数模板,可以并且只可以计算含括号的四则表达式,只有一个函数接口:int GetEXPValue(_Tstream& istrin, _T& nReturn)   参数解释:   istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流   nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定   返回值:   返回非0表示计算成功,0表示计算失败有错误   程序代码: 以下是引用片段:   namespace fy_Exp{   namespace {template   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   /* _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;   }}   函数模板使用示例:   在以上那段代码的后面加上以下代码: 以下是引用片段:   程序代码:   #include   #include   #include   using namespace std;   int main(void)   {   string s1;   while(cin>>s1)   {   istrstream isin(s1.data());   double d;   if(fy_Exp::GetExpValue(isin, d))   {   cout<   }   else   {   cout<<"ERROR"<   }   }   return 0;   }   然后编译执行就可以了。   其它:TC++上一定编译错误,不保证在VC6上也能通过编译。   建议使用VC7或VC更高版本,或者使用GNU C++编译
󰈣󰈤
日版宠物情人插曲《Winding Road》歌词

日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。 最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。 歌手:Def...

兄弟共妻,我成了他们夜里的美食

老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...

 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
王朝网络微信公众号
微信扫码关注本站公众号 wangchaonetcn
 
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味著赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有