您的位置: 首页 >> 新闻中心 >> 计算机 >> 软件开发
C++函数模板实现四则表达式
精英教育阅读提示:一个很方便的C++函数模板,可以并且只可以计算含括号的四则表达式,只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
■ 最新课程推荐更多课程>>
学校培训课程开课时间上课地点精英价报名
正辰培训 微软软件测试工程师电话预约西直门教学区¥4704
新 科 海 软件测试工程师就业班电话预约海淀长远天地¥6280
北 师 大 软件工程与测试实战班电话预约北京师范大学¥1800
北 师 大 高级网络工程师就业班电话预约北京师范大学¥13000
金 同 方 网络工程师就业周末班电话预约人大总部¥7000

   参数解释:

  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是最佳选择

  Windows服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务。为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择。本文将建立并实现一个简单的服务程序,其功能是查询系统中可用物理内存数量,然后将结果写入一个文本文件。最后,你可以用所学知识编写自己的 Windows 服务。

  当初我写第一个 NT 服务时,我到 MSDN 上找例子。在那里我找到了一篇 Nigel Thompson 写的文章:“Creating a Simple Win32 Service in C++”,这篇文章附带一个 C++ 例子。虽然...[查看详情]

  影视动画培训   北大BEC培训官方报名网站   2008美国夏令营启航官方指定报名网站   2008留学第一站!  
  北师大 火星时代
共举影视动画培训之鼎
  北大BEC培训官方报名网站
现在报名独享95折!
  2008年国家职业资格考试
一次过关完全备考手册
  2008留学第一站
留学资讯尽在精英留学站!
 
上一篇:解读软件开发的理念
下一篇:Windows服务设计C是最佳选择
 相关新闻
·2006年下半年软件设计师考试答案·我从外行到专业的软件测试工程师
·软件工程师现有工作满意率仅为7.1%·软件资格和软件水平考试的业界评价
·风雨过后见彩虹 谈我的软考经历·自学通过软件设计师考试后的一些感想
·关于软件资格水平考试,我很想说几句·从软件设计师试题看软件测试七原则
·软件设计师考试必看 如何应考?·45天考过软考中级信息系统监理师心得
·软考超级Fans-五次软考心路历程·计算机软件水平考试应避免的五大失误
·通过软件设计师考试 专业能力很重要·2007年软件测试工程师需求继续增大
·从人性格看哪些人不适合做软件测试·软考三考三捷 我是怎么备考和应考的
 
◇ 重点栏目导航
◇ 精英服务承诺
教育顾问:010-51660910
QQ交流:138660910
相关资料
·软件测试新手的修炼之路
·Smarty简体中文参考手册
·Struts中文手册
·Struts快速学习指南
·ultradev动态网页制作教程
·UML工具箱
·《设计模式》中文版
·学友Flash伴侣 1.11
·阿须图像水印(AssureMark)V2.0
·超级语霸
相关试题
·2007年全国CPA考试试卷及答案解析之《会
·2007年CPA试卷及答案解析之《财务成本管
·2008年注会考前模拟试题之《财务成本管理
·2007年全国CPA《税法》考试试卷及答案解
·2008年中级会计职称《经济法》试题及答案
·2008年注册会计师考前模拟试题参考答案之
·2008年注册会计师考前模拟试题之《会计》
·2008年注册会计师考前模拟试题之《税法》
·2008年高校招生全国统考理数试题(四川延
·2008年全国高考物理科试题参考答案(上海
相关热贴
·如何改QQ IP地址!
·恰当选择软件测试自动化方案
·ADO.NET学习总结
·.net操纵xml文件类(c#)
·Log4net教程
·VPN技术详解
·高手必读 网络端口安全防护技巧放送
·访问XP共享出现的问题解决办法
·Web2.0时代,RSS你会用了吗?(技术实现总
·.NET下正则表达式应用的四个示例