返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
9 h0 _9 @6 _) D! Z4 m一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# L% u2 N7 ~: h! j2 I/ P- i0 y9 R只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 i2 Q7 B0 m$ ?3 q2 k参数解释:
: [5 s. d& S5 D" S6 cistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流6 \+ G/ h7 S( l2 N, u4 a  H
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. x+ J7 N1 D1 B" o! c9 n
返回值:
. ^/ o1 U* y: f% s5 s6 G2 @返回非0表示计算成功,0表示计算失败有错误* R: ^. y; f, @# T& Q

+ `& e% u+ k  y3 \! n' j* e
$ o) G2 Z% T$ M; Y" X/ J: I- m- B. Z
程序代码: ! {- \  M5 L: [4 `2 U
" u- t2 u" V2 I& ~( \. ^
namespace fy_Exp{! [; }+ a+ B# J  T4 I& Y
namespace {template <class _T>+ X: A$ b5 Q1 p; P8 ?
inline _T GetExpValue(_T t[], char& csym){$ V- ?/ q9 Y; Q
    char c=csym; csym=0;
) `9 n1 \  E' B" T6 h    switch(c){& m+ ~+ E; w2 e
    case '+':return t[0] += t[1];
- M  F2 L" Q* O- g' O3 n: T6 y    case '-':return t[0] -= t[1];1 j% t: k& o9 v( i* t
    case '*':return t[0] *= t[1];- B8 d& y+ @5 G/ P9 B. F
    default: return t[0] /= t[1];//case '/':! P9 n3 T4 F7 l, J+ N, o
    }) z+ o; t* d% a! N* S0 T# T& r: ^
}}* k0 h9 A* l2 |# G9 V! I
template <class _T, class _Tstream>& \% K# U0 z! R
/* _Tstream: inputstream, _T: get return value* O! w& K2 V4 d" d
* Return nonzero if get value successfully */
$ Q7 }2 R7 K" y1 W8 Yint GetExpValue(_Tstream& istrin, _T& nReturn){
8 K, k& _6 W, N) e, g9 X" a    _T t[3] = {0}; //雨中飞燕之作
& \! f. N, f4 I- M; t, R9 J    char csym[3] = "++";
* R: ~6 ?7 O9 y) l! m    int nLevel = 1, nERR = 0;
# ]4 u! E/ |5 g+ e) ?2 O1 I# C+ Z    if(!(istrin>>t[1]))istrin.clear();
' V! H9 V) b' p& \5 e5 N( ?/ x    for(;;){) t4 X; U* D! G) k" @( k
        if(istrin>>csym[2]){
# p& K+ F, ]. K* B, f$ \8 s            switch(csym[2]){
4 ~8 n. i* W" \  J            case '(':
! I' Z: h0 h: j3 f6 [& j/ }& [                if(!csym[1]){nLevel=0x100; nERR=1;}else4 Z; d8 h5 y8 N
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% l4 G$ K( c3 a" Z1 j' r
                else{nLevel=0x100; nERR=1;}
6 z# `. N. @$ V. m6 o9 a9 E                break;. d' M6 r4 T2 ]5 W+ U2 z
            case ')':' k' N; D+ R* v) m( K' l5 Z! Y
                {nLevel = 0x100;}break;( J: [/ }9 y: n% z
            case '+':case '-':case '*':case '/':
* G- m7 g* Z4 ~; z2 X/ s                {csym[nLevel++] = csym[2];}break;; W, z) B$ P" u% o7 v
            case ' ':case '\r':case '\n':case '\t':continue;
" X+ k4 \% s0 f3 o, r% h            default:
6 `/ F! u, _" ~                {nLevel=0x100; nERR=1;}9 a5 D! R0 I/ Z# y- i
            }/ N$ N/ [% a+ j0 j
            if(nLevel==0x100)break;3 @7 }4 M3 N* F/ f) n* J  `
            if(nLevel&0x10 || istrin>>t[2]){
' K' E$ x3 ?6 @/ H0 i4 _2 U! Q                nLevel &= 0xF;
  H( G. i+ J3 U7 Q( A- R5 J                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ G& k+ ?5 P. W; K$ L: ]+ S
                if(csym[1]=='*'||csym[1]=='/'){" k( \, K5 X  w9 L0 X. r: \
                    GetExpValue(t+1, csym[1]);
! ?, d7 G* a4 y* t( D; c+ o6 r                }) ]" M' X! c9 J  \- L
                else{
1 a" M( P' O  K" O( U- ~                    GetExpValue(t, csym[0]);
( I1 O- ~+ j4 C- p2 j9 f6 @3 @                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# X) @( \- l3 Q$ F$ c! g6 a                }
' q& X( f. i* Z  j                nLevel = 1;
; Q# X% I, b) _* n            }
+ K3 W' S' j: b: w( j            else istrin.clear();8 N* x% o8 S' D, I- k% `# I
        }& c# l3 j  Y: @# i, l0 T& z
        else{nERR = -1; break;}- n' L( R5 ^" P, Z& o# o
    }* |6 q; f& C$ H* B( D; |
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 {0 F( E6 C- y& \, B; w    else nReturn=GetExpValue(t, csym[0]);2 f/ l" ?$ v1 ~1 C
    return nERR==-1?1:0;
# f. C' G* |' q}}& R4 g5 W4 M2 }8 D1 R0 ^7 s: `+ K
; M' B5 X9 V. X0 }" r! X$ `
5 c7 X, K& m; i. H
8 b3 |& v+ j2 P+ c3 |
函数模板使用示例:
- K6 w" ~: e1 q8 y  }: q在以上那段代码的后面加上以下代码:
, J6 O9 x+ h' e4 G- [. a4 `" X1 m  J7 h- ^

- R% |, O! M) M3 e9 ^& L
4 ^* U$ _) ]3 _+ k程序代码: 5 }( b& k: _! F( c& W0 a: H& R. }2 E% ^

+ S* l2 @4 x. ]# a0 q9 f6 u" l#include<strstream>& K2 V0 \; `( F) @; f8 w
#include<iostream>
0 Q  \% P8 \7 F8 L7 E0 J#include<string>; j& i8 g( y- ]
using namespace std;
( T& I- E4 ^5 ^) c. P, C. iint main(void)
5 l" ^0 j5 ?% l+ H( _0 |5 q{4 l( O  a( Q, b$ K! M
    string s1;
1 r. P  Q3 t* |    while(cin>>s1)8 ^$ U0 H+ O) x
    {
3 l9 R6 ^# Z$ J+ o" y+ O- c5 G        istrstream isin(s1.data());' L. N: f4 L0 c) h; B
        double d;
( p4 _( _; e0 m; V; N" V0 m, u3 q* t  |        if(fy_Exp::GetExpValue(isin, d))
: r# I- g  E' E+ y# G        {
- k) e# ?  S7 H9 o            cout<<d<<endl;6 a# d: d6 D, [; J# D
        }( K! V* q' L# X8 H
        else, r: B. E' u5 H/ A, }$ V! B3 k
        {
7 g' O1 _: ]- o: g# q            cout<<"ERROR"<<endl;' x, }( C( l/ ?1 @. W8 k
        }8 p3 |* A4 m+ T5 ?+ R0 q3 a8 q
    }6 P8 j/ T1 D. d
    return 0;
4 F7 i7 _4 }- M9 J3 m* A' ^}
4 H$ \) K; j. [0 U7 P: N: [- l! T* D% f, H$ A" b0 p8 e
1 f7 a  p4 z: s
然后编译执行就可以了(*^_^*)$ G2 }; H) ^* S" C; u4 E% |
其它:TC++上一定编译错误,不保证在VC6上也能通过编译) z5 P* B/ B- y2 ?( z
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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