返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,7 K: M- o' v: o4 d1 b
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式8 \- `9 j; h- W/ K' g3 C, z
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)0 G7 y( h! n# b7 V. D
参数解释:3 z( E$ G, m& f, _; d, Q# W
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
) F/ v0 t: B# M3 y+ Q  u' X( nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
- j4 ]% p( M5 o, w返回值:& }0 [$ ]! C; T* s+ K5 M# Q- H. H4 T
返回非0表示计算成功,0表示计算失败有错误  t) M7 G9 n( p4 E
9 {5 V! y. W+ U
% Q& ^) R5 ~5 p! C9 U! f
7 s2 v: h- v3 S3 e+ Q; k9 l" x
程序代码:
+ K0 u) e- |* ?9 b3 v
. @  c3 k+ z- e" A) Cnamespace fy_Exp{
. Q( n) Y6 ]% o6 D# lnamespace {template <class _T>
, \3 E  L* c' s6 Dinline _T GetExpValue(_T t[], char& csym){/ Y3 D2 X0 u3 ^/ V
    char c=csym; csym=0;: Z* ^/ |8 B2 c& z- V
    switch(c){2 p3 S7 F  o5 }/ M; W( v; `# F+ i  d
    case '+':return t[0] += t[1];
% ^/ n  o6 C! N. A) m1 N, }( q    case '-':return t[0] -= t[1];
3 W7 a8 Y, q7 D& N  q0 _    case '*':return t[0] *= t[1];
- U/ J# H5 m, Q% K9 y" P    default: return t[0] /= t[1];//case '/':7 Y/ x; x+ L7 T7 b: m, v* A8 v
    }
9 _2 W7 K* ^1 W$ J3 q( K/ p}}, B- C$ _# m" O$ B
template <class _T, class _Tstream>9 P1 d1 {. K5 q
/* _Tstream: inputstream, _T: get return value1 U) B, d8 K. d2 |7 p3 w
* Return nonzero if get value successfully */
* L  t+ x# k" g, o% C4 cint GetExpValue(_Tstream& istrin, _T& nReturn){
( M/ s, a( d5 I# L  A, [    _T t[3] = {0}; //雨中飞燕之作1 r5 h) b8 C- s1 ~( z
    char csym[3] = "++";
% P8 F9 U0 w, Y" T" o    int nLevel = 1, nERR = 0;+ m+ D& l$ g9 b1 s, L- J2 L( m. k
    if(!(istrin>>t[1]))istrin.clear();. N( q% o& X% Z( n0 M# s/ D
    for(;;){7 }0 @: Y8 s  E+ H$ }/ `+ q
        if(istrin>>csym[2]){
) ]3 l9 v1 X8 G" j9 C8 ~            switch(csym[2]){6 L/ U/ [. u& v) }- B/ D- s* R- j
            case '(':
0 N" C" \2 K7 @- |! T7 U6 E; p/ _8 e                if(!csym[1]){nLevel=0x100; nERR=1;}else
- q8 k: h; `5 ^+ R& R$ F                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 P4 m0 y5 x: O9 F, H                else{nLevel=0x100; nERR=1;}. t. z/ o  e% H) _$ z, p
                break;% Y+ G, P) q( }
            case ')':
$ Q; P0 e3 x; J+ g                {nLevel = 0x100;}break;# a5 S  u) k% i4 {3 |( P
            case '+':case '-':case '*':case '/':
) t1 v' S0 t. S) w                {csym[nLevel++] = csym[2];}break;# t  H. ]! O" m: b! ?1 v
            case ' ':case '\r':case '\n':case '\t':continue;
6 L3 W) l5 @0 @$ G# O6 ]            default:
+ a/ R( ]" R' \: A( Y& s5 _$ A                {nLevel=0x100; nERR=1;}
' [! S2 z& `: [  @6 ^9 \( U            }  s7 j5 O6 \$ z; [  N
            if(nLevel==0x100)break;7 Z1 C$ {0 C% V) [/ X! g6 O
            if(nLevel&0x10 || istrin>>t[2]){* ?5 U. N* q' t/ H) J
                nLevel &= 0xF;; a; U" g0 J) _6 c% C: p4 Z
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- A" K3 b! K  ?% Q                if(csym[1]=='*'||csym[1]=='/'){
7 p* V) @& C# G1 R7 b                    GetExpValue(t+1, csym[1]);
# z! n# F$ g  Z, O1 k; n- x; h; z                }1 J5 {( z8 ]( {; F: t6 i
                else{$ H1 @9 j8 i( X
                    GetExpValue(t, csym[0]);
  \: h8 Y  P: D& P  j- x. ^* M                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! k+ ?  j7 i* @9 A# I& }                }
; y. O- c' w0 P7 I                nLevel = 1;: d3 X$ W0 N( }; x9 g
            }1 x! q) D! v; y
            else istrin.clear();- p5 q( A$ b6 Y8 A8 W6 a9 A
        }/ ~% X& y" G% `3 _  v
        else{nERR = -1; break;}
, q4 h+ E8 q" ^% @' @! \5 J( W    }
/ ]# O# r- j( s7 K    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);# X5 x. R* b) D& N
    else nReturn=GetExpValue(t, csym[0]);! ~" X0 Q) h* \1 f3 s7 Y+ f
    return nERR==-1?1:0;. u9 u8 x( B4 o% q# X
}}
& I3 a" p7 H8 A4 N4 o1 n- D4 |5 W8 f2 W. Y" X: d

