一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,一个很方便的函数模板,可以并且只可以计算含括号的四则表达式UQxheK&K
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
参数解释:U$C#M6D_sVL
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流[u;_x)?5{"]r{
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
返回值:.[-dy d4G
返回非0表示计算成功,0表示计算失败有错误
~$VUM1B|h
程序代码:
namespace fy_Exp{
namespace {template <class _T>
inline _T GetExpValue(_T t[], char& csym){9uQT9JlN)}
char c=csym; csym=0;
switch(c){4h2[+B)\LU+~i:z
case '+':return t[0] += t[1];
case '-':return t[0] -= t[1];%f$[9h~;z)N
case '*':return t[0] *= t[1];2v~(m t6s-b4i`6A8DK7|
default: return t[0] /= t[1];//case '/':Au.R7cT7ndp?6k9j#C
}
}}
template <class _T, class _Tstream>
/* _Tstream: inputstream, _T: get return value
* Return nonzero if get value successfully */\)y @x wv1}+~
int GetExpValue(_Tstream& istrin, _T& nReturn){
_T t[3] = {0}; //雨中飞燕之作
char csym[3] = "++";!p$Q0uw@ {~
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;(Bp.M:bN^J
else{nLevel=0x100; nERR=1;}C9p0w%`#O#}&B)tT
break;9P+GF!SW4h#|N
case ')':)f:C4A.@2DB.`9gtp
{nLevel = 0x100;}break;S7u0m(V\%r0h%c;Zt
case '+':case '-':case '*':case '/':-a D&?%D u@:Cx
{csym[nLevel++] = csym[2];}break;
case ' ':case '\r':case '\n':case '\t':continue;
default:Sci5Y.h,hy
{nLevel=0x100; nERR=1;}
}j/_w%N;z-e
if(nLevel==0x100)break;
if(nLevel&0x10 || istrin>>t[2]){
nLevel &= 0xF;7C)`^{'WY%e
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
if(csym[1]=='*'||csym[1]=='/'){|.S]7r y7jq
GetExpValue(t+1, csym[1]);~!W [ ezAN*t3|
}-Ljg3@)D8b
else{7jy.J:AHxy
GetExpValue(t, csym[0]);
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
}
nLevel = 1;6nB;wq'g
}v(K}y#Q:pD|j.X)T5c
else istrin.clear();/iP-YS9rI v%T9[R.s
}
else{nERR = -1; break;}
}+Cd0j!Y*R6[f}1N
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5D_se+?Om
else nReturn=GetExpValue(t, csym[0]);
return nERR==-1?1:0;
}}
-v$k'P0q]RL
XxLK8j
*y3zc+XO-E
函数模板使用示例:gk$},vKJ
在以上那段代码的后面加上以下代码:PlL eV9?'e~~'V
coN?D*i"l(t!n]
hB Df+P N9h5{U
程序代码: O EFG?{ EVk I3c"?
&b/J/z7OOb9o5D$e6e&n
#include<strstream>OwD2H0S]uK
#include<iostream>
#include<string>6d4Fn7GSoNK
using namespace std; JY{;i&G