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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,0 t+ E0 f, N" ]# z
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
7 c3 e: F) |0 B% \$ {* E0 X/ Z+ Q' S7 H只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2 h$ s% B! S5 j+ A, R& V/ [; ]
参数解释:
( s& M& p3 |8 }: h& t0 k# Pistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
) B; j3 s/ y* n1 a9 C$ gnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
- U# n' E; I* c9 K) c5 p返回值:6 g" u. r* R- w
返回非0表示计算成功,0表示计算失败有错误/ b1 X0 q! x/ Q3 [7 j
! n D& F+ E/ F' a0 u; b6 o
" l7 [6 k" U+ L* Q) U
9 r, M2 E5 y1 r* Y5 \/ }
程序代码:
# ~& `; w+ m8 o7 _3 |4 b. H+ |
+ a! f2 k7 i3 Q7 U! H: |namespace fy_Exp{! Q+ y. G7 _+ p; u& _, ?/ O, w
namespace {template <class _T>8 ]7 e: R" N' v6 o& z0 x* I
inline _T GetExpValue(_T t[], char& csym){* Z2 K. h% ?! ?1 y# W$ n
char c=csym; csym=0;
9 w6 b. Q4 {5 G$ J" r% \2 y/ H switch(c){/ R0 m. k5 I9 N7 M3 m8 {2 v
case '+':return t[0] += t[1];
( J9 p/ M! g6 c1 N) `( H case '-':return t[0] -= t[1];
# q0 M$ [* j) Y& L# b1 T* ? case '*':return t[0] *= t[1];
2 [/ h8 h0 q: ~' x& t default: return t[0] /= t[1];//case '/':
4 }0 T9 r" U5 ? }
7 w" g: W, b4 @! O2 z}}: n8 ?4 F% M) l2 M* P1 M
template <class _T, class _Tstream>6 s% ]7 \: j# U T- p; d
/* _Tstream: inputstream, _T: get return value
0 V6 I) o' e/ F* Return nonzero if get value successfully */
2 i$ o- z. @$ S& U+ x- N; tint GetExpValue(_Tstream& istrin, _T& nReturn){4 }# J0 F5 @' D3 Q
_T t[3] = {0}; //雨中飞燕之作
% i) }/ V P t9 l" l# Z char csym[3] = "++";% X( P5 B4 o4 I8 b% n( w; u$ G4 ?
int nLevel = 1, nERR = 0;
& M' l8 o" s6 r6 a: Q' R' ?2 ~3 D" E if(!(istrin>>t[1]))istrin.clear(); z% h% X+ y. f- A1 y: x& ]
for(;;){( l! l2 L# p1 t* [" {7 x9 @
if(istrin>>csym[2]){
$ `- _$ e" [1 }* l2 B& Z switch(csym[2]){
8 R& |. L. U* s# r, ` case '(':
+ A( v% h8 U6 H8 m5 |0 v$ X if(!csym[1]){nLevel=0x100; nERR=1;}else
- [6 e ^ A* W& E2 t if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 h( N2 l% f x; \* r# P else{nLevel=0x100; nERR=1;}
) V9 `9 V1 S+ o+ G' G T2 H break;4 |; `6 U8 Z) N4 U
case ')':! P; u- { m9 e
{nLevel = 0x100;}break;
+ f2 {- A/ I& f: \3 ?7 m, D case '+':case '-':case '*':case '/':
- a: N( i+ Y% i( G1 F: B {csym[nLevel++] = csym[2];}break;
7 ]7 O6 W: y3 u b4 i3 ?! m case ' ':case '\r':case '\n':case '\t':continue;$ A$ Y% z8 T+ u/ n, }' _ |; d! `
default:
) r8 d* Z5 k+ x& ~$ a$ N/ f4 r {nLevel=0x100; nERR=1;}1 g( z" b) L% _3 q( r
}
" X- N b, X/ o& v if(nLevel==0x100)break;8 W- E- a/ v1 u( H
if(nLevel&0x10 || istrin>>t[2]){
* \" Q1 I5 F/ u nLevel &= 0xF;
9 F( P' M k& G* F; X if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}% H; o4 o8 `" x8 n2 O ]
if(csym[1]=='*'||csym[1]=='/'){! \$ A2 F3 [6 f/ y0 \8 {
GetExpValue(t+1, csym[1]);* m5 O0 f3 [) ~8 b' u
}3 ~" U+ A. _7 }+ P. m
else{: ~: A9 |/ d! o u3 M/ C
GetExpValue(t, csym[0]);( _' _' w8 b5 x$ d7 E& o7 T
t[1]=t[2];csym[0]=csym[1];csym[1]=0;$ D! Z3 r+ r. _$ l f. \5 z# P
}
& r9 Z: E9 h$ r$ f9 [ nLevel = 1;; O7 ?0 b; i$ v- h: f
}
6 T$ e2 \9 N& z4 |. @ else istrin.clear();
$ d+ W" O0 h- B } | d4 B' H! a
else{nERR = -1; break;}5 ]: z/ i% {5 D- P
}$ ?0 R& Q: ]! }) ? P& \1 S
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 q/ b+ n) {( s/ [2 h1 W
else nReturn=GetExpValue(t, csym[0]);
& S& t" y0 q7 w( O return nERR==-1?1:0;
+ m# u4 Z, L! h7 v a5 ~}}9 ? C1 l- ^1 `' ~! r+ C5 t% d' b
% p$ s! t) w3 W: G
: y% d. ^6 s' l! C$ Y3 L3 Z7 s4 O- Z
4 @2 |& u) V. m \! L3 `2 V+ J函数模板使用示例:3 q& l1 G& E) d x7 ]
在以上那段代码的后面加上以下代码:
+ R6 A1 |9 b% F8 {( Q( [; t$ `9 _1 G5 B
# n# P9 v& g8 E9 @0 `% z
6 y8 {' S4 a' }* f程序代码:
8 O. l1 P* C |; c1 s
2 U/ G7 x/ `" j#include<strstream>+ L$ k4 y( G0 y2 M. }' u7 J
#include<iostream>
+ p e; L4 }8 H0 X6 t8 E#include<string>
; ^2 W+ t* G7 X* v: g& T- }/ P0 uusing namespace std;" h. R5 w D. e' H' M
int main(void)
% v; v/ _- ?) ^ X8 r0 s1 H4 ?3 Y{+ ^+ l- m+ |% B" N
string s1;" w' R- b8 |/ n6 [* _. P
while(cin>>s1)# T: h* F; W7 \) x
{; S- a6 U7 ?$ a0 S1 {4 r4 L1 x
istrstream isin(s1.data());
1 u2 @8 n% u2 x9 ?* L0 H+ o. n double d;0 j, A/ c- F3 F2 E7 R2 w3 x
if(fy_Exp::GetExpValue(isin, d))
* \5 i+ J) h- v* X {
0 [, { ^4 E. E3 k. c3 Y) v cout<<d<<endl;
5 z2 v3 V( z2 Q. ] }) B8 N) b5 Z$ k% Q
else- R/ R; p0 u* O7 p( F) i) \
{
+ L7 b; }2 j X; c1 e2 ~5 s cout<<"ERROR"<<endl;8 H0 W0 N; Q6 R( J
}
3 [6 Q; m8 w! K8 R# J! E }& h7 }6 T4 D* u' u5 R" {; l( I8 t4 k
return 0;- L! z: B) }6 R2 S0 a
}
. D" F% U+ z3 Q8 G1 ]- y
) q$ l; U2 x# p1 J# B- M: L. d0 A# h# l; M& k9 C
然后编译执行就可以了(*^_^*)
Q7 V4 b0 O- j) p0 U1 s3 }% o5 K0 e- T其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ p6 }: J' v5 W 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|