| 
 
     
- UID
 - 133 
 - 帖子
 - 51 
 - 精华
 - 1 
 - 积分
 - 186 
 - 金币
 - 55  
 - 威望
 - 2  
 - 贡献
 - 0  
 
   
 | 
 一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的, 
" z1 X' N2 d' |7 [一个很方便的函数模板,可以并且只可以计算含括号的四则表达式 
, H- k  O7 T0 c, l7 ~. b# M只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 X! M- p7 J. F# U2 k2 M$ _; X  S 
参数解释:7 u# b! s) D- a& y) x. a 
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流 
7 Z7 ]1 }4 X- {) w0 \nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" ~: \  Z1 R# q7 Y% T: Z 
返回值:7 y2 i. w# r0 n 
返回非0表示计算成功,0表示计算失败有错误 
# Y* y1 s* l# y; T: }# [' l. a& T* D& Q( j6 G. L) a 
 7 J- k  z7 g7 Q8 L" _$ b' n 
 
% e4 P# H- E4 Q+ Q, w9 {程序代码: # \% z4 P. T" a) q 
 
5 E' l% Y4 }, m/ snamespace fy_Exp{' l8 \/ i1 Q! V( u 
namespace {template <class _T> 
5 h4 p! y0 z7 g* Tinline _T GetExpValue(_T t[], char& csym){; n  r% {) V- F# T, ^& Q$ O( V 
    char c=csym; csym=0; 
( F) Y+ O; y4 y4 ]    switch(c){ 
1 z/ i. G) ~% H8 g    case '+':return t[0] += t[1]; 
/ a9 K. O# \0 @9 E6 N0 c    case '-':return t[0] -= t[1]; 
* Z, P" r" ?) K; W4 ]) _: q    case '*':return t[0] *= t[1];5 p/ o3 Z+ R2 ~( @6 W& J 
    default: return t[0] /= t[1];//case '/':% j/ o. v2 t9 V( u4 w* c 
    }3 D5 H/ Y$ \: W9 J3 O- V 
}} 
9 \) I8 C2 t& }5 `- @/ M" B4 ctemplate <class _T, class _Tstream> 
: _: @& Q, z0 f8 q/* _Tstream: inputstream, _T: get return value: {- H9 F' O6 Z  u1 m) ]3 } 
* Return nonzero if get value successfully */ 
7 d$ j% j: H0 o% xint GetExpValue(_Tstream& istrin, _T& nReturn){' A! l2 ?/ y0 n% P3 {! ~ 
    _T t[3] = {0}; //雨中飞燕之作 
$ a( h+ z! i" ], X4 \+ i    char csym[3] = "++"; 
, A" X1 u( j2 L4 B/ b# L    int nLevel = 1, nERR = 0;/ H7 O  |5 v9 e/ [" U 
    if(!(istrin>>t[1]))istrin.clear();0 v- r0 W) g. G3 T7 L3 w 
    for(;;){) c: h: \2 K" L" E3 z, B 
        if(istrin>>csym[2]){ 
3 q- R. M) g! ]& t$ r            switch(csym[2]){ 
' f2 _+ K* h; I' g            case '(': 
% v8 p" W2 N0 y' {4 h                if(!csym[1]){nLevel=0x100; nERR=1;}else0 |+ n% a" L: q- H1 q! m- l3 J0 a 
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 \0 @: L8 G) V3 K/ E' X* p 
                else{nLevel=0x100; nERR=1;} 
- v! }( z) p9 g, g$ t                break;" ~4 n" b- K) v 
            case ')':" I& q, V& N. Z! j 
                {nLevel = 0x100;}break;( y- B+ V; F2 ^% q  G 
            case '+':case '-':case '*':case '/': 
$ J' ^. P' Q; U$ W) C2 q4 I                {csym[nLevel++] = csym[2];}break;$ D7 z1 r- z- ~. {  r 
            case ' ':case '\r':case '\n':case '\t':continue;. K% w5 g* I$ p, x- E' n$ @1 r% V  S 
            default: 
3 ^/ {: c: |: w- @                {nLevel=0x100; nERR=1;} 
5 K$ i' E  p# Q7 @; E. L            }  }1 E) M8 V* ]/ T2 J. g 
            if(nLevel==0x100)break; 
/ z2 E+ @) v( R, m: n' m            if(nLevel&0x10 || istrin>>t[2]){ 
0 s! Q7 }3 Y" x; \, ~                nLevel &= 0xF; 
2 H% {1 [2 R% R                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) a) }1 d/ y" d% Q# ^) r( F4 C9 Q' Y 
                if(csym[1]=='*'||csym[1]=='/'){) P. n9 R. o- ^) P/ o 
                    GetExpValue(t+1, csym[1]);; `- {$ E+ \5 S# C* g1 Q* u" | 
                }- r& y! ^; [1 H 
                else{ 
- m) o2 S- v: W: H9 B                    GetExpValue(t, csym[0]);( q; V- p& q5 M- d" S 
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0; 
& m- v3 n; ?3 I! V. L" N4 D2 t                }, e% w) j4 q0 Z+ j! g. F+ l 
                nLevel = 1;% D- u4 F, ]. h) g6 q 
            }7 ~& X' ?) L8 B4 s& _! m- w- @ 
            else istrin.clear();# Z) Y' d9 E% _. e* F 
        } 
