返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,; R* H2 m% P( J9 X4 L% @
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; T, N% R+ `& d3 `3 w5 ~
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 k7 r% a7 q0 a" A# G参数解释:' z2 ]( G3 k/ g' p. h; h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流& {3 ~* T5 b1 M3 b: G
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. L6 X; G! u" Q" W; C$ c
返回值:2 }+ V9 r8 x7 ~( }/ [1 I5 B
返回非0表示计算成功,0表示计算失败有错误; v( q& W' b: k) S2 {
4 L; |' i& @: X/ I) @* u4 m) ?
/ W" B* N/ [, c( c# q% W
" Q" V% I. q0 v  r+ m+ w
程序代码: / B% V0 ~* |9 M" d

* t* r* o+ v9 K6 [" jnamespace fy_Exp{
8 ~; m0 \- ?" i1 L5 Ynamespace {template <class _T>9 p8 J& W9 f7 a# f5 K) Y* L
inline _T GetExpValue(_T t[], char& csym){; |. n- N, t* W; a7 p
    char c=csym; csym=0;
5 Q7 \6 m/ o$ m    switch(c){$ ~$ E, I. }: t2 U5 n
    case '+':return t[0] += t[1];
0 ?* a  H6 k5 g. g  v7 x) m    case '-':return t[0] -= t[1];
" ?  Z/ C! E* T' p5 X9 F7 [    case '*':return t[0] *= t[1];
8 J5 y$ n% W& n" v, u; G    default: return t[0] /= t[1];//case '/':/ H# U9 n5 M4 E- E
    }
( t. x8 e7 J& p5 V7 k/ D2 Z0 d}}/ D# w3 a$ J5 }$ y" m* a5 ^6 ~1 @0 r9 K
template <class _T, class _Tstream>& _# D5 {0 V0 M' f( b
/* _Tstream: inputstream, _T: get return value* c3 Z: x, g* t( a% x! H8 g
* Return nonzero if get value successfully */
' o' N; \3 M- W+ Q7 V8 \int GetExpValue(_Tstream& istrin, _T& nReturn){! U9 C# q: }6 o' y, H" j
    _T t[3] = {0}; //雨中飞燕之作) C! k& R6 i! W
    char csym[3] = "++";
& U% b1 Q# P, D# i/ R    int nLevel = 1, nERR = 0;, E# C4 ~9 P( l$ W( S- R
    if(!(istrin>>t[1]))istrin.clear();! }/ [. ^- x; Y/ p
    for(;;){5 i: p( j$ W1 j/ F
        if(istrin>>csym[2]){& d; S$ d5 L: Q% T' k
            switch(csym[2]){
- i0 y1 @4 _( A& g9 z( H+ d+ m$ ?, f            case '(':
* r2 J0 t0 d4 N/ G3 Q                if(!csym[1]){nLevel=0x100; nERR=1;}else: F1 Y0 y1 |/ Z' v8 d3 a
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, r5 i. v( m, @' o1 C
                else{nLevel=0x100; nERR=1;}
. u/ e: ]6 F: H. ^" O0 p  @/ s                break;3 X% W# _) \3 e# o$ u0 c
            case ')':! R0 M0 x3 b  G, R; J1 k
                {nLevel = 0x100;}break;& d9 X4 B- J9 i' {. \1 w7 D4 J5 }  b
            case '+':case '-':case '*':case '/':& {. x. Y4 W7 j, R7 l7 a
                {csym[nLevel++] = csym[2];}break;: ]* Q8 ?) P3 q$ k7 w% R1 J  D
            case ' ':case '\r':case '\n':case '\t':continue;
/ f7 ^: K: j6 K* s3 L            default:
0 ]% U0 s3 a& j. Q3 Z5 R7 O                {nLevel=0x100; nERR=1;}
7 ]$ e, \! C0 V$ Q( o5 D            }
8 _! v$ v# [& i9 Y            if(nLevel==0x100)break;
/ _5 D; q; k: E' s5 h# J7 i# T2 w            if(nLevel&0x10 || istrin>>t[2]){; E) S% S; B1 Z
                nLevel &= 0xF;1 p: x4 D+ z0 ?) ~" \, t7 n
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}7 O7 j5 h  ?& b, l8 R& c# o+ a6 _
                if(csym[1]=='*'||csym[1]=='/'){
4 c# O% [! T5 I/ P                    GetExpValue(t+1, csym[1]);
: [( [% _' }0 c                }4 i$ x9 g/ ~" w$ c- B
                else{
; Q4 F; a" j" V/ \) O. u                    GetExpValue(t, csym[0]);
$ d. x& r9 M2 K! P% F, R  V                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" D" H. }0 n# U2 R                }
$ Y, \& h' [7 b2 m2 V                nLevel = 1;
! @9 H2 G' G9 d( B  j) U            }
  g/ E# ]2 z+ o2 a% `) R            else istrin.clear();& p' S1 A, Q8 A4 v
        }2 B* H. H" ^* H
        else{nERR = -1; break;}+ v8 U  N4 q) W9 [! a) M
    }" w9 x6 V1 A* ~$ _
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 V1 f2 ?4 t1 D7 B( u6 M0 h    else nReturn=GetExpValue(t, csym[0]);
9 d. Q0 m% g& P5 g3 I    return nERR==-1?1:0;
: e$ W. k) R% L4 {, Z}}: D+ p9 Y" i) }. \8 a- d1 q% M9 d

- Z0 ~$ t/ h: d' L7 {! f( ]
9 f4 M' X3 y; R1 e) U% a. B# L( O8 n" E' @7 @
函数模板使用示例:1 Q) f* R% ^# d& {, O5 m
在以上那段代码的后面加上以下代码:! v" Q0 M. K' S, Q2 K$ r
% t2 M( ]% K: ~; g# U) e& s

8 s8 B: U* x+ K/ X: R2 T& v, e0 \: N& I8 j; w4 S& _
程序代码: 0 d0 {' W' \8 D: X) D1 N- ]
7 s1 ~+ O$ }  _5 q3 ^: J3 o
#include<strstream>
7 y% I3 W0 i( H0 C" `' S5 y: O: E) y#include<iostream>: r$ A! M  v: Q& |8 w. h
#include<string>
  i$ c. W: |' I4 ]- c  E9 p6 u3 d; Tusing namespace std;3 m5 G, H6 H) p; Q$ `6 d
int main(void)
$ p1 V& g3 n/ s& R{# P$ H3 ~- @/ Q, y' S0 b' Q, a9 [
    string s1;
7 Z4 Y1 f* s! T3 ]0 P: y  o    while(cin>>s1)8 @- Z! h; L! ^% C
    {
' T9 Y5 a% q# S% S- O6 i7 v        istrstream isin(s1.data());. b, |& c- z4 [8 X
        double d;
/ w" R! R7 k. V2 Z8 ^7 X        if(fy_Exp::GetExpValue(isin, d))2 g6 J/ m* ~& o2 x: }9 G
        {* p, E- f  o, [- x9 \
            cout<<d<<endl;
2 n+ G  n& B* Q& I" u( x4 {9 d' m        }
* U  \, w3 x# P# [' T- l        else
- Y" a2 `- O/ x" V4 S/ C        {" S/ H' K* t- b5 O' Q& P) w$ d
            cout<<"ERROR"<<endl;* C* [  D! O; y$ H
        }
3 d4 O+ g- P; m7 O4 x8 I8 ~& u' t    }
  j! \* d" O" }    return 0;& b' l9 b  {3 k0 E0 }
}; S. a' W5 ?6 e5 ^; B& I, {) E

) u/ q7 |  s* h* T
7 Z; \0 @* J2 P- D然后编译执行就可以了(*^_^*)
# Z% z* P5 S3 U' B* r1 O其它:TC++上一定编译错误,不保证在VC6上也能通过编译0 e, W# A7 k8 }$ j& ^0 e4 s
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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