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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,, \! i" `* O5 Y. |+ V
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& n0 f4 v1 E( Z& W- f只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
I6 n, _7 j% Y! t参数解释:" q o$ L% a5 Q* a, u' B
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 H* ~6 ^* A" j; ~- C3 c6 I4 @# E
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" M5 e! ^* X1 i, F返回值:8 @! n, \! r4 L( J, r- l% C+ ?
返回非0表示计算成功,0表示计算失败有错误6 x; m: q7 e8 p8 }9 {2 |8 k
' H* Z+ y# v' `# |( N! q- S
4 D! P. \+ A7 s2 t) _7 ^7 o: s1 E8 X1 }, Q
程序代码: ) B. P# `+ s0 l
% s+ Y5 r$ @ }6 \& a& [' A5 Q+ Qnamespace fy_Exp{
5 H* F* E- D5 q' s* i- }, ~1 `namespace {template <class _T>( Y; e4 I$ h4 o' r f5 p+ k
inline _T GetExpValue(_T t[], char& csym){. h4 Z* l3 U b( P! `7 Q8 R
char c=csym; csym=0;0 z5 [! ~3 ]) t- }6 |1 ]1 Z9 @
switch(c){# q, |# C0 j8 j2 D* d; G9 d$ B9 X7 V
case '+':return t[0] += t[1];9 f/ Z- M( V' i: k" Q. m
case '-':return t[0] -= t[1];" s+ W4 O# O* N! t5 F4 k
case '*':return t[0] *= t[1];
) R% `8 @: x& ]. D8 ]" @- ` default: return t[0] /= t[1];//case '/':) [+ K+ ^1 H0 W
}* G" O! l4 I& d) a9 B8 [' `
}}
8 _* [0 G; N! e7 H, j6 J( `" ^. V' Dtemplate <class _T, class _Tstream>
# p" y( i) N9 z: G, o# K! I7 r/* _Tstream: inputstream, _T: get return value
+ {& {& P/ A, V2 Y2 H0 Y* Return nonzero if get value successfully */! |. ]' R" c. j5 w$ }* B
int GetExpValue(_Tstream& istrin, _T& nReturn){
3 V z0 Y, F* g2 H. N _T t[3] = {0}; //雨中飞燕之作. m2 Y8 U6 o1 T. k$ x
char csym[3] = "++";
( Y% T( u# I, a# O, k8 l int nLevel = 1, nERR = 0;
0 y: g& w) U+ ~7 I1 E; y5 Y if(!(istrin>>t[1]))istrin.clear();5 u& Z8 `. a9 j6 P+ W4 j+ s% Z
for(;;){. T9 w5 f! k# P' E- K1 k* _) G
if(istrin>>csym[2]){4 L0 H# W' M" K, @
switch(csym[2]){" e& k9 G: |; K# O: s
case '(':
0 S, v" H: l: S3 B | if(!csym[1]){nLevel=0x100; nERR=1;}else: k" z0 O. Y( o/ R
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 O7 a/ O8 E, j0 U+ V/ W else{nLevel=0x100; nERR=1;}" }/ P" x: ~/ ~* J2 C
break;9 Z) |/ h4 b. u0 W
case ')':
; {, k! n4 |; A& v3 H& Y+ p4 H {nLevel = 0x100;}break;
$ S9 @( J" a6 t- H. O, k/ R3 x case '+':case '-':case '*':case '/':
7 G0 T. |. |$ o* D4 l {csym[nLevel++] = csym[2];}break;
3 ~6 M& ?+ [; G6 r( E case ' ':case '\r':case '\n':case '\t':continue;
0 Z2 \" }7 a; i% k6 h default:
1 g" R( B: d- x6 o" h3 B {nLevel=0x100; nERR=1;}
* D' p4 K- n' z, X* R' q, Q }4 Y) U, E6 K- a/ ]5 K
if(nLevel==0x100)break;
4 K5 O/ q" Z5 ]' N if(nLevel&0x10 || istrin>>t[2]){
. S! }% i7 T: Q, J1 v nLevel &= 0xF;
: p9 U+ P$ j9 b* k+ w5 a4 T if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
1 J, p6 U |$ O; Y e6 D, k4 q if(csym[1]=='*'||csym[1]=='/'){% h# e9 {9 h5 p b m
GetExpValue(t+1, csym[1]);, `* G3 B1 q2 l% w, X1 b* d5 B
}0 ]6 U2 m* r) F$ |
else{/ P8 R- o* L* v
GetExpValue(t, csym[0]);
0 n4 U% `& u8 o. k" ` t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 j& P+ ]6 N6 [ }
, G8 H. E- o" M e7 m: q! V9 h1 { nLevel = 1;# f; `+ q% U& R2 ?/ U( ^& o+ \
}, M- T4 K: i, \3 m/ f1 C) l! f: e
else istrin.clear();: V- ~3 |7 E% B
}( i D" X) p3 h% Q, ?6 \, O
else{nERR = -1; break;}" N- H: n# q y1 L
}
3 @% L4 `+ q* K& | Y% S3 Q if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);, T I9 K- N, ]3 }1 D4 {
else nReturn=GetExpValue(t, csym[0]);" t2 B- Q% H" L" h* Q
return nERR==-1?1:0;
/ A! ^. D( n4 \1 l}}+ ~7 X% ]2 e) ] O7 \' s
2 P; O( v( ^3 S1 u& P0 \* ?
, A0 g+ o1 Z% i8 m& f( {4 t. ^) f) O6 ~8 [8 Y! {; I9 ^
函数模板使用示例:* Z, u3 Z) T- e- j7 z
在以上那段代码的后面加上以下代码:* G. L* y& B2 N4 y% f" L
" n/ l- ]' M5 V( V2 m5 I' B; s
' X0 j# J. c6 k' j; `+ _
4 k. b! n* O B. U# y3 `" [5 o' g. V程序代码:
, A! S: l ^) j( |! v1 q3 g: i+ E/ s( t
#include<strstream>, C" z9 X5 y' K
#include<iostream>' a* R. E) {6 I
#include<string>$ L1 w& H/ J; F7 \- n2 z+ m
using namespace std;/ ?$ ^, Y- Y1 g4 ]
int main(void): @ _! N& ~3 W9 B
{
: w2 K& q- K4 l5 r- [, J1 ]" z' `% U string s1;, g6 N# _: @% e t1 t
while(cin>>s1)7 F. a( q, `4 B* k: x
{: j* ^) ]" t8 @2 P
istrstream isin(s1.data());
S7 g* t: {3 S$ T/ ] double d;
8 T' e5 _0 Z7 I4 _9 z2 ~ if(fy_Exp::GetExpValue(isin, d))
) b! C) z x3 P! [/ S9 A( n/ h {
* w) H% O: O' W& k* i cout<<d<<endl;* ?1 ?; F6 [6 t8 r$ R
}+ q. [9 R& R( T; h2 O$ x
else
* U, l! V$ E( z/ @, S1 u {6 r4 D5 n0 U. n9 X$ H1 k0 x
cout<<"ERROR"<<endl;
: }9 e4 z0 Z% w2 h }
- q) p% u9 E; e5 w. b }
: ?0 e8 q8 c7 X, }+ D return 0;& N: r* C5 M6 ~4 Z2 A5 M7 X
}+ R' u7 @3 I g3 R
% \8 a- H2 h& J, \. D* e. f- G' J5 y1 e: N* W- j- @0 [
然后编译执行就可以了(*^_^*)
0 K, @3 B( `1 A* p9 D其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ O. T, W+ z) [, H" u
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|