捌玖网络工作室's Archiver

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

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

在9月8日那天我特意编写的,给大家分享的,
uy$|?Fpf'G 一个很方便的函数模板,可以并且只可以计算含括号的四则表达式!H-_ x2o#f;t
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn),^Z_k%yF2l
参数解释:GQ ][ Y)r ~f5W z w
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
eWPm0|/iXvN,x nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定!Vr7]j `Id{~y
返回值:
1d:oSKp-G:SAC 返回非0表示计算成功,0表示计算失败有错误
&V8z2Pi,r3V8Z .y fw'L$^&Q/zW

{~v-]"~.C.g[u:@
d | N:G g 程序代码:
GO#z;C? x)v YO2]wy1j1D&b {
namespace fy_Exp{
N7]2];ru8X namespace {template <class _T>:b"uuQ q#rF$~3}
inline _T GetExpValue(_T t[], char& csym){?5{4~ V6u{(o9e
    char c=csym; csym=0;
k#Yv Ex     switch(c){
'|;UD/E4U6R0V     case '+':return t[0] += t[1];8Jb O3?qop
    case '-':return t[0] -= t[1];:MK#h;r1^n-O
    case '*':return t[0] *= t[1];R{&sSo,L,c%d
    default: return t[0] /= t[1];//case '/':
!qvY0m{-~QF g     }H!p Rx[u)jW
}} J hA1]V v
template <class _T, class _Tstream>
s }CG3TA @KG /* _Tstream: inputstream, _T: get return value&b)?'{t7h;D)Y`UV5W
* Return nonzero if get value successfully */
'n mY G cs1o(G;X int GetExpValue(_Tstream& istrin, _T& nReturn){zqw"KM`f*M
    _T t[3] = {0}; //雨中飞燕之作$O}c b8oN9N
    char csym[3] = "++";}!iCg k*M
    int nLevel = 1, nERR = 0;'N/Ex$Z} B
    if(!(istrin>>t[1]))istrin.clear();
0`D8R!u8K"U     for(;;){
p2b,Vd:VO         if(istrin>>csym[2]){
D HRm@W7EN             switch(csym[2]){
?[/J%Ipl             case '(':
r#Z/XU y"U                 if(!csym[1]){nLevel=0x100; nERR=1;}else
j'z#[9g%bIzRw                 if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
_*v.?eYr(_                 else{nLevel=0x100; nERR=1;}
1V|Z8PWliwF:Hy                 break;
X"zhY fC.h8W+Nt             case ')':R }"dM.`7N` w'l
                {nLevel = 0x100;}break;6_)Av5gj/j#r)f
            case '+':case '-':case '*':case '/':
o$rh,R3pcKL                 {csym[nLevel++] = csym[2];}break;
9z[5O\6Z j             case ' ':case '\r':case '\n':case '\t':continue;
rd5q!d^V'Sd0G)Z             default:R+BWe)b
                {nLevel=0x100; nERR=1;}
/v9n+v5O&x Rp5d             }n,`8h[t.u G
            if(nLevel==0x100)break;&?3S2N&r6px kU
            if(nLevel&0x10 || istrin>>t[2]){
?*r*N;bn                 nLevel &= 0xF;#K6O C%b{:W e$s
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}k b#I KV J3hKn
                if(csym[1]=='*'||csym[1]=='/'){
g6td eQ%N3V X                     GetExpValue(t+1, csym[1]);
[2oDG!Cz9~                 }5m3|{5`&q A
                else{&u$w$v3fo!OCh
                    GetExpValue(t, csym[0]);
9GC$UMObnS                     t[1]=t[2];csym[0]=csym[1];csym[1]=0;
%RH.EB"l~+L                 }%U~ c0fym Z0Gj
                nLevel = 1;
4]HTonWz*@             }
r/sH AF,ui;d             else istrin.clear();;I1L2L*@+lo,oU#\ m4h:_
        }
/x;I!?6NT.Rx         else{nERR = -1; break;}z"w5] l!z(UK(y
    }
`lj|#aq#mEz     if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);,W2x_-qF:jW
    else nReturn=GetExpValue(t, csym[0]);B{*S-[&M7Im
    return nERR==-1?1:0;
]9Is J3J }}|MUq#P.B\G

8b wm2c(]{
N3O%w$I G{1H4a]
'E6L4`f2e~-}b0Tt 函数模板使用示例:U |8v |t B D%@^7c
在以上那段代码的后面加上以下代码:
4V6? \c;~
3t/jv[ ~s
!F b:e6vs *g+q(JWBl/O
程序代码: T[ }-n]G5a$X

D k'ae @#q'pxK #include<strstream>
m'd]mH'v iN8osN #include<iostream>'DY Y?P2yo0ai
#include<string>
,~a m9uC3}"?,]$jK-bK using namespace std;
"K3GR P6[Sg int main(void)
QG!C({{6m?v"Q:i {
s h5JxJ_*jZ     string s1;
Cj aj `$OH!I$I     while(cin>>s1)0l"G&GV_m3G`
    {*?jwGUN Feo6d6~
        istrstream isin(s1.data());
P2R[Q.\E         double d;
!cSk FN3Not/UY&l         if(fy_Exp::GetExpValue(isin, d))
7]kBw8c         {
QF&F6d2` [)|4_             cout<<d<<endl;6Ni%f3H Y0K5wl AW
        }
H-dm3Nx         else7Ef~u"\I)MB*_xqn
        {
7km'M j,q q;h.{             cout<<"ERROR"<<endl;_TqGEO
        } E7D Qg HYv2v _
    }e\9~ ak.p Ea;Z
    return 0;PL$\O3K?"gG
}-e*VV)R{}6w-s

:m {V.O5mNiu)g`t
O)K N!]O CX(N 然后编译执行就可以了(*^_^*)
!r Yi"[EgCQ~(|Q 其它:TC++上一定编译错误,不保证在VC6上也能通过编译
#s7M_*VS       建议使用VC7或VC更高版本,或者使用GNU C++编译

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


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