获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,# @  H! @. r. e. j: u4 S$ K
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& k9 t3 S+ ^: h7 q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
+ [2 t1 O3 M4 F0 X8 {4 A参数解释:- ]1 E( v$ }' ^/ ]0 s0 q, o- W& E2 q& ~
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! ?. u9 g- Y& b) Z* ]
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
, [! C; W# Z1 a' Y$ i返回值:
) c, ~* Q# C. e返回非0表示计算成功,0表示计算失败有错误$ _9 v6 M' R& _9 I7 s; Y

( b8 d& c5 D9 M& }6 O9 @) }; O
* E, z4 L  f" w9 X; Q$ H7 M( ]9 c, }9 r) q' ?
程序代码: 3 ^# L/ {- y% W9 c" Y% K

, j; _) K* o7 Y  O" r  i  gnamespace fy_Exp{
% V% k. s2 ~) K3 unamespace {template <class _T>5 D. \6 X  [7 l
inline _T GetExpValue(_T t[], char& csym){0 K( @- Z% F$ U1 c
    char c=csym; csym=0;6 N% O+ a- C' `8 k* ?* F2 B: U! ^
    switch(c){
  A/ _5 \- }* |/ M2 S% ^    case '+':return t[0] += t[1];
8 x: J% q- }6 D5 ~% O. a    case '-':return t[0] -= t[1];: g- t9 i9 b2 l4 N
    case '*':return t[0] *= t[1];
& O& s3 G; Y9 ?6 h1 P    default: return t[0] /= t[1];//case '/':! H& N; l% U# B, V/ G  \: o0 l
    }" k( y' n- C4 y& E$ f6 \
}}$ C! L! y2 h9 B7 ]
template <class _T, class _Tstream>7 s2 M- z: Y/ i1 F& T
/* _Tstream: inputstream, _T: get return value
) x. y/ n9 C$ I) R: q) F, d" Q* Return nonzero if get value successfully */( r/ d  T- h0 z& s0 J& j
int GetExpValue(_Tstream& istrin, _T& nReturn){* @# ~; M: o  N+ J
    _T t[3] = {0}; //雨中飞燕之作5 V: Y! `5 w0 C# C0 P* ^
    char csym[3] = "++";
" d, I7 r$ B/ a    int nLevel = 1, nERR = 0;
6 V* Q6 j9 n+ Q0 b1 r6 E! |! x    if(!(istrin>>t[1]))istrin.clear();
0 Y3 H2 `" N! Y8 D$ \$ B    for(;;){0 T3 E0 l. M2 a1 I, L+ y2 i
        if(istrin>>csym[2]){2 ~7 b& t  x& l7 f
            switch(csym[2]){- |+ ?/ U& `, q
            case '(':
9 K! ^. y/ _+ T+ N% |                if(!csym[1]){nLevel=0x100; nERR=1;}else
" ?: J4 W6 A3 j( g                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 Z( ]& r; T8 M/ ~) t7 w! f+ q                else{nLevel=0x100; nERR=1;}
3 R% S7 l0 d/ Z9 |6 G! B( z                break;
! _4 s. B5 h* F: x            case ')':
+ @6 C: M9 J+ y                {nLevel = 0x100;}break;
# ?; L  S5 Z2 [5 _3 M3 p            case '+':case '-':case '*':case '/':
7 p. u! c; ]; D                {csym[nLevel++] = csym[2];}break;
$ a9 w* h+ C- c            case ' ':case '\r':case '\n':case '\t':continue;- P& I4 R$ n, Z* o$ i0 X
            default:
5 [; b9 {, K3 K$ O7 Q                {nLevel=0x100; nERR=1;}
" Y0 i6 {: ^" ~- W; r- p            }
- g) J& ?) E# `2 q# C            if(nLevel==0x100)break;7 B' \: j# h. ^) e! |' r: F
            if(nLevel&0x10 || istrin>>t[2]){
3 ^! q: W+ h* d4 @+ z/ X; ?" p                nLevel &= 0xF;! r- v% t. ?' Q
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. I5 K6 q2 U8 ?; Y+ d! N' P
                if(csym[1]=='*'||csym[1]=='/'){+ j2 j% Z8 f) L/ W/ X1 E6 S: O
                    GetExpValue(t+1, csym[1]);
* P2 p$ [: s: E: @8 T5 W                }
# Y. N1 V6 B9 D9 x; I; K' q4 I                else{; L% y- ^+ W* N4 T; v
                    GetExpValue(t, csym[0]);- `" n% a' p+ u
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
, j. y5 f% D% _  A6 y% q0 n                }1 V8 M3 r3 [) o; L: T
                nLevel = 1;
! n3 s# Q( i/ C            }- S1 [" \  z8 T& B8 M/ A
            else istrin.clear();
  ]+ W; f4 A) q9 B        }
( {' O# r' n8 j# {) B$ e        else{nERR = -1; break;}
+ X, l2 ~" \5 H. Q0 c. }    }4 i; ?* h& \5 _, ~1 O, H' P/ o
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);6 L$ c8 B* B) w- v! c  j/ S1 C8 o
    else nReturn=GetExpValue(t, csym[0]);9 ?& ?$ q: X8 I: _1 L/ _7 H/ t
    return nERR==-1?1:0;
+ C& J/ O' Q! R$ m# U+ `3 O8 g" B}}! U, ~2 C* e2 Z7 `2 @

3 I* \$ A( S' e1 v, P/ a
3 T' H5 f) G& b" \" m; s9 a, R4 Y7 K4 z
函数模板使用示例:( n7 {5 s. M9 I4 K" A1 t/ `
在以上那段代码的后面加上以下代码:
4 N" ]9 P9 N" Z* F, S! [; ]
( N9 \+ ~0 R$ P. w- s7 C
2 @. Z% A3 `5 |! d2 ^! b
, @, A( _% s6 E( H程序代码:
4 q: y; j; C! ?; N2 l9 u
) y5 x* y) n6 N#include<strstream>0 Z  ~& n$ q+ J6 a
#include<iostream>
+ ?0 T: C* e  n* A  ~#include<string>
4 H# @+ \% V0 a! D6 C/ N2 lusing namespace std;0 A( |# k3 E) H, H
int main(void)+ f( o! C' T; Q1 a' X
{' e' {' I  p1 s
    string s1;
3 s+ R! k  P, ~$ q% V    while(cin>>s1)( J' h) n# p9 @( Z, S- L
    {/ r: c, h) S; G1 U9 G
        istrstream isin(s1.data());
; e" d; t3 K) e7 d0 u        double d;
. ^1 F, z0 O$ R) ^  d        if(fy_Exp::GetExpValue(isin, d))
9 N/ w+ r" N- R) t& E* x$ e+ a        {
, v* U$ n9 b+ O8 r1 t9 H& ]            cout<<d<<endl;
- W, h  ~- \$ L2 V- U        }
9 s8 L" U3 b. V8 m9 ~5 D! F        else; C( l3 Y8 d' X' N) k1 s
        {1 T' ^2 ^1 i0 h# _
            cout<<"ERROR"<<endl;- a- U: S# M, Z" N( U
        }' E( B8 m4 T5 e( F# [2 K/ i; l$ A
    }1 t6 B7 d- l9 _( X* i
    return 0;
4 P8 d1 v! }8 H}
; j. D3 n( b6 ~! N8 d1 ~- g; L5 U% l6 x0 t3 `, M
' ]  d; h9 m; c$ w" Z7 W* e- N3 U
然后编译执行就可以了(*^_^*)6 h# q- S! T0 J/ L5 `- y, M# t
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
. ]2 w; a! F, H+ e9 R      建议使用VC7或VC更高版本,或者使用GNU C++编译

返回列表
【捌玖网络】已经运行: