一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,*w5v#rA ~一个很方便的函数模板,可以并且只可以计算含括号的四则表达式IC7~(_0I
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)x*z6Q:` z3Uf
参数解释:
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
返回值:
返回非0表示计算成功,0表示计算失败有错误WS9[?&V'[s&ED
i a%bpz.A
程序代码: j*j m*TUx7A
'|6d\OyA$O
namespace fy_Exp{)_-g&]KB-}
namespace {template <class _T>3B%f8@:DV-z9K4wc
inline _T GetExpValue(_T t[], char& csym){$E%}?/awS*r5eo x
char c=csym; csym=0;E j g)M`K
switch(c){
case '+':return t[0] += t[1];
case '-':return t[0] -= t[1];M7J S5C*nsR}[
case '*':return t[0] *= t[1]; m"sW+|3Mb-l$R0He
default: return t[0] /= t[1];//case '/':h~EXaX"W#z q
}%i"E!G/?~mj"z$l1D
}}
template <class _T, class _Tstream>
/* _Tstream: inputstream, _T: get return valueSB9qW6Ja}$E2|S
* Return nonzero if get value successfully */:t6?@#I }3A(s!c#x
int GetExpValue(_Tstream& istrin, _T& nReturn){!O \ EO/? z[3w
_T t[3] = {0}; //雨中飞燕之作
char csym[3] = "++";
int nLevel = 1, nERR = 0;
if(!(istrin>>t[1]))istrin.clear();
for(;;){[+m~pS_\
if(istrin>>csym[2]){
switch(csym[2]){ OiF S&K/m;@
case '(':
if(!csym[1]){nLevel=0x100; nERR=1;}else
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
else{nLevel=0x100; nERR=1;}
break;}f,w}{6j'`L
case ')':+s/H-Q/zZ2@T6eM
{nLevel = 0x100;}break;0rvj$Q4`j6Xf,|
case '+':case '-':case '*':case '/':
{csym[nLevel++] = csym[2];}break;
case ' ':case '\r':case '\n':case '\t':continue;"V\ _R%j%N F3z!F
default:
{nLevel=0x100; nERR=1;}jC$bJQ
}
if(nLevel==0x100)break;'iEAy]V
if(nLevel&0x10 || istrin>>t[2]){c1Z#D~'P/\O5g"P(^4B
nLevel &= 0xF;4I vk-KP%d@
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}m]U9Bo[ f
if(csym[1]=='*'||csym[1]=='/'){