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

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

在9月8日那天我特意编写的,给大家分享的,5 K( R8 S( E& E3 U7 p
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ D. s7 L1 N/ |6 ?5 a$ d只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& Y2 \: t( ]! w2 S* ]/ I参数解释:' g7 d! g4 b  A. S1 D% f, z7 D
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 g; u! p/ L7 d! C$ I% e6 RnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# {8 ]0 E/ K" e3 G返回值:3 x! \; E) V6 ~+ j$ \8 {4 P; Y+ l+ ^
返回非0表示计算成功,0表示计算失败有错误
- b* {! V* |5 W8 Y# U) [
  y, a! S/ x/ i% s# ?
6 u0 h6 ?4 a. t. z( i) i2 h, w. ~( Y4 x* V3 x& X
程序代码:
, k) I" o% O. I7 A$ O' n! D' S
/ j9 K* Y0 v8 \namespace fy_Exp{8 i& J) [' C. Q* b, D
namespace {template <class _T>
0 @9 S3 b5 I# H# n3 ainline _T GetExpValue(_T t[], char& csym){5 [8 S9 a: ]! L9 [, g
    char c=csym; csym=0;
& m& T8 a& G' _$ n0 y3 N4 _4 v" T    switch(c){
7 `% z( W$ b- H  Z* _' _    case '+':return t[0] += t[1];7 C, \3 ^1 I9 U' _, P
    case '-':return t[0] -= t[1];
% H, I2 U3 o; y1 V    case '*':return t[0] *= t[1];, F' p/ K! }0 Q, W) y& z! I9 k0 p( ?
    default: return t[0] /= t[1];//case '/':! I4 D5 ~5 Z' i$ Z
    }7 u  M! |) k/ Y) t
}}9 V8 d0 k8 p6 |# {* E' K
template <class _T, class _Tstream>9 J: y8 z0 g* z* h
/* _Tstream: inputstream, _T: get return value0 z) E- G& M6 Z
* Return nonzero if get value successfully */
0 @# \6 _* I3 `4 qint GetExpValue(_Tstream& istrin, _T& nReturn){" Y& M0 O: g' W0 F6 n7 _$ x9 f
    _T t[3] = {0}; //雨中飞燕之作
! d% a, a( w3 l! Q    char csym[3] = "++";( ?  X* a: ~3 V7 E5 Y9 C% G
    int nLevel = 1, nERR = 0;2 h% ~  I) j& v" F+ n
    if(!(istrin>>t[1]))istrin.clear();
+ g4 g4 r( G0 h, |, o# U    for(;;){' N2 D# ]4 U. F1 O
        if(istrin>>csym[2]){+ i) m! i4 V# [1 n
            switch(csym[2]){* k0 Q2 s+ `5 K5 K4 l/ R
            case '(':
4 c. ~1 `3 i2 ~& i+ q, X                if(!csym[1]){nLevel=0x100; nERR=1;}else! b, m5 x" Y" A5 {5 f% b, a* j
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, X0 o- F) L5 S  t# n5 A) u
                else{nLevel=0x100; nERR=1;}: H* z& c" Q# _4 f: k! n
                break;/ @: U  M& O' Q+ t" e
            case ')':
) K" B9 b4 A2 _, N2 Z                {nLevel = 0x100;}break;
2 W8 h( y2 y  D* v9 U5 y            case '+':case '-':case '*':case '/':2 f4 a- R7 t* {
                {csym[nLevel++] = csym[2];}break;& J1 \" |3 x0 L' y' J6 T. }
            case ' ':case '\r':case '\n':case '\t':continue;8 }1 H5 q; d0 J6 u3 \
            default:3 h' X/ _' \( f: B( Z; }- c
                {nLevel=0x100; nERR=1;}
- ~9 |# \6 Z! j            }) p( c' f5 r4 D2 _
            if(nLevel==0x100)break;) ~: x7 X$ B  T) [
            if(nLevel&0x10 || istrin>>t[2]){- b( C, H- M, X* z0 i/ ~6 F- C
                nLevel &= 0xF;
0 i, O" x) ]. }                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 M7 L( c' O" @6 Y' p, G2 w- \
                if(csym[1]=='*'||csym[1]=='/'){, V/ ^* A" `! g+ @6 I" M4 H6 o6 ]
                    GetExpValue(t+1, csym[1]);0 B; P" K: Z0 [! B( I8 q4 X
                }
& x  c- n8 l6 F4 b' a8 q6 |. P' q                else{
( n) T4 e/ [& r. k/ m+ U; z$ U" s                    GetExpValue(t, csym[0]);% e& ^0 A9 [/ w" q, c* Q
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;0 {( x# M6 r1 H0 X: N" E" f$ p
                }. O: r9 b9 w0 i0 I, u+ x
                nLevel = 1;) g7 v2 d! N  L! N& d
            }
5 ^- j1 k" x$ ]" ~& q' k" O3 i            else istrin.clear();' v9 q7 C9 Z' R$ A2 c$ l$ f
        }6 m8 H( Q9 d4 a2 G/ ?- u
        else{nERR = -1; break;}
" O9 p( F6 V' Y% J& ?: e5 Q    }
( U; M* d- {) ]1 B  h* Z" j    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
* G8 {) g) c: J0 ]- ?- M: K% G4 S    else nReturn=GetExpValue(t, csym[0]);4 t: _1 Y0 T9 m/ @3 ?9 o  x, |& p
    return nERR==-1?1:0;# u( G0 ]" k# o. Q2 X
}}' d* l: G( ]) z8 E8 R. ~

3 N8 H* V7 F9 U) y
9 i& ~  {" w. [6 w
" E* ~. ]! O7 _: S函数模板使用示例:
1 J/ Z- P; |$ G* W9 m8 b: M( b6 s) O在以上那段代码的后面加上以下代码:2 z& E3 G( l# g; e/ I/ q& n

6 E5 j0 W/ |: M' x- `4 p , c4 H, ^) r: a' j) J& t. H) S) J

  N' G5 Z3 L6 ~! S( T8 D. ]程序代码:
2 `- V* V  ^4 h! h; B
% g0 D. a; p" ~( n3 d* p3 [$ b#include<strstream>$ S/ e( C" {. T; ?
#include<iostream>
: V8 D* Q: ^* E" I9 Y" A1 y#include<string>
* w: h# |( j0 R0 _  X$ @using namespace std;
. T, w/ r/ R/ i) C2 x. j. _int main(void)
1 K* l' y7 a+ H9 {$ z{; _% Q2 z6 V  Z, N
    string s1;
: Z7 ]; I2 V! k8 j: d    while(cin>>s1)% h% b" A* O6 q
    {
9 b8 X" T+ x) @; N6 j        istrstream isin(s1.data());
; U$ q1 l2 s( [0 f        double d;
/ M" Q# @7 P5 I8 N* k        if(fy_Exp::GetExpValue(isin, d))
. `  x/ \( D5 |; @" P        {. A! `+ p& J/ X$ @7 k1 V
            cout<<d<<endl;0 r  X0 {) v  m5 a8 a; K
        }) V+ w2 |) i6 I& X
        else
3 H3 y, A7 _% L        {, D: n& E5 f- Y" b) i, V9 Z
            cout<<"ERROR"<<endl;/ A6 e0 w4 i/ B" Q9 q
        }+ l" C5 {5 Z! V
    }
) j- ?# _4 g6 k+ m    return 0;3 ^. w: O' O) H, q- t
}
2 Q7 x# d( u* E7 s: m: v! }. o1 g5 A3 J9 G# V  S. Q
- q7 S* A  o; {( P3 Z
然后编译执行就可以了(*^_^*)
7 X5 s6 v0 S( O9 P7 X. c3 \其它:TC++上一定编译错误,不保证在VC6上也能通过编译0 ~# D% X' v# `& H
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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