一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,["j!E9\#}7W一个很方便的函数模板,可以并且只可以计算含括号的四则表达式0`_-y'E"}c!d [:pk}
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)Ck6V\/G)X
参数解释:eR dD/b3{'D5C
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定L5t0qF-p
返回值:0]'w)V0JIQ+O
返回非0表示计算成功,0表示计算失败有错误p;h%X I9B
,uY b8q$g!K&j,r0Y
B#~b,x7s$Y
/~8`2C7Y"} xAx
程序代码:
namespace fy_Exp{Ttt!A/Xr
namespace {template <class _T>
inline _T GetExpValue(_T t[], char& csym){&HM1c&U[6JDB
char c=csym; csym=0;!KZ.~X&~/bao
switch(c){
case '+':return t[0] += t[1];g oQ l"CK"f Q
case '-':return t[0] -= t[1];
case '*':return t[0] *= t[1];3fw3X^I1?(}u
default: return t[0] /= t[1];//case '/':d.z)|7gvL$of
}
}}
template <class _T, class _Tstream>
/* _Tstream: inputstream, _T: get return value
* Return nonzero if get value successfully */
int GetExpValue(_Tstream& istrin, _T& nReturn){PDWN8a&F}
_T t[3] = {0}; //雨中飞燕之作gf)L;Of%{
char csym[3] = "++";A)O |&Xo:S@F;G
int nLevel = 1, nERR = 0;
if(!(istrin>>t[1]))istrin.clear();*M9kiH}j9Df%yA l
for(;;){
if(istrin>>csym[2]){
switch(csym[2]){#[~A0I!i?!CdWhQ
case '(': O$l d7H-q
if(!csym[1]){nLevel=0x100; nERR=1;}else
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
else{nLevel=0x100; nERR=1;}
break;
case ')':)c,i5IH;^
{nLevel = 0x100;}break;
case '+':case '-':case '*':case '/':{1Wyo9s5~}~c
{csym[nLevel++] = csym[2];}break;
case ' ':case '\r':case '\n':case '\t':continue;E3V,bC"jpPH
default:
{nLevel=0x100; nERR=1;}
}
if(nLevel==0x100)break;'b0wa8z `
if(nLevel&0x10 || istrin>>t[2]){
nLevel &= 0xF;
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
if(csym[1]=='*'||csym[1]=='/'){xv l6Z*P'BI
GetExpValue(t+1, csym[1]);4@{p2R.b0th
}&a.}c:d\,H#x/mu
else{7Pgt9H#k7wT$g,h
GetExpValue(t, csym[0]);
t[1]=t[2];csym[0]=csym[1];csym[1]=0;@(m2pe/|^@#i vXd
}DS"M ]x+R6|'k#B4n
nLevel = 1;
}${'L;N fJHs?5e
else istrin.clear();
}S[v\9FR-A7s$Sr
else{nERR = -1; break;}
}
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]); I q7n s~TS
else nReturn=GetExpValue(t, csym[0]);
return nERR==-1?1:0;
}}0fz-`|/[Jt