! ?9 m, z8 M) T& Q
# U; A6 {- M- W0 C/ g函数模板使用示例:+ g9 r" M& ^: X1 Z6 u# d# p: W
在以上那段代码的后面加上以下代码:5 g. t" e' r* V9 X& ?
. f! `1 J3 p: I; ~$ u3 B" s& ?+ b

- ^) C9 G7 W) [5 U8 Q7 ^' C& t
1 J/ K- l& s3 Y/ E) z; `/ E3 y. @程序代码:
) Y- X# |6 {9 L+ p6 g, K- p9 f+ D! E
#include<strstream>7 T4 L0 o; p9 j* l" X6 ~2 S" s
#include<iostream>
: Z3 r0 t& U, J: @7 Y9 ?! M) _2 H#include<string>8 \2 M' |5 c0 S: p9 U
using namespace std;1 u: J; @, a$ p6 |) y
int main(void)
) P* P4 d. N/ Q{* M/ M/ F+ J- h5 ]( Q4 S
    string s1;, a; c3 v6 o) d) o$ d% ^+ |
    while(cin>>s1)
2 F6 r& G+ ^% d& {    {
6 j, }2 @& m! X7 }, Y! n' H        istrstream isin(s1.data());
% _. A3 A* O2 A# m0 z2 U        double d;& T" I% W7 X: A
        if(fy_Exp::GetExpValue(isin, d))& z3 I% j# d3 Z/ x3 C- }
        {9 ~8 S$ {" R' f" r9 b$ N
            cout<<d<<endl;
0 Q5 C' K3 [0 ]* h. n2 z        }
) ^2 H8 O$ T. t1 V! n        else
! b/ J. c3 c  b: O0 ?        {: E4 q& L% i: k1 p; d
            cout<<"ERROR"<<endl;) Y2 y, d1 x" I; d4 U
        }) ]0 t' W* @6 k7 U* S8 F, O
    }* f% m0 X7 \) e" C# d  F
    return 0;5 _6 ]& l- ]- E: d  L/ e
}
% o, P3 P- W" F# {# c# j$ S' m, x- _6 U3 @; h0 ]. k
7 p! \* l, C: |( l' k2 g
然后编译执行就可以了(*^_^*)0 r9 k9 v. S4 J9 L  [
其它:TC++上一定编译错误,不保证在VC6上也能通过编译3 S$ l6 N  E, x5 }; ]: D$ d
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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