捌玖网络工作室's Archiver

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

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

在9月8日那天我特意编写的,给大家分享的,*w5v#rA~
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式IC7~(_0I
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)x*z6Q:`z3U f
参数解释:
m)p0pi.r)oq istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
W\Q(Q7`'n&WD nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
Fzwf1v-R$C 返回值:
@.?l*wC'Yu3l9M1u.r` 返回非0表示计算成功,0表示计算失败有错误WS9[?&V'[ s&ED
i a%bp z.A

]^ H^tt/RG!] ?
O-oa~'?/i+L:e*t 程序代码: 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%}?/a wS*r5eox
    char c=csym; csym=0;E j g)M`K
    switch(c){
qwQ*T#}o     case '+':return t[0] += t[1];
J [k P3I SD"fK     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
}}
9~!gE;{j\9bEh template <class _T, class _Tstream>
Om2BEg&g1DG /* _Tstream: inputstream, _T: get return value SB9qW6Ja}$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}; //雨中飞燕之作
^Fdg_ nP     char csym[3] = "++";
7SRg0yXJ0UR     int nLevel = 1, nERR = 0;
#R C:uyw6n     if(!(istrin>>t[1]))istrin.clear();
1fm p"r&vt     for(;;){[+m~pS _\
        if(istrin>>csym[2]){
A$X hN*{P:PB             switch(csym[2]){ OiF S&K/m;@
            case '(':
]&~E+E0`\                 if(!csym[1]){nLevel=0x100; nERR=1;}else
.\k?8r ik#|                 if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
w4^;Zp m P\'D                 else{nLevel=0x100; nERR=1;}
:^ b%l5U:lI                 break;}f,w}{6j'`L
            case ')':+s/H-Q/zZ2@T6eM
                {nLevel = 0x100;}break;0rvj$Q4`j6Xf,|
            case '+':case '-':case '*':case '/':
z'mg {&RmV a0Q                 {csym[nLevel++] = csym[2];}break;
5f_ Aw-qh _2BY             case ' ':case '\r':case '\n':case '\t':continue;"V\_R%j%N F3z!F
            default:
bR4G.|1V%[k[}                 {nLevel=0x100; nERR=1;}j C$bJQ
            }
4i|h,IZ*j{             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]=='/'){
?]p2vZ ST i                     GetExpValue(t+1, csym[1]);g8w'n}"Cc7@4D,}YkHV
                }j|A+r?"C
                else{
6g!G$d#s1?"L0Yz                     GetExpValue(t, csym[0]);#ffk jYX9G Tf
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;'m\_AT f
                })HDF_7Q`!E"t jE
                nLevel = 1;
ek3pZ(D5?             }
5a g+sL/K]             else istrin.clear();3y|*AW+t
        }#x+vU,]0W5XbZ
        else{nERR = -1; break;}
U5t,N\q8J4k     }
LUava     if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);!z} Z'tgh
    else nReturn=GetExpValue(t, csym[0]);
8ZZ d4@ r%_2S     return nERR==-1?1:0;4k O7K QQ-M8ab+x
}}
e"y6cqY
Exb;vkJl8c #[(y!eK1Q
{&e D k8h#sHHb[
函数模板使用示例:n%pLe;j!h0u
在以上那段代码的后面加上以下代码:e xE F(pM%gGO7w

Y,E0wV#{D Kq*{G)HS]Z H1X
wH;e0qeb;Q9H
程序代码:
h h)HE_.t*^/{0d)T
3[:[b1d+JBi pP #include<strstream>
N`^$y`@s #include<iostream>
YEs/cXGr0R #include<string>
t4]p$^Kp9z2J using namespace std;O/Jf Ait f
int main(void)
+aB%G%e2A1fH {
I?/\M\ ]V0[     string s1;&A TuW/or
    while(cin>>s1).~ N1E}_Z8znpa2p*D
    {n|i D3r"C&W
        istrstream isin(s1.data());9D$Em3`a8O3gnLk0bE
        double d;,x%yiWeu7{t
        if(fy_Exp::GetExpValue(isin, d))/sl'P2v}iq I:H
        {
FkPv#L&`;w8w!DJ             cout<<d<<endl;w2dC6y$?,[
        }
Dt3k"Mo0I"gL'G         else
v:ERMEt&B0a+\         {y ]*a4O;z7a0@I
            cout<<"ERROR"<<endl;l;LtW1qC:{-hp
        }
(n#C6WX O_D     }
vp9KK%zGk J&T\(`     return 0;
l b`o5@d?Q }+B\X a l|Zad

;C5Y8v6W9MT!HD7^&x O z4D4]+Y-?@$Odd$O,f
然后编译执行就可以了(*^_^*)+])YFfsj9Y2N
其它:TC++上一定编译错误,不保证在VC6上也能通过编译 W#K%ZNl(R
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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


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