返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
; _1 V! T0 k1 z/ e6 h; w一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
  ?2 ~8 \' E% ?/ S$ E* i2 v只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)8 |7 W8 _( T" H5 y7 c2 j
参数解释:: |& z, Y  L0 k& q) o! r; _: ^$ n
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流  w$ g6 U$ E; ^4 D- X0 E
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 V6 u& X' ]! D. N返回值:
* @1 p0 z# i& l0 m& B8 V返回非0表示计算成功,0表示计算失败有错误
2 |& [' k! A7 _$ z' _9 j
. i# Z; Z8 K2 o( b6 o5 E. E: K   H1 d  ?) z, B' w& H- r

/ ?3 L% x5 x* R程序代码: ! m! d7 J8 z( r# V. f/ Y
3 ?: d" s& a, `0 z5 e7 Q
namespace fy_Exp{
5 O3 y8 E  B3 O9 B+ Enamespace {template <class _T>
: u: l4 v, W- A' X6 j7 \3 }inline _T GetExpValue(_T t[], char& csym){: t& x( K$ j8 a. A3 R" E" C
    char c=csym; csym=0;
; v* ?  V4 @6 \. D    switch(c){+ y4 o" b8 c, R" n* B8 {' l0 d
    case '+':return t[0] += t[1];$ h2 W. N1 k+ i* x2 _
    case '-':return t[0] -= t[1];2 W  i0 S- u( p) Y, Q6 V% h
    case '*':return t[0] *= t[1];
' [- V8 d( L/ i: P  F# T$ L    default: return t[0] /= t[1];//case '/':' g+ E; M3 P) f7 S7 K
    }9 v7 F! u3 `; U& r: g8 ~
}}# l# c, N  t) C; f! L. q/ k
template <class _T, class _Tstream>7 h7 I8 b/ q4 u4 i6 ^5 j! T
/* _Tstream: inputstream, _T: get return value$ e8 L" N" R2 c" b& O4 z7 H* v' L
* Return nonzero if get value successfully */. N" I, L- K. ]( s5 P$ p
int GetExpValue(_Tstream& istrin, _T& nReturn){
) _; t# o+ l8 n9 Z3 L; p0 Q% L    _T t[3] = {0}; //雨中飞燕之作1 b" K; \/ h6 Z
    char csym[3] = "++";; F1 D* Q# S! y0 Q
    int nLevel = 1, nERR = 0;
* |/ J' f* j+ ]    if(!(istrin>>t[1]))istrin.clear();
) H4 K8 X. M- Y$ A' E    for(;;){, M6 p/ e( v/ Y5 m
        if(istrin>>csym[2]){% |9 ^9 z1 y) Z4 r
            switch(csym[2]){) c2 e  \" x: `1 w9 ?) `
            case '(':& c3 C2 l. t4 ~' V$ t1 ]& j
                if(!csym[1]){nLevel=0x100; nERR=1;}else
4 h: y' ^3 L8 o) p                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: {0 x3 r: x' M4 }/ b4 q                else{nLevel=0x100; nERR=1;}# E# i$ ]" X' {; s  \# y' S+ T( S
                break;
; F7 [1 ^3 j# D5 @            case ')':
. H: l( x  `: l+ \' ]; z                {nLevel = 0x100;}break;
7 q* r; Y+ L8 R- R4 S2 X/ `0 k            case '+':case '-':case '*':case '/':
* n1 b% d# O# H, @                {csym[nLevel++] = csym[2];}break;0 A% Y% ]8 X  A: P2 \
            case ' ':case '\r':case '\n':case '\t':continue;" m: v& d- v# d8 J: d$ E
            default:" n( P; [6 t/ ~' u$ p; `2 w5 v5 d* e
                {nLevel=0x100; nERR=1;}
$ N/ K# N. r& I4 x% u0 V            }
* L5 e! t- b6 Z' j1 d' s6 k8 \            if(nLevel==0x100)break;& ]# d$ _6 g/ t' ?
            if(nLevel&0x10 || istrin>>t[2]){
' k/ i* W6 v% }# V* z5 ]6 E+ `                nLevel &= 0xF;' B+ ]2 n( d0 P5 H1 z% F8 k
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
' H9 U3 B5 @3 H. R9 W- p                if(csym[1]=='*'||csym[1]=='/'){
3 j/ ?* y  Y) A1 ]                    GetExpValue(t+1, csym[1]);
2 Y) e- _; ^5 S5 H! K; ]! j1 q! c                }
" D# v5 |- l) p                else{
1 W1 B' \* s+ E                    GetExpValue(t, csym[0]);1 B0 z1 x3 G+ D, }+ U! V2 L. \
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! j3 J& R/ A% J( c- O3 w, z                }
# Y& A/ g5 n0 |3 S* f                nLevel = 1;
/ v# i- L- {# x( J9 B4 y            }
4 s5 n+ V/ {8 w, e- r$ j$ S' h8 k            else istrin.clear();) g/ L: z# }3 w
        }