9 s9 U3 y( _: b; l' B; w5 ?        else{nERR = -1; break;} 
; L. s% m5 L# y$ n% P    }! T% M. L7 {+ Q) P$ ^ 
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]); 
0 O8 }, P* B* P3 S    else nReturn=GetExpValue(t, csym[0]);  b7 \2 O5 K% _* |% d2 ] 
    return nERR==-1?1:0; 
* ~9 r: L. k7 ]}}( w' b/ z1 C% q$ Z. d& d 
* o* W" R5 ]: T" ] 
 
0 e6 T! L& o, c6 p! \ 
. ^  q, S5 i) ]5 f5 G* M. n5 p函数模板使用示例:, c2 i: |. M6 u" _5 N3 B& J 
在以上那段代码的后面加上以下代码: 
, K9 g4 v& y9 \- S* s+ S7 F( C. I5 A" J/ X# }, T 
  
, V% y; G1 }0 H# X5 P/ `+ {& D2 h1 W' H5 t 
程序代码: 2 p( v% s8 s6 h) u2 K$ S 
  j) \+ ]0 {) b" X6 S9 q 
#include<strstream> 
7 ?1 i( r/ R$ m4 x#include<iostream> 
% e, \- @( N5 a+ h- I+ ?" D#include<string> 
; w1 C; C2 z/ n  husing namespace std;8 s: H7 e4 `+ `' m 
int main(void)7 R* M" l, e5 u! d3 h* E6 j 
{ 
0 Z" h  C% _- p% l  u5 `    string s1; 
) G7 R1 N: g7 A* M. H    while(cin>>s1)8 |6 p- B3 l( O- u! n- \/ o 
    { 
3 K$ x8 v1 r, K0 [5 K6 G) O        istrstream isin(s1.data());! \9 s; A5 l8 |5 I% t0 m 
        double d;+ |& W' L5 h2 r, o 
        if(fy_Exp::GetExpValue(isin, d))  l, n) w8 C) T$ k2 D1 C 
        { 
+ q# e/ A' v) h/ L6 d* W& c            cout<<d<<endl; 
: G: J  ?/ {0 w  [7 |6 L        } 
$ a. Q$ r8 S$ w        else 
( [1 M- v6 q9 {, S* g  p        { 
8 O7 X$ B; l' }& U            cout<<"ERROR"<<endl;& g+ V# \) e; W* i$ N 
        }* ^1 T7 G3 |  O- f& D 
    } 
6 h* n+ o7 E6 \# g    return 0;# x! G: \7 |3 |6 z- g# A 
} 
7 u& V+ x6 [5 K 
8 F0 y' F6 _$ X( }6 B5 {7 w3 i# M9 G 
然后编译执行就可以了(*^_^*)7 @+ l2 z, I2 n1 b 
其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 }! W$ G6 |2 B$ d 
      建议使用VC7或VC更高版本,或者使用GNU C++编译 |   
 
 
 
 |