返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,( q: E+ Y+ t9 D
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
- z! p" p4 u$ K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)8 P5 p' ^( L- I  {; U) S8 s
参数解释:
/ Q5 z1 N( i: m: `istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流, }: @2 j) m8 u9 ~
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 u! E% ]' m, y3 n, R5 R# X% [1 q
返回值:
9 t) F* n* [  C返回非0表示计算成功,0表示计算失败有错误  u0 s9 b' b9 ?9 p. {" R) E

9 L! P. _) b$ c9 {2 Y9 B" h ; a+ \; V# \; W" Y2 B+ i0 v: P
- F; q6 K" t( ?1 S& J7 N
程序代码:
1 O$ j. ^, H5 V* U8 _7 C7 s' |9 _% e. x4 m; g( S% d0 \% F$ X& k
namespace fy_Exp{
, b# A6 ~) I8 r5 i2 P$ Bnamespace {template <class _T>
0 w4 b) |0 s) u; |/ O/ I, ?3 a) j/ Z& Cinline _T GetExpValue(_T t[], char& csym){* o' Q: Z. a+ ~7 O
    char c=csym; csym=0;4 `" Y  N3 j1 _
    switch(c){
; o) }% h6 Q! E! q3 f5 T4 ~- j    case '+':return t[0] += t[1];
7 |0 d1 m) R7 J- j/ P; @! ^: h! N) @' B    case '-':return t[0] -= t[1];% r8 B; |' r1 x$ e  N
    case '*':return t[0] *= t[1];4 D' M9 j1 n4 E3 M/ U
    default: return t[0] /= t[1];//case '/':* K9 _6 Z$ M/ `+ X$ P9 _# f8 _
    }
8 W9 e" o0 a9 _9 v}}
9 d8 p: \7 u2 Z- h, n! P6 o: [template <class _T, class _Tstream>$ J! x" ?# Y/ @8 V4 d
/* _Tstream: inputstream, _T: get return value* G5 L' W% O7 F/ g
* Return nonzero if get value successfully */) M. r! V: L, _9 `
int GetExpValue(_Tstream& istrin, _T& nReturn){- N) J, A- x& q9 w! V; Z6 J
    _T t[3] = {0}; //雨中飞燕之作
" x3 G, B; ]$ Q" Z    char csym[3] = "++";5 M4 L- ], p  w+ w! E0 J
    int nLevel = 1, nERR = 0;
6 W; s( C' g7 c* a    if(!(istrin>>t[1]))istrin.clear();8 ?3 }4 U) j& I6 U1 S% d1 L
    for(;;){
+ ?; ^8 @/ n/ C7 T5 I/ g1 {# l" Q7 |        if(istrin>>csym[2]){! s5 F' b+ G: A4 [1 N
            switch(csym[2]){
8 K' o; k! A0 g            case '(':2 ~5 Y' ~- o: Q6 e
                if(!csym[1]){nLevel=0x100; nERR=1;}else
$ h! C& Z+ O* M) C7 p                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: e, I+ ]) J5 H% ?
                else{nLevel=0x100; nERR=1;}
; u$ }9 f% X& e2 c! i1 R                break;3 {% r2 }6 F( [/ w
            case ')':
% H- Y: X0 N1 m# a  P2 U$ V9 g5 _                {nLevel = 0x100;}break;
5 v5 a2 H5 f' R; K            case '+':case '-':case '*':case '/':  W+ G' f- j$ ^& p' g' i8 t# h
                {csym[nLevel++] = csym[2];}break;3 S# q: E# u) A% a4 q0 k3 g
            case ' ':case '\r':case '\n':case '\t':continue;
- I5 p3 f7 w3 k, p9 n6 o            default:# T. ?. w5 Z' b# ?' T5 m% g
                {nLevel=0x100; nERR=1;}
$ N/ L& W; {4 j6 E3 R6 ^6 |' O            }. U0 O* E; ]+ {) v0 z
            if(nLevel==0x100)break;
7 E1 W  G9 _5 W0 B            if(nLevel&0x10 || istrin>>t[2]){( j6 w. q' |2 C9 z" ^8 A5 y, S
                nLevel &= 0xF;" m8 c7 s* ^9 z" }3 V
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 i; \. ~. I! \6 m6 s5 `2 T( \/ V- \                if(csym[1]=='*'||csym[1]=='/'){/ s6 T9 j2 J' s. D
                    GetExpValue(t+1, csym[1]);
) T1 \* |, b( ^+ O0 B5 |4 G) h                }3 G$ m7 ~& w% k# s* m: W1 W% c
                else{
6 i& V/ s3 b" S/ X$ B1 |4 \% X+ C                    GetExpValue(t, csym[0]);
2 \  E" t7 Z: @                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 m0 @7 r( z0 W# b
                }' E, s! M8 g- w4 |' n
                nLevel = 1;
