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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
9 l( _; @0 }3 h7 ^* {* a# T一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- n A0 Q9 p9 z/ u: |
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ U3 `7 t# Z' V( H" Q参数解释:/ ~3 u1 k- p( Z' o2 |; Q, H' Q* m3 U
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
2 q3 f. M: o+ |0 x$ ?, QnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 u3 B! k; o; a! K- F( M7 E
返回值:
; o( v( [$ @) L返回非0表示计算成功,0表示计算失败有错误$ Y& w: L' t7 Z, @
: {7 c; O; n: i& x `5 i1 G
* X3 N- o% h1 y1 K* P
4 {8 _. [4 a4 _5 V程序代码:
/ v3 c- v$ o! Y7 K) ?0 ]7 n+ ^! y& j- A b- P2 b
namespace fy_Exp{. U4 ]3 Q( l2 ]) A' s0 G# v
namespace {template <class _T>
/ g# X) M4 L' Yinline _T GetExpValue(_T t[], char& csym){1 y. C& I; L% V7 E) p9 Z2 }8 r
char c=csym; csym=0;
% \8 L, G1 q. l switch(c){
' s/ ~9 k8 F1 @& l* P) P# k case '+':return t[0] += t[1];3 S; L; ]! N8 c' _, Y
case '-':return t[0] -= t[1];2 ?8 p0 ?- d0 I; [/ c3 p
case '*':return t[0] *= t[1];
- B# U# T, g" w/ l7 @" [8 ~ default: return t[0] /= t[1];//case '/':
: c2 D- ^; r4 e) S( q }
( k& O( }0 X. S, E! m0 {}}; s* a9 c) G0 a4 k8 Y
template <class _T, class _Tstream>
3 q R4 N" I' R k8 Z' a/* _Tstream: inputstream, _T: get return value
, H- K3 ^9 ~2 A: i) x* Return nonzero if get value successfully */' r Q# w% K3 ?/ x; y, E4 N
int GetExpValue(_Tstream& istrin, _T& nReturn){
X9 J' j- D8 {& t* g _T t[3] = {0}; //雨中飞燕之作4 o* m/ ]+ r4 ~7 G
char csym[3] = "++";( C8 F5 e9 m; U8 M3 w T5 k9 l
int nLevel = 1, nERR = 0;
/ J: G4 F+ @; y) S, a! J7 B3 x if(!(istrin>>t[1]))istrin.clear();8 `8 ?5 u, X; t. D5 h( |
for(;;){1 ?9 I, x* V5 H3 @' O
if(istrin>>csym[2]){* ~- d) Y- l! u
switch(csym[2]){
" c/ o$ T( V/ r case '(':1 U8 i: i7 |3 y$ z a
if(!csym[1]){nLevel=0x100; nERR=1;}else* }/ \' _* M6 G, g6 s
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( g% o6 q* Z& e: J8 G
else{nLevel=0x100; nERR=1;}
, }& M8 l5 W! m0 [ break;- R' x7 D J4 z% n1 R1 w9 |( t
case ')':
5 B1 a" X$ p: u% ? {nLevel = 0x100;}break;# B7 ]3 V/ W3 D' E! G/ _
case '+':case '-':case '*':case '/':- N/ }% s7 j6 J4 K$ w; L
{csym[nLevel++] = csym[2];}break;
2 e ?4 p' @, A) A6 q5 K$ e case ' ':case '\r':case '\n':case '\t':continue;
! X; ]9 |% g2 v% }& y8 g2 A default:
! g7 Y* Z" ]: A1 [& [$ [. e {nLevel=0x100; nERR=1;}+ z& O7 D/ T$ \
}/ V0 v+ i6 L* J9 J7 {
if(nLevel==0x100)break;
+ M3 Q5 `; X2 t* h7 r6 J1 J if(nLevel&0x10 || istrin>>t[2]){4 r7 Z$ f) {5 m( u& g: z! i
nLevel &= 0xF;
: }0 s9 U0 M4 b1 D9 ~ u6 b- R& i if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}% k' E" q1 g K; C9 v
if(csym[1]=='*'||csym[1]=='/'){* L ?+ g( _) X: S( K* p" ~
GetExpValue(t+1, csym[1]);1 A$ G* O2 R5 p2 n3 C( k, q
}
$ Y7 y7 g, U, W6 G6 i else{: i6 a5 l! k/ f
GetExpValue(t, csym[0]);
) ]* F' g, n4 H {1 o t[1]=t[2];csym[0]=csym[1];csym[1]=0;) h4 j' P+ G0 S4 }5 N1 j
} n7 K: f0 j1 P. E# C
nLevel = 1;
; T( `: |& Q+ {; l% \5 M }
6 L+ z& w$ ]# K% V. e0 S/ J else istrin.clear();% N0 Y" O- ?1 M! w: T
}
& i- _& q& v. y else{nERR = -1; break;}
$ o# @+ Y- J$ b7 f5 v; i6 ]2 A }% x! V6 f0 O5 B7 E; h- ?5 m2 ^; }2 X
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
) a: o4 {) R( ]" d4 @% e1 f& ~ else nReturn=GetExpValue(t, csym[0]);
8 x1 o) b0 N9 o2 R' Z return nERR==-1?1:0;* u+ m' J& z2 k1 N4 _0 U
}}
z: j1 i, q6 j7 m Q* U1 ?, ]: p" m' }. }
U2 G4 {8 G1 c8 | o
4 o& j. g. D4 a9 W3 l% Z% o& K函数模板使用示例:/ J( n4 h1 y" c3 }: J$ d4 ?7 {* s
在以上那段代码的后面加上以下代码:
! \( b5 `4 j- o" z* ~+ \ }) y8 Q! A! J1 ?0 B) t. Y% ?% s
8 l1 `2 k7 Y* h+ u; [2 Z
6 S+ K) Z7 U1 X, L( v, q
程序代码:
2 l0 c/ P3 w* L- d9 R
' h7 Y* ~* @ @, G+ p& L: R/ n#include<strstream>
7 v2 q/ f/ m2 h6 A7 t#include<iostream>
. J" C f9 e6 f4 E. e9 v#include<string>
' Z2 ]) e. B) {- C3 ]5 S2 j2 ~using namespace std;2 `) _0 u) f& q6 A2 ]
int main(void)8 L+ J: B! f7 v" i# q, t. F0 B
{
# g# C9 l% Y" ^! @' k1 H0 y& k string s1;# D8 ~) h0 Z$ |1 A" v
while(cin>>s1)8 G2 v; {. f* s1 ]+ H5 c
{
+ H8 k: R3 D# e: d) K. S/ p( ^ istrstream isin(s1.data());
8 U5 I$ o. \( \* G+ _# S( n7 [ double d;
0 Z. }- s" o' k% z if(fy_Exp::GetExpValue(isin, d))8 [% w) F- C( B4 t/ s
{1 v7 |4 [4 j3 D" \! k
cout<<d<<endl;
0 D+ |6 S# A% M: y }
5 w4 V+ j3 A y7 y) P3 h K else
o4 I! |4 X& b4 l {: s5 m8 i: B5 p, A5 Z
cout<<"ERROR"<<endl;, F* d, J- M8 V5 r# H
}
l4 P& H" }; s: P' U7 H' o" k }
# _; r5 Q2 X% f4 F4 S return 0;) v+ p& D9 w( A
}
- `) \- c2 z* [" R1 E1 n
2 j; n( o% ^3 ~$ H2 W% A, U1 b/ c" N8 U3 v' C
然后编译执行就可以了(*^_^*)" P( d1 m8 B* m3 F+ j( t
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" |- D7 ^2 p. c- e; M 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|