|   
 UID133 帖子51 精华1 积分186 金币55  威望2  贡献0  
 
 | 
 一个计算四则表达式的模板
| 在9月8日那天我特意编写的,给大家分享的, 4 U. u* v9 Y5 u2 f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ j2 |( V6 K0 n$ k  V7 T/ H
 只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! V( {; R8 c) u. }7 I% M
 参数解释:
 $ Y- Y. a7 i) T% e9 ?istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" s, C# Y2 i$ ^* X
 nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* C. y4 r. L8 ^
 返回值:
 7 U0 A1 T; ?* L0 a" G. E返回非0表示计算成功,0表示计算失败有错误5 W9 E/ d6 c  u& m. a( {
 & u* k% n# A. u( P0 S/ [, f$ x- ?
 * p- g4 L+ c/ w0 W
 
 & T6 [) f. j: A# P6 y# A程序代码:
 8 S; U% X5 _6 h/ O9 l. r
 " M$ L' ]6 m/ wnamespace fy_Exp{8 P. v/ y0 h, C4 f/ F8 a. J2 V
 namespace {template <class _T>9 F$ P, S+ Y. I
 inline _T GetExpValue(_T t[], char& csym){1 w, ]. q# S8 J, N$ ~. k4 q& b3 Z: k
 char c=csym; csym=0;& \- m. d; o. h  F5 O/ I
 switch(c){  ?/ k1 \* C4 }( k" E! K
 case '+':return t[0] += t[1];
 * ^4 t  e! t8 |2 G- H8 K9 v- a    case '-':return t[0] -= t[1];) V. {% _6 a- i. r$ M! H
 case '*':return t[0] *= t[1];: a; |6 e3 W$ j- W
 default: return t[0] /= t[1];//case '/':. O) ?5 p* M: k& C% J" M6 h
 }* Z& S6 z8 v4 `; {
 }}
 8 v0 L9 _! b0 W/ Q2 Jtemplate <class _T, class _Tstream>
 ' M" o" k9 x; j! l/* _Tstream: inputstream, _T: get return value/ U( \9 m7 \- I; U2 }0 W( ]
 * Return nonzero if get value successfully */
 * u4 U9 a- d! \2 R% zint GetExpValue(_Tstream& istrin, _T& nReturn){
 5 ^$ K+ o8 r) S% \9 B    _T t[3] = {0}; //雨中飞燕之作# B' S  Y  U* e* B
 char csym[3] = "++";
 , A/ I) @# q6 J8 }) J    int nLevel = 1, nERR = 0;
 8 ^2 h! y6 z$ @    if(!(istrin>>t[1]))istrin.clear();7 L5 U$ `/ R* r# L- [* g0 j
 for(;;){
 1 Z! g4 H: C6 T: b        if(istrin>>csym[2]){9 a; y7 K- ?& L. N2 q
 switch(csym[2]){4 x4 A( R; N% q1 W, ?" K( ?
 case '(':% g9 Y. }* I: b& N* B/ ~& L6 I0 i! I
 if(!csym[1]){nLevel=0x100; nERR=1;}else
 - h& T/ L: v( T% K( o" t                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
 , l( O& k( f8 B! W                else{nLevel=0x100; nERR=1;}
 6 {6 ?' M+ l$ J1 T0 J2 S5 q% l: Y                break;
 0 u/ P0 A) d3 |. }/ ^, N/ B9 D, B& O& `. J            case ')':
 . I6 O4 Y* T0 K: ^                {nLevel = 0x100;}break;7 B7 f  _' h1 {/ W& C+ K! T
 case '+':case '-':case '*':case '/':# N! ]8 }" y/ r6 t/ l7 F  ~% q% T
 {csym[nLevel++] = csym[2];}break;6 c9 |5 k3 C3 D* t$ \3 h) L2 B
 case ' ':case '\r':case '\n':case '\t':continue;: B& i, `; L4 F8 R& n; j
 default:9 n( p2 J8 {6 L/ G: q
 {nLevel=0x100; nERR=1;}: P, |# S# Z* @
 }0 B+ n. [, r% B- v+ B; }6 q- u
 if(nLevel==0x100)break;5 Q  p( J$ W  I8 h0 F- w3 D
 if(nLevel&0x10 || istrin>>t[2]){
 # X# Z  G9 g9 Z                nLevel &= 0xF;+ x7 d6 D% O: k- Z( Z
 if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: C. b/ j6 Y- j& W, p( B
 if(csym[1]=='*'||csym[1]=='/'){5 |) Y5 \' s/ P: i" {
 GetExpValue(t+1, csym[1]);
 0 N# K! n9 V2 [, r3 K) f  R& k" G/ s                }9 w/ c9 G  ~; F
 else{
 $ M6 s; A: o0 w6 E3 C' B                    GetExpValue(t, csym[0]);
 " T3 L- P' l  U1 z0 D8 {/ Z                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 F' x0 g* i$ S( O3 e. Z
 }
 # q9 B! v7 ?( e7 k0 F0 s                nLevel = 1;
 3 A' C$ v9 _* Z2 X! Q- k5 v' u            }
 ' z. |& @( c4 G+ v            else istrin.clear();% I( n4 X. i: Z0 T$ E/ w
 }" Q2 r5 g* f6 a! n3 E1 E" M- O6 T5 G
 else{nERR = -1; break;}
 . }4 q3 v& ~) V. m! K    }
 ' g5 g- o* S( z: I. n* j' n    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) d; Q  p5 W( a! Z7 [
 else nReturn=GetExpValue(t, csym[0]);1 g, }% P& a; Q- S2 c" }
 return nERR==-1?1:0;9 S9 v% F; V7 a+ _; I! ^3 B
 }}: R& e4 W! |- E, G% o( \5 n9 k+ Q
 
 ' S$ Y( ]- l; j3 S$ o
 : l0 x( w7 i7 x& ^/ j
 1 T( g/ k! d* a$ v. ?函数模板使用示例:3 Z; O% s! J6 r, p
 在以上那段代码的后面加上以下代码:' a( |9 f% E% |8 ]* D9 \! F; N
 
 , k/ S2 ~) G4 m
 , Y: I/ D) i  @1 j( I
 " \& ]( m/ L) N5 N5 o0 ]程序代码:
 ' v! }' m) v9 e* H4 a. C' M% W/ c7 X, y
 #include<strstream>6 q% P+ g% C7 J# F# V
 #include<iostream>6 X$ d6 A3 I- t2 O  o; E" A& x( n
 #include<string>
 + E" I. h6 t7 t. Wusing namespace std;
 0 P( d" L/ [3 w& v. dint main(void)1 j, y2 w8 }. u4 T2 Z7 h. \3 _; Z
 {
 9 F0 T& D. s4 {- c' X! V, G2 n    string s1;
 5 H7 v! H7 s1 q( _    while(cin>>s1)! b$ {4 z7 ^) w
 {0 d5 C: I, x2 `( F& E. r7 u
 istrstream isin(s1.data());
 6 E1 y2 y; Y: O  c1 d        double d;
 3 Q" ?9 f/ R  f% c; T        if(fy_Exp::GetExpValue(isin, d))0 j# \. Q4 O1 i8 I
 {# x/ ?, h- N! v" n) i
 cout<<d<<endl;
 7 {. L; N) y! e        }) c# ?- R4 C* F% k
 else
 ( i/ ?5 J4 @3 ]* B        {
 $ Q0 u  M" m" M9 r6 O            cout<<"ERROR"<<endl;
 $ m1 F* H9 C( W        }
 " ]/ H) j, Z6 z    }' f- n, o: `! d, x5 B
 return 0;
 ) H% o7 h  I$ i5 y, w2 D}
 ) r$ {. |0 {: t9 }8 x! K" Z, n3 H0 ?. R
 
 3 y7 q7 W+ I; y2 x& U6 \5 x然后编译执行就可以了(*^_^*)
 * |$ A* ^1 ?, a2 s! N7 V. u$ s! T/ s其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 r3 v( h* W" e4 V3 E# O. K( E
 建议使用VC7或VC更高版本,或者使用GNU C++编译
 | 
 |