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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,$ _" V/ t4 ]; l9 U2 ]# E
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# e3 ^6 n1 c; K* r* g只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
$ K5 y/ w7 S- I8 n1 g- H" X$ j* B参数解释:
, q6 n7 r. [' e, Histrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 T8 s+ L2 v' A( }$ H) N8 _nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定- c8 l% ?! X2 x* I# m5 L6 h. G+ ^
返回值:
/ D/ u% J. \0 f) q0 ]1 ]返回非0表示计算成功,0表示计算失败有错误
8 C6 @/ T$ Q" u0 F
5 X3 A% }1 d# T8 O3 q 1 R7 [# b% [5 ^3 F% p5 {% y! G2 u
6 V1 C+ d! I! f* \. q8 `1 X5 l! x
程序代码:
6 a6 f! M" o3 Q2 Z G& f
5 U, x0 u7 M- P5 v( v; A: Bnamespace fy_Exp{
9 z6 Z+ z1 c" m; f5 V0 Xnamespace {template <class _T>
& L/ k, t0 w5 I/ v6 m! einline _T GetExpValue(_T t[], char& csym){' o4 S$ g2 e1 |. Y# d' r
char c=csym; csym=0;
3 P4 c0 U' p: T7 e O, C switch(c){2 d6 D8 k% {2 r& _
case '+':return t[0] += t[1];5 S4 K) V, g: M; o( T% R5 N
case '-':return t[0] -= t[1];
6 U) R @, ] L% Z; h case '*':return t[0] *= t[1];& b2 T) P. t7 h
default: return t[0] /= t[1];//case '/':6 }1 u" C* q) _3 E8 }) z
}
$ e5 n1 Q' K5 W; e) S}}
% U) ^( a: o3 L3 I6 f7 p# n6 rtemplate <class _T, class _Tstream>: `# K/ w3 ^4 f' p
/* _Tstream: inputstream, _T: get return value
3 a$ T- C- y% i; t2 N1 l* Return nonzero if get value successfully */
* y+ Q7 U! E M7 E5 Yint GetExpValue(_Tstream& istrin, _T& nReturn){$ z- O. M0 P2 T* P; L6 |4 v% z, n
_T t[3] = {0}; //雨中飞燕之作3 `( H( D( ]# m! M+ J1 L
char csym[3] = "++";+ O! v7 O+ W+ _
int nLevel = 1, nERR = 0;7 \. o1 x9 {7 \
if(!(istrin>>t[1]))istrin.clear();' k7 Y7 b3 L2 l% @% R* r3 ^; J
for(;;){
! o1 F# V5 k$ S0 p" u if(istrin>>csym[2]){- a# R0 d9 M W B
switch(csym[2]){
8 V8 J9 J4 a9 p9 l: b case '(':
" z, }9 ~) C2 j" Y/ Q7 F* ]) k if(!csym[1]){nLevel=0x100; nERR=1;}else
+ q [. S" R& g5 K; {7 S9 P: q if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' M3 }# d# u" O9 O
else{nLevel=0x100; nERR=1;}
1 ]. v( \. X5 ]2 ~" }9 ] break;
8 r7 k- p1 e* Z p8 E7 h' ?# } case ')':) k) S8 f: Z5 U) s: F9 k& x' w+ G3 H
{nLevel = 0x100;}break;
, [) } W2 s$ y) T1 r case '+':case '-':case '*':case '/':
2 R' v9 ]7 g9 h8 z' Y8 ~ {csym[nLevel++] = csym[2];}break;" p/ T D% D r+ x& A
case ' ':case '\r':case '\n':case '\t':continue;
( u8 I2 q- f& d7 c default:1 s: A' z# B6 j# W% d! Y' V
{nLevel=0x100; nERR=1;}
+ e1 `: x# ?/ p }1 A3 g& ?+ v1 e: j' L0 f4 |
if(nLevel==0x100)break;& ?) e, _9 l: V i. Y( t) @8 ?0 _
if(nLevel&0x10 || istrin>>t[2]){
( l7 f& q2 E4 O nLevel &= 0xF;
* r4 L- x8 r. @* E- } if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
1 L5 J2 n! b( @" H* O L6 f if(csym[1]=='*'||csym[1]=='/'){
" C$ V! Z& y O! s3 o1 r/ ]! w GetExpValue(t+1, csym[1]);
" C5 y# t5 |0 \" ?- R& P5 w }
" H5 v1 U& x- k2 ^$ {9 F' Z else{9 Z3 ?- k0 A) |+ V1 R% h
GetExpValue(t, csym[0]);
; T9 g5 v0 b! i) E+ h9 _ t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 i1 u% @4 y$ }$ i; A6 w$ B
}
; e( H3 V% q: h1 M nLevel = 1;
# h4 w- H0 O, s& ~: M } e* s" ?- [7 k1 e& W8 R+ V" g
else istrin.clear();
' U: f. Y6 T5 V2 b }
4 e' D o! B8 x5 {3 t else{nERR = -1; break;}$ P4 U; O& n8 X+ ]9 O( v
}- @1 \# L" W1 X' X
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);- z x9 Z2 o3 _# X! I. c
else nReturn=GetExpValue(t, csym[0]);
~/ U: m" W! Y' ~3 N/ J+ \ return nERR==-1?1:0;- E! j5 l$ h" J8 L+ y2 m: j1 ?
}}
' }$ ~( s1 d6 |+ |7 }5 N) T1 {+ [# o5 g4 L" p) D
9 f1 i* Z l4 x3 x* _! X
2 r8 g0 v/ C7 a函数模板使用示例:% {+ R) E1 Q& w2 M y- `: D
在以上那段代码的后面加上以下代码:
7 b8 [* q0 y, S9 {! m) W3 B1 o; a6 {& m0 g" |# m
$ X# ~1 w& D; N; l" j9 ?
" i A: U) n/ |& \( S8 k/ A8 x6 o程序代码: ; U: Y( }8 V2 P4 n, I3 F( N" ]2 ]" F
+ h; Z. c' Q; S1 P" y#include<strstream>1 W% T% f6 `) b
#include<iostream>
, p; ^: L- x' n7 L& n#include<string>
' a1 q5 a$ z; D0 Gusing namespace std;4 S- Y, `" P% m' D' g
int main(void)1 y, R6 w) ~5 w/ S; x
{
- b6 r y) p2 h- V string s1;$ _5 _2 Z& @! v- Y
while(cin>>s1)/ _* o( w% ~, X( l. u/ s" F
{
* r o2 T4 f. H2 m8 @ istrstream isin(s1.data());
* N) R" R/ w; Q; j( e0 ~- g6 k: f double d;
* g' V/ z9 P, t0 J2 O, K- a/ G" r if(fy_Exp::GetExpValue(isin, d))
* W S$ ?; n( C+ u0 w7 _ {
/ a* e7 T" ^. ^# w% h9 r cout<<d<<endl;1 _2 i5 o& \" {$ E
}
9 d/ i& ^/ S- W) o& N else
) P& X4 c+ {: e# s, V. g( ~+ L/ m6 f {, V) \- N% ^0 n" C3 Z0 e& Z
cout<<"ERROR"<<endl;
/ R; i& |6 N1 o: w }
! L1 X: B1 I# q: d5 a, o0 H }7 d* s( l/ u7 C/ i- U' R9 r
return 0;% \2 T# w% D3 d( _' g$ n
}
, P0 h/ ^8 L2 g. p/ M- e |
6 P! V" Y( A) ]% B# @' Y
& c7 P. g/ Z) D! z! a( {然后编译执行就可以了(*^_^*)
3 Y9 K5 s; w7 C4 B7 w4 O" t8 v- [其它:TC++上一定编译错误,不保证在VC6上也能通过编译
. I; b: q: c8 Y- H; S 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|