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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,, ]8 i3 j& k4 y9 E& o, y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& x* G! b( l/ c0 e6 A; ~/ |( w
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# l" o& C8 m* _. l7 p% x8 k参数解释:# |5 `$ {5 A6 A4 K
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
5 g) l* r& F8 S7 W; bnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* U% v5 r7 o# p" X1 j5 @& u
返回值:. a. b% @5 ~2 q3 X
返回非0表示计算成功,0表示计算失败有错误; Q9 x' x* W- b& g9 M
0 C; h& `0 ]4 [) I# K. C. g4 s5 |
' {" Y1 E9 z! x# l& N$ C0 z. X0 S
& q+ V& r- C3 }! {; y3 E程序代码:
* Q! J. k* j8 l# c* |8 b
! Q6 O' z6 v h! v: J4 C6 [/ knamespace fy_Exp{. Z, `; x- k! `" ^
namespace {template <class _T>/ j6 T# }9 ?6 f6 a
inline _T GetExpValue(_T t[], char& csym){
6 C5 V9 Y) Q! `4 b0 R char c=csym; csym=0;
. m" ^ l9 s% s7 k- ? switch(c){
, l& n. C& P# [% q. Y8 L case '+':return t[0] += t[1];" L- b9 N5 x g P$ l
case '-':return t[0] -= t[1];
; s* B) H* B6 ^ case '*':return t[0] *= t[1];
8 N; U( M, s9 l( v* b default: return t[0] /= t[1];//case '/':2 C9 S/ f! P6 L
}2 U% l$ M, W' n/ g2 l+ O/ s, o8 G
}}
$ T% ~7 e. n9 D6 N0 Btemplate <class _T, class _Tstream>- O5 Y1 d- s/ y- E! x" N
/* _Tstream: inputstream, _T: get return value' T# V" j# |8 |& y
* Return nonzero if get value successfully *// K, j5 D M! c9 R. }
int GetExpValue(_Tstream& istrin, _T& nReturn){" Z8 Z; k+ _) N- N
_T t[3] = {0}; //雨中飞燕之作
, J8 M4 r5 [, n) y- h4 _ char csym[3] = "++";* c1 d+ ]- \) O
int nLevel = 1, nERR = 0;
) L% z( P4 Z; p if(!(istrin>>t[1]))istrin.clear();& ~0 N& O u Z) J4 C5 G/ }! V
for(;;){" L' K; w D6 b6 d
if(istrin>>csym[2]){
, P4 l. P* J4 w# o9 t; v0 w, k switch(csym[2]){, l C8 @4 B: I0 C; ~, B
case '(':
+ |6 ~9 J- Y4 [4 E9 y if(!csym[1]){nLevel=0x100; nERR=1;}else+ R! X6 W4 K, s3 x; T% q
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! a5 L' `% Q: W/ E# ~$ B! D" m
else{nLevel=0x100; nERR=1;}
X, I# \" s. w5 O break;* W! L. N" b) k" O w4 F
case ')':
* J$ O4 ~& e( O9 [$ b+ {% i {nLevel = 0x100;}break;- q5 W: o4 M. r/ a/ @$ q0 v u6 Y' v
case '+':case '-':case '*':case '/':. @3 W8 G3 m L4 m
{csym[nLevel++] = csym[2];}break;& C5 S s# ?. e5 m
case ' ':case '\r':case '\n':case '\t':continue;
6 w+ Y6 R/ @- L7 I) `5 t# | default:
7 B9 ^( z+ |% n- m {nLevel=0x100; nERR=1;}
- A6 ^; `' H' G }% P3 z9 F! T! Z4 N" z
if(nLevel==0x100)break;: r( ~9 X6 j8 Y6 a& y j+ d
if(nLevel&0x10 || istrin>>t[2]){1 t/ e4 y4 B6 C1 @: N$ g; C! j
nLevel &= 0xF;
! u! S% h' H# e7 }) Q/ N/ T if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. D' V, E1 L( ~! |1 g* {7 C; |
if(csym[1]=='*'||csym[1]=='/'){1 v' P; @+ L+ ^# e8 q% ^
GetExpValue(t+1, csym[1]);- F' I( t9 q( Z7 g) q! ~
}
) N, |5 K# c2 [0 ~! T" q1 `$ v. f else{5 Z0 p$ y2 d! ~, R
GetExpValue(t, csym[0]);9 U7 v9 g2 h9 b! h+ M7 j+ g
t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 r* A! I$ u1 \. |2 G) Z
}- K b; \+ `& e9 U( E% z
nLevel = 1;
; l3 Y, j8 O T7 n6 W5 p" B) {- G }
# U6 K* g S+ Q# `2 N else istrin.clear();1 ?! _/ @$ ~" ~' `# W
}! i! w; O, U% p3 n V9 Q% C# Z
else{nERR = -1; break;}
8 d1 y7 _3 N0 o' u }
3 l! m V" r- M( B3 j. d/ \ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 Y9 V$ J4 n* E. z* ]8 ]% E+ A! A& k else nReturn=GetExpValue(t, csym[0]);- S$ j; V, g, ~* _) u6 U
return nERR==-1?1:0;! I: ~& b) M* R7 A* n
}}9 x' H, \8 o. S6 Z8 p6 L' M
5 H. ?3 T! a# S/ _/ X
- G$ ?& ]1 p6 Q# u* f$ ~: g% f5 I/ Q4 P
函数模板使用示例:
; j1 y+ b5 j8 N/ U7 M0 m' t在以上那段代码的后面加上以下代码:! h& s6 ~) O8 K. Q, b
9 b" f! B6 Q/ ?7 Q
; b. m- L% H9 I5 S8 Z- b% y# ~
; D0 N* i& H1 n* b9 L" ?程序代码:
! m1 V% M5 ~/ r) B0 S) h4 X" a# _) R$ S+ M+ Z4 a
#include<strstream>
' W0 C$ r0 b) N0 S#include<iostream>
/ i( ^# J5 n* U! D#include<string>
! N2 q* s/ V2 X# y; qusing namespace std;
8 t+ X& \* y3 r! P# g8 Nint main(void)5 e0 ^7 H* x; S, o! V$ A- [6 Q
{
( J1 G L! {% V string s1;% ? U8 T. L g% e
while(cin>>s1)8 S; V, [5 l* o- A, Y
{
2 \1 c: n6 d0 x2 j# V istrstream isin(s1.data());
0 N( y0 e& c4 r% J% h double d;
" N; \5 ?% w2 R! n" a J if(fy_Exp::GetExpValue(isin, d)); w* A( {% J: K& P! I% h
{
* `: U- L' W$ }( H' J4 `) V cout<<d<<endl;
1 @3 D$ L/ u5 L' d }# V) \- t! Z6 i. h' @
else
$ B# h8 T. o# o {
0 L+ c+ N3 y* B cout<<"ERROR"<<endl;
1 F: A1 }# \1 L }
" L+ T7 _2 W8 P) y }
$ Y& m% v7 `% z! t return 0;% U9 M1 m* N1 j& d+ O3 H' I7 M
}% X/ h% u: }6 Z, ?3 \
, m# K2 M1 M5 i& {. r, S
5 r- |- x- G8 w7 }, r: O, C然后编译执行就可以了(*^_^*)- _6 l" V; |' Y6 `4 m6 t
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; {( u% Q: W+ q, t7 X0 ^3 K8 W3 r 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|