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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
* e& c/ t1 m& q ?2 {! B; L* f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 H3 v- A) s+ s, y# L. }只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
: ~* _6 _' u/ }, @/ b' W参数解释:
* I( a5 H7 d$ Cistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ z5 `6 A* }3 n4 n/ ]$ O8 W
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. i; w) D" v5 M6 n5 d$ Y
返回值:% }$ u! D! A8 K$ k' Z
返回非0表示计算成功,0表示计算失败有错误' u- }* x. S% o% N' S# I
2 S4 s/ `7 R2 {' ?/ h/ A! I
`# j; b/ C7 N; l7 b u D9 L6 \8 S# V7 t3 W0 {8 Q0 J/ {! V$ A2 z, i0 {
程序代码: 4 U( c1 W t8 M) P& `
0 c# |$ G& @# n6 E" W, h& ]* Y
namespace fy_Exp{
: L3 v2 R7 D: b& f; K, \5 p3 Snamespace {template <class _T>8 w+ H! A, h1 ~$ P0 |
inline _T GetExpValue(_T t[], char& csym){
, ^- S% l# C' a7 ] char c=csym; csym=0; w6 O4 T+ ?; d. q. {5 P
switch(c){
4 J- Y$ I# j- v case '+':return t[0] += t[1];
6 e: H5 g8 a, V9 Z& o+ @+ G; p, C7 A case '-':return t[0] -= t[1];5 ~* ^& a Y$ R r4 Q- r
case '*':return t[0] *= t[1];
" w" _& S' c5 s4 @ default: return t[0] /= t[1];//case '/':
3 p$ `( _! K' k }
1 W3 o$ m+ L; `2 o5 c7 {: p}}- ~0 e3 n. Q% _% [: |1 \+ J7 S
template <class _T, class _Tstream>
# @1 a* q% {* c4 Q6 W/* _Tstream: inputstream, _T: get return value
$ x9 A$ p b0 J3 a: O) W* Return nonzero if get value successfully */
2 [/ K% l6 }1 d, }, pint GetExpValue(_Tstream& istrin, _T& nReturn){
1 o9 R# P2 G% y2 h E" C _T t[3] = {0}; //雨中飞燕之作
! r4 E" f( V3 U. ]/ a char csym[3] = "++";+ }% O" Z ]! O( b5 a& z5 p1 e8 t8 w
int nLevel = 1, nERR = 0;
5 u H* }; m Z5 m# P if(!(istrin>>t[1]))istrin.clear();
2 c8 ] [) i4 L& W3 B for(;;){8 D. b! L# ~8 u. m
if(istrin>>csym[2]){
. r7 h5 L8 D9 H' m switch(csym[2]){
3 i/ u& q' B3 U case '(':; ^ ]3 \4 W8 g7 [+ v/ `
if(!csym[1]){nLevel=0x100; nERR=1;}else% C5 F1 o8 t2 g
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 r1 I z3 l0 D9 r& x. Q else{nLevel=0x100; nERR=1;}. p l/ ]' {; x; \5 O' y& q' H
break;1 \: u/ P! I4 @/ S O* J: K
case ')':
# t, M7 R4 Z7 y0 Z7 l9 Q {nLevel = 0x100;}break;6 {- I' `! n: o1 W5 V& T- _8 g) U
case '+':case '-':case '*':case '/':
9 M% l. }* r4 Z9 p {csym[nLevel++] = csym[2];}break;
7 o8 n+ \ h7 G# V; ~ case ' ':case '\r':case '\n':case '\t':continue;
. Y: g9 g; G" }9 p+ d+ j default:( S6 C$ S( |/ r+ v( B
{nLevel=0x100; nERR=1;}
2 X( l# N3 B! D, B: G }
) _( \# e, l# V( B9 l if(nLevel==0x100)break;
" t7 y# ^5 a% P- q if(nLevel&0x10 || istrin>>t[2]){
. D7 }9 v' h# ~: ~( k% G nLevel &= 0xF;$ F$ X$ @7 N5 r' e9 M& X6 k4 X5 ?
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 ~/ L1 y9 U* K if(csym[1]=='*'||csym[1]=='/'){* X: ~/ g+ k9 R3 U4 c# q; R) _
GetExpValue(t+1, csym[1]);
' O9 O$ i" i" ]9 R' S } l" V6 g1 J' C
else{6 L; ~2 H( g- c, D
GetExpValue(t, csym[0]);
/ r3 x8 B O+ p. n9 {. g t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ G d" e% y# R3 | }
) g! _4 V* t. \, `; O6 {1 J, w nLevel = 1; f( x( p+ h0 `; c0 N
}
3 P0 j9 R' a8 O1 P e! [! v3 a else istrin.clear();
# O: y; |! {9 }% i d, R, N: s }9 `/ v9 y3 Y. J6 S& a
else{nERR = -1; break;}) e x* R- n) \0 m
}: b& j4 W! w3 G; L" E
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 Q2 X3 K( E0 g! t% \. Z
else nReturn=GetExpValue(t, csym[0]);0 U2 U N- \: T7 m7 f8 A6 ?! I
return nERR==-1?1:0;6 a# c* d6 E4 T9 \, ?6 h4 a
}}
! x5 B- i' h) b) g. x. V2 f! c" C" R* ~4 R5 Q) W. w* A
3 E* A; `4 d5 r/ l0 B) J
. Y) D9 L2 S' s9 R5 R, b函数模板使用示例:
/ s9 v. z" I: z; F9 K0 v$ r f在以上那段代码的后面加上以下代码:
, u* ?; W4 o3 K$ q2 @8 B6 l* F1 p/ N% }6 H& S( e
i* c' j3 t8 J/ h" q& }
/ N& @; b- i) m程序代码: / Q* ?$ ?8 U. y7 F4 G
2 T& y+ t' a6 S+ M2 U( n3 F5 e! S
#include<strstream>
& ^+ W) z8 O+ Z5 V" J#include<iostream>- @. T$ g& h/ s9 q. Q' C
#include<string>
& q/ n- A1 T6 lusing namespace std;
: Z1 v4 S$ l: S9 }, M! E: Q" Fint main(void)
+ h9 I* [# x/ }5 M: N: X j{
3 {* Q N6 C' \3 ~/ ? string s1;$ ?7 t4 l% Y2 O
while(cin>>s1)) z+ A; b+ G& w F' \
{( I2 G4 }7 K( e s z
istrstream isin(s1.data());% c3 ^" Q0 @ ~- c5 @+ k3 p
double d;3 G; e& _; q9 @7 n& A
if(fy_Exp::GetExpValue(isin, d))
8 Y$ m2 I9 `+ {0 @$ f {
+ q( @+ z* ?1 d8 t4 q9 | cout<<d<<endl;
9 o; m: `) }" \0 \/ k& T$ g7 h }
8 E. v5 e1 H1 t5 E else v* {; s3 h% q# [/ D
{$ Y. H: n1 u4 H v2 w* Q
cout<<"ERROR"<<endl;; B- u8 ]) u; t# C$ o/ o* F, ~
}) A+ X8 C6 m6 i( A
}( m! W0 d _1 n& ]
return 0;
! p0 R/ t) R' Y- o: N}
7 W% a) D8 w2 Q, l# `0 v0 T7 j1 V
# O; x" q7 ~+ m& b
- L D2 z$ k4 ?' A7 t然后编译执行就可以了(*^_^*)3 G6 G7 ?) ^/ l
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ x! ~7 }! G( P1 ?: w 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|