捌玖网络工作室's Archiver

zw2004 发表于 2008-1-21 20:17

一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,
~L)i&uLl7G 一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
(GeF9Pi 只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)eg.Ak'w"Z z E
参数解释:
YyU'?u.k istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流UL-R%?;XA.X%u/p)u
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定F)S/u"^K*_On
返回值: t^G;y-?'p
返回非0表示计算成功,0表示计算失败有错误*GA7];s q ?8b B`
?2ei4{B0d]w3m
"s"Z}.mq CD

h$j!k t H9bT 程序代码:
Mo A$@3y;L
I$D+TmG8~"c\ x namespace fy_Exp{|^.\H+j c)c
namespace {template <class _T>uP:DrsSd4x&R
inline _T GetExpValue(_T t[], char& csym){
9R1|2f)si r u;O!u[aHb     char c=csym; csym=0;/gU&}*x?u
    switch(c){FUGT5\x Yi*uv"I
    case '+':return t[0] += t[1];0d3M(I.n]DF0QAsJ
    case '-':return t[0] -= t[1];
Q t!mNB     case '*':return t[0] *= t[1];z2mS6s,W!p
    default: return t[0] /= t[1];//case '/':M2T-Gp"?^
    }#O:o'|}4S/S&Cc fb
}}$Qsx?]
template <class _T, class _Tstream>
ddPQ/l*s3j /* _Tstream: inputstream, _T: get return value*lm;D(zh-w2Fe|s R U
* Return nonzero if get value successfully */S fh&^^/h~
int GetExpValue(_Tstream& istrin, _T& nReturn){
(V6U4Y'Cm,V     _T t[3] = {0}; //雨中飞燕之作!r/~:tb;s'U
    char csym[3] = "++";]-]k;aaL4zU~`u
    int nLevel = 1, nERR = 0;"isKM;z
    if(!(istrin>>t[1]))istrin.clear();(vnE6Fi T
    for(;;){
X1z.f0N.L {7OR         if(istrin>>csym[2]){
D?2v1y5lg%s1b             switch(csym[2]){
{cM/m6ED!l3H             case '(':+Ud mZI8[l
                if(!csym[1]){nLevel=0x100; nERR=1;}else
4w8By&q(k                 if(!GetExpValue(istrin, t[2]))nLevel|=0x10;aXG BDq F
                else{nLevel=0x100; nERR=1;}
*fh T:j T l"ed`                 break;
`/y9B8Ly(T4@             case ')':_nMOOu.W C
                {nLevel = 0x100;}break;
2sijA/yR4Ep|OT             case '+':case '-':case '*':case '/':
+u3vS]9F9C;y+xV I                 {csym[nLevel++] = csym[2];}break;
0tJ(I2^}&jMR3@             case ' ':case '\r':case '\n':case '\t':continue;'~:q3M["b'q-v7W V
            default:k JI+eD~
                {nLevel=0x100; nERR=1;}9N2H!I3IH1E&r0V1XD
            }3GI]~/fa'@;M
            if(nLevel==0x100)break;F8E/bq"@1to E{
            if(nLevel&0x10 || istrin>>t[2]){
*t]&m*P ?!bE                 nLevel &= 0xF;e3cS*XY$d
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
^N"E'En&e V4R                 if(csym[1]=='*'||csym[1]=='/'){
F`k&Y q"@g.^                     GetExpValue(t+1, csym[1]);
u0X%R kcf                 }:[ ^1\6qn
                else{
Wk0^/F s}                     GetExpValue(t, csym[0]); ^/OSb;E Lf
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
%jj-fks7y                 }n E6i8w9X)i0i
                nLevel = 1;
8U F.\7Y B+F             }\D}.l6c/`.G&a9f
            else istrin.clear();%O2rO5i5qNl(r
        }
S-Z7Z|^4[bzH+\         else{nERR = -1; break;}XYGx"m!d z
    }
Y-dtw Z F     if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
!y,x l+t)G:Y@ X     else nReturn=GetExpValue(t, csym[0]);qZH!zNz
    return nERR==-1?1:0;1p_ `7lO-K X!Ow
}}E*d%g8n^ f#Gn} |%\
pdx!ZDq$CXK
c)r8~4_c

[&|1xZA] 函数模板使用示例:s_ \TH2@lz
在以上那段代码的后面加上以下代码:H*W5JB^-rr
m/[n Qg lg-k

1c,k)to h2K1}s
4ML;g'`S E 程序代码: 8L*{6o#Rj g/I
` _)z5{,d!}!@!T
#include<strstream>
` job1U J/^dL?c #include<iostream>O}2B4q#^h-}@
#include<string>N.`JG)G6lU D%L
using namespace std;
-d3{"k'~#C W int main(void)
WW%e"V6w {g0O#]6^ZUx
    string s1;
bu#A E-?e(L     while(cin>>s1)6BA8Zd*Ht g&lo
    {f @9Am]B+U7j
        istrstream isin(s1.data());
c qjlT fh'[.Fn         double d;
(SF,K8u;\{$O         if(fy_Exp::GetExpValue(isin, d))
:`+y gf3]-S\ s*Y0r9x         {
2| brWQ             cout<<d<<endl;,m5B[%{p g X'z:d
        }*~(D h;I|h
        else
z;y+K@EL&~@ z         {~fz.X ZX
            cout<<"ERROR"<<endl;
VO~Xj2R/v@         }5L9g;oY'hzv6V%Q_
    }
RL7pL;p     return 0;bv:LL3}
}
\3u/b?W j%FF5Lwa
"qA6[:~7mxD
U&D"My#q!wK2y 然后编译执行就可以了(*^_^*)
)E7`+J+GsX'f 其它:TC++上一定编译错误,不保证在VC6上也能通过编译m NR~D rU
      建议使用VC7或VC更高版本,或者使用GNU C++编译

页: [1]
【捌玖网络】已经运行:


Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.