9 K& h: n  l4 t" e5 A        else{nERR = -1; break;}
4 q5 X/ }9 v* C$ C$ J    }
) B; _" `6 z1 s$ |( P    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
$ f& z; o/ _/ Q) c% y+ W: `8 k    else nReturn=GetExpValue(t, csym[0]);! O" n; ?) U) x  Q- L4 p; X/ }
    return nERR==-1?1:0;
  T8 P8 l; ^% t8 }" g  l0 T}}
( D) x5 r4 t# f! w, T
7 M5 \2 D" P- y7 ]! S+ c( V$ [2 s- ]% O* q$ l5 G: U/ h; ]0 d
7 M  X# }; l# L- r1 [$ R: ~
函数模板使用示例:
/ C2 f' _( P* {* u. [在以上那段代码的后面加上以下代码:- w; N) @8 Z% b: \
0 l! w& ^+ x. B; d/ _

) M- r( O5 B1 L$ S' r
9 @" Y! Q$ m( s0 O: n' V' |* I程序代码:
7 V! J& T2 ^# u- b3 w/ C; T, d8 g+ O+ k$ e( B: K
#include<strstream>
0 @$ \, S. b: n# v! _: f5 ^#include<iostream>5 I% C' q" k; W) G
#include<string>" O. q3 m1 [1 |# j$ s! ^
using namespace std;
. ~! ?; s& G9 F; Pint main(void)0 W7 q4 L1 u' M* |6 _
{
4 g2 E- S% h6 H+ `/ U! O# Z9 ^    string s1;
6 Q. W" N  r2 Y. \# j) ^" y    while(cin>>s1); J& U( L( R3 E- n
    {
( C. n; |4 q/ R7 l; O( p8 s        istrstream isin(s1.data());! \$ S* _  G6 b# E8 h( D: o9 d
        double d;
' v+ Z0 I. n: g9 }( L, B        if(fy_Exp::GetExpValue(isin, d))1 @0 h; O. K1 `0 w
        {4 y2 C4 N1 @! s9 w! M& l
            cout<<d<<endl;* ?* l0 ~: E1 O* X7 N+ R6 P* R* ]4 P
        }
, n# u4 c( l2 m& f+ A( A        else3 G; X! e8 E6 T4 j$ p  U
        {8 q' h. m9 u' z
            cout<<"ERROR"<<endl;
' W7 F6 }; `# t, u* Y% z& b        }
5 j9 N1 K% K' G2 x    }
- A* ], E5 B# S2 a    return 0;( b5 x) C) i" k5 o2 U. t8 A' h
}3 P8 y4 J1 X2 b# Y8 ~$ j
  M* {9 |/ S* O0 s! }

3 W& }$ L6 l! b3 j0 S6 Q然后编译执行就可以了(*^_^*)$ ~- f+ w" v+ d/ C* p; C+ R
其它:TC++上一定编译错误,不保证在VC6上也能通过编译0 U4 u2 R" r* l9 U- M# y
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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