| 订阅 | 在线投稿
分享
 
 
当前位置: 王朝网络 >> c/c++ >> C++计算四则表达式的模板
 

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++编译
 
 
 
上一篇《Windows下C语言网络编程快速入门》
下一篇《瘦身前后——兼谈C++语言进化》
 
 
 
 
 
 
日版宠物情人插曲《Winding Road》歌词

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

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

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

如何磨出破洞牛仔裤?牛仔裤怎么剪破洞?

把牛仔裤磨出有线的破洞 1、具体工具就是磨脚石,下面垫一个硬物,然后用磨脚石一直磨一直磨,到把那块磨薄了,用手撕开就好了。出来的洞啊很自然的。需要猫须的话调几...

我就是扫描下图得到了敬业福和爱国福

先来看下敬业福和爱国福 今年春节,支付宝再次推出了“五福红包”活动,表示要“把欠大家的敬业福都还给大家”。 今天该活动正式启动,和去年一样,需要收集“五福”...

冰箱异味产生的原因和臭味去除的方法

有时候我们打开冰箱就会闻到一股异味,冰箱里的这种异味是因为一些物质发出的气味的混合体,闻起来让人恶心。 产生这些异味的主要原因有以下几点。 1、很多人有这种习...

 
 
 
  在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++编译
󰈣󰈤
 
 
 
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
桌球宝贝_性感在蔓延(3)
桌球宝贝_性感在蔓延(2)
银杏树下清纯女孩(9)
银杏树下清纯女孩(8)
痞子的甘南日记
疑是银河落九天
雪域坝上四——纯美色
冬日恋歌——西城杨柳弄轻柔
 
>>返回首页<<
 
 
 为你推荐
 
 
 
 转载本文
 UBB代码 HTML代码
复制到剪贴板...
 
 热帖排行
 
 
 
 
©2005- 王朝网络 版权所有