; {  L( M# n  _, i            }' y% C) a) ]) L5 d
            else istrin.clear();$ L  k; n8 L3 X
        }+ a6 j) }8 g" K# b# r
        else{nERR = -1; break;}9 f1 Y. k7 Q7 u! n
    }
. e2 n9 y" ^+ {( a4 {" p9 f1 o    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);6 [) `7 E- i$ F3 X8 ~0 C
    else nReturn=GetExpValue(t, csym[0]);
5 h9 [" D' O8 c    return nERR==-1?1:0;
! l& M1 i! J1 Z6 E" j3 e! i}}, X0 k9 g" N8 X0 t7 |0 j6 r* f5 u

1 z" K3 M; F: E4 d+ J7 X& V2 \% ]+ I" r2 b8 _/ x) a
7 e& m$ E) s; i9 V* \+ v5 T
函数模板使用示例:
- E8 S' }$ o9 e( k5 B在以上那段代码的后面加上以下代码:
8 n. u0 n8 C! E  i' S) Q/ @1 |9 D* d! r# e' Y( O. ]( f

: J: n- B8 x, m% F5 N) Z( }) S
: ^1 A0 |; b$ c. n$ {4 a* H3 r程序代码: + Y+ g( R+ b6 x6 u

) }, r0 v- Q% A; Y! [: P5 ]#include<strstream>
2 d8 G- x! \& r#include<iostream>
  p; A9 W2 u0 {- W#include<string>
, F7 I* D, }7 \using namespace std;; b) u: b) \/ ]+ i2 G. c3 e
int main(void)
+ ]" ~, d' r' P5 ~; G. O# q{" U$ K1 J2 Y7 R' X
    string s1;
3 s" T2 H0 X( Y  J$ g; c0 L' k    while(cin>>s1)
' M9 e$ k' L7 z, u) ?- x    {7 s; Z4 W9 N7 a! J
        istrstream isin(s1.data());
: t) I# O( c. V% d8 l        double d;
7 U# L" l0 h4 y9 C% H/ ~" N  \1 S+ |        if(fy_Exp::GetExpValue(isin, d))
0 p2 z3 b4 ]$ c8 E# g5 W$ l2 g        {0 b# O% M5 [0 n7 C+ ~1 Z+ N
            cout<<d<<endl;  s" v( d) K% r
        }
# c7 b3 f) E+ X! m# f2 O        else. \1 ?) m/ S0 \5 n
        {
: R0 Y6 x' b. V0 I  H  N9 R! E            cout<<"ERROR"<<endl;, j  y# R1 z  T
        }
" W3 j6 q! z6 t9 Q7 G7 ?! I2 q* h    }0 [' X6 _; U! x/ C6 T% y
    return 0;4 \7 d9 K( {5 a6 d' I6 m$ z
}
  S7 q/ M' a* b5 {( S
, _2 P8 r6 t% h& O. d$ U9 ?: {9 s$ X- \9 W5 p
然后编译执行就可以了(*^_^*): N+ o4 z9 I4 J2 a+ A* t
其它:TC++上一定编译错误,不保证在VC6上也能通过编译. Y, U+ N' D& A: I/ W( n3 q
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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