|
  
- UID
- 133
- 帖子
- 51
- 精华
- 1
- 积分
- 186
- 金币
- 55
- 威望
- 2
- 贡献
- 0

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
# j ]1 r( ^% T' n' d一个很方便的函数模板,可以并且只可以计算含括号的四则表达式# x# e$ \6 X& `$ @+ s: i5 D
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
; V A9 h. v! `: B. j/ a: [' t( K参数解释:
! \( u- q: y% k& {6 \0 uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; \6 e! ]/ C- ?3 y4 n1 q- ZnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 Q% z7 S; r5 h返回值:) h5 d% F9 _& G) X* e
返回非0表示计算成功,0表示计算失败有错误
) n) V6 B( c: r; I3 k7 H `) [6 | w1 T* s9 I& T
6 R+ k- \1 R3 S5 R Z
; i+ X1 \8 V" |; O4 Q9 O o$ S程序代码: ) E( d# v* ^/ l3 {: r8 }" Y" I5 o
4 b$ ` g% m# {. m( I1 |" p8 nnamespace fy_Exp{% t+ d- z% t2 A6 V8 w+ L
namespace {template <class _T>* s* `8 _7 ?7 E) L7 }0 A
inline _T GetExpValue(_T t[], char& csym){
+ }- U8 q* M9 h$ B4 f char c=csym; csym=0;! u7 g: t: z- I1 ?& @, U0 T
switch(c){/ \+ o. ]$ K. C/ @* ^
case '+':return t[0] += t[1];" Y) y* K u! h9 z/ R
case '-':return t[0] -= t[1];: w/ ^+ F+ v5 o/ j: r/ p4 l
case '*':return t[0] *= t[1];1 g) `$ m7 c1 N% j
default: return t[0] /= t[1];//case '/':
0 I5 f& D# d& a }! s4 M! d+ [* K# c# v: y- m) m
}}
7 u% H, @; B. L A# M* Htemplate <class _T, class _Tstream>, A2 T/ I6 N% t
/* _Tstream: inputstream, _T: get return value
n3 ]7 |9 A Q) q/ l* Return nonzero if get value successfully */ j- q* k# o# d+ n, ~! i# f6 o
int GetExpValue(_Tstream& istrin, _T& nReturn){* ~- _% h1 J' C
_T t[3] = {0}; //雨中飞燕之作
. c& b, |+ S: A5 V& p" U3 p) u2 M char csym[3] = "++";1 b" u3 G7 p7 d9 t# z/ s' u+ o
int nLevel = 1, nERR = 0;
9 R; L. _- Z! Q if(!(istrin>>t[1]))istrin.clear();; C4 c9 A' n3 h s. D* h3 X$ ?
for(;;){
( O# w$ [2 ?1 `( t if(istrin>>csym[2]){" A& ^: P' o* W* E2 M& b9 B
switch(csym[2]){
1 n+ ]) _5 y3 ~% V3 B case '(':
" W! A& h, _. U1 G8 F8 F0 b9 k8 E9 x if(!csym[1]){nLevel=0x100; nERR=1;}else" P# j) O, P) f% h
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;7 F% V2 `8 y4 P' m" c7 @
else{nLevel=0x100; nERR=1;}
/ V$ Z7 t3 I4 P* p2 m' w break;8 J D0 k& Q+ p. e6 {
case ')':: O5 }7 r% `' i# _. Y7 d
{nLevel = 0x100;}break;5 }: K) L. `' \: ~+ A. k }% n- _
case '+':case '-':case '*':case '/':7 K- `$ O9 j9 }6 l
{csym[nLevel++] = csym[2];}break;8 H' E; \: r. d
case ' ':case '\r':case '\n':case '\t':continue;8 N( o+ G& i$ ]% l. x! J2 i5 T
default:
& ~ [, F7 T) E8 i5 ~* h$ `1 Y {nLevel=0x100; nERR=1;}
, K3 Z- L. u \. l/ L }0 P2 r; |0 u& x3 l1 s3 i
if(nLevel==0x100)break;
1 f* r" l) p/ p* I7 q if(nLevel&0x10 || istrin>>t[2]){
7 P- U! y- a* J4 i1 v! `( y; Q4 D nLevel &= 0xF;5 X, a5 B2 K+ u6 x
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, N5 Z! a5 a4 Y3 {) v f; z1 D if(csym[1]=='*'||csym[1]=='/'){
! T7 c4 \3 b4 K: w2 \& b) ^ GetExpValue(t+1, csym[1]);9 C# h5 {! I, m& l
}) J- x& V, O9 u( q6 t
else{" z0 n0 A- G0 T% B
GetExpValue(t, csym[0]);7 p9 U- v! k0 B+ l& I E2 `
t[1]=t[2];csym[0]=csym[1];csym[1]=0;9 l6 v9 ^/ X8 j: J8 n# m
}
( G: ]# n* Y A+ @ P: Z* q nLevel = 1;
" d0 x+ T# A. r8 _6 k3 l; V }8 p- Y- ~" l/ i+ H' A
else istrin.clear();9 }; T# ~" \$ w+ e+ e
}8 K: w( V. p0 L' Q4 t
else{nERR = -1; break;}
) s* m8 b0 \& x) D+ u }, K; L' s8 y/ S* Q' X! _5 P
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);* F! o9 u' T; d
else nReturn=GetExpValue(t, csym[0]);
5 Q- z# S: ?4 v6 j) k return nERR==-1?1:0;3 Q7 G M. g8 s
}}
% o) r) x$ X2 J' ~
/ k- t5 r- m8 V+ S4 O& |
[3 h' p" B3 D7 p$ m, P6 Z+ t9 ]% H+ j2 c" g! ^6 ~1 n. k
函数模板使用示例:
# F" k1 {; b( _在以上那段代码的后面加上以下代码:
/ E( h3 |% P4 G. u; r2 ], e0 ~4 _ E' i1 h. j6 O5 t% Z( o
4 Q7 t* b) i$ m1 z3 K( ~4 U' {. B. D' w2 M
程序代码:
% h0 e+ j p3 ?' I4 n
& g! S6 C. D' H$ C. s#include<strstream>; D/ ^+ h o6 W8 y2 I
#include<iostream>0 ]' r' A! O, v* C, J' w; w
#include<string>
1 `, f5 _0 A% V* E9 f9 Susing namespace std;& y7 {) w0 \3 V5 }- d2 r
int main(void)
9 z* U/ e y& i- M9 Z{9 a2 M& ?: H0 H+ o
string s1;
7 {. Q+ r& M' I while(cin>>s1)0 x; d, ]. Q! r4 t3 d$ w( i
{0 X7 M# \* k2 }5 h
istrstream isin(s1.data());
- ?' b! ?0 x$ n( V5 c" l$ ]+ M double d;
2 k7 L! v! [ R) a if(fy_Exp::GetExpValue(isin, d))
5 U% `7 y+ s- L, ^6 `2 l! Z {3 \ ^! E6 h! N' V5 P$ v8 U! g* ^, d( [
cout<<d<<endl;
* l) n' f3 n+ R7 W* w1 {0 Y }
9 S- a. }: X; |3 w. a% e else
/ P7 b; E! K& a) h8 L {
' h4 k% i5 x( Z9 X' z) I1 Z8 J. y5 ? cout<<"ERROR"<<endl;1 ^7 A1 t' }6 J' F/ q5 c
}' U/ y& S; k) j7 d
}
" U- B2 I* O7 q+ e4 O return 0;
( R- E V8 s- } `$ W) n* k}; v$ X& W8 K9 D# r3 o
' m& ^' F5 _2 v
9 E" J i& Q- L: O0 r: ?: d
然后编译执行就可以了(*^_^*): s, J$ P2 r# q# b
其它:TC++上一定编译错误,不保证在VC6上也能通过编译( h+ K4 u, M1 @; a; H
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|