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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
. W. q( \6 \' ]6 G8 g+ }9 |一个很方便的函数模板,可以并且只可以计算含括号的四则表达式. w c! A: m) x5 D+ M
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( a4 X) R5 g& F; ] c p; ~参数解释:, p w8 X) U- f5 Z% \
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 z6 \. a, L. c( n2 P" mnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ x2 p& T5 o$ i3 V+ O
返回值:
' n$ B" t" [8 ]8 k7 ?7 p( Y! c返回非0表示计算成功,0表示计算失败有错误2 A+ p/ ?. @" T7 z
+ ~4 i c! m; x; w W( c7 m ; H1 a' t2 B; }2 v% B
) ]& }2 U8 |0 u2 `. c
程序代码:
1 d8 g# A/ @( Z) _: ]
1 d/ t" I, d* {; d! U0 Y- U7 Inamespace fy_Exp{
( V K8 P- a4 ?" o: Znamespace {template <class _T>( Z- ?; S1 t7 [1 A- _% _ m& L
inline _T GetExpValue(_T t[], char& csym){) o& a7 b/ v" O* q6 S* [, s! Z
char c=csym; csym=0;
: C6 n# ~% u: f- b switch(c){
/ a/ J: X7 y9 M0 c case '+':return t[0] += t[1];
6 E8 _+ t6 m# R4 F case '-':return t[0] -= t[1];) C; z$ Q4 a: @ o! S
case '*':return t[0] *= t[1];
2 u6 o6 J8 o2 q, G default: return t[0] /= t[1];//case '/':
+ O9 U& O2 n B8 k" D }
1 ]( ]& O- O3 {! m$ e N8 }}}
4 q& P( Z; f" [" C4 gtemplate <class _T, class _Tstream>( {. _7 H6 i: ^+ J
/* _Tstream: inputstream, _T: get return value
* R' n; _1 C8 M- R) o* Return nonzero if get value successfully */$ M& O) c) o$ K. k! R8 @
int GetExpValue(_Tstream& istrin, _T& nReturn){2 o1 K$ F& l# u1 M' A5 z3 F! O
_T t[3] = {0}; //雨中飞燕之作# C7 u* h; n/ U" I) G: W
char csym[3] = "++";% C5 h Z- s3 N7 W) S2 N( v
int nLevel = 1, nERR = 0; |3 V+ |9 O4 e2 c6 i7 }7 s: D
if(!(istrin>>t[1]))istrin.clear();
" J3 |: B- _3 e8 q( D1 I3 L$ ~. p for(;;){1 q& V: a: G8 k& O. g% O/ Y, K
if(istrin>>csym[2]){
% o b# B$ U9 A5 f1 Y8 n D switch(csym[2]){
, `7 W. s) Y3 a case '(':8 h. y! x% }- b9 p3 f
if(!csym[1]){nLevel=0x100; nERR=1;}else4 X8 W" F6 G8 F+ u3 _9 {- r
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- G) O5 [3 o9 i* s; t else{nLevel=0x100; nERR=1;}( p: z: g* q" m6 _% j3 i) O
break;6 k2 b( U' v9 Z' S9 D
case ')':' O, B" t( R: A$ A0 I
{nLevel = 0x100;}break;
! e2 H* x5 b: [1 l' _- h: r case '+':case '-':case '*':case '/':
" i6 L) k9 x" n! K5 w; U# q {csym[nLevel++] = csym[2];}break;- A- v$ E2 a1 c& _9 l
case ' ':case '\r':case '\n':case '\t':continue;8 P5 p" w3 d, B
default:
( L, P, z$ ]6 P8 {; | {nLevel=0x100; nERR=1;}( O6 v( U3 x8 L! O# q4 y
}" ~& q+ G& T7 U
if(nLevel==0x100)break;
! J0 T2 C8 d9 M7 F5 D0 K6 v if(nLevel&0x10 || istrin>>t[2]){1 K: O5 `5 s9 H8 C
nLevel &= 0xF;
0 L& K2 k* T; L4 L' n, Z3 I( | if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 I" S# Y1 b8 e
if(csym[1]=='*'||csym[1]=='/'){! _2 b& g7 n2 O' {8 z3 E E$ f+ z
GetExpValue(t+1, csym[1]);3 `+ t. V' y. E' k8 u
}
* _2 j$ _, z0 o+ r K4 B% V else{
" c9 z" {0 N1 o5 t' x GetExpValue(t, csym[0]);. R/ O, N& G( W/ u4 B6 H3 ^7 s
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' u, ^* ^, `$ b- O& _9 ]4 f, d }
6 M& X) s' u; O9 q+ O' R* o nLevel = 1;: V j+ z- ?" X8 \! D, F
}
! u& P# C2 f) G& L$ U, M: _ else istrin.clear();
; n1 ]! M& n( k* R8 N }
' y" Y+ r( r* F else{nERR = -1; break;}
2 x; q$ K$ ~, p" V$ G* \7 {0 |9 Q }
9 t8 g8 `2 O- H0 U6 Q" q4 U; P if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 e& v) k9 I' R: o! f
else nReturn=GetExpValue(t, csym[0]);8 o: G& ?& ?5 K- b
return nERR==-1?1:0;
& ]! \: ~( n& H1 H% U}}
# ~: w* y H* {4 {0 k5 j' l4 K. @! ^$ {, k, u5 v
! r: F9 e3 a7 F3 w3 r) A& F
" `' [4 X( P' Q. Q. z
函数模板使用示例:
8 A, N7 C4 v# @6 n, r n在以上那段代码的后面加上以下代码:
0 {9 u+ o7 T, ~/ `8 J3 |% e2 m) N5 i" b+ {1 p! M O
" Z' u! Q+ R$ m9 w$ I) n9 g
% c1 [4 ~, _: V
程序代码: 5 O2 q: l* o7 ]# }
9 d" O _2 L+ r& N#include<strstream>& K/ {- H+ J+ ]! _! y
#include<iostream>' W: M% Z/ Y8 g: D
#include<string>
( }7 P* Z8 i. n& K5 Vusing namespace std;
. C/ V; ^4 ^7 ]9 `int main(void): |6 h2 W4 `- C+ i W) U
{
]& ^& l. d- K" L4 t string s1; p* @ w" N* I a: m* s' w, Y
while(cin>>s1)
+ F' Q( S# I: y! ? Y1 p8 w% P {
0 d4 X* k' d) e4 Q istrstream isin(s1.data());! E0 O) r! Y$ s" v' E
double d;
: o7 _1 a9 x: W& D; t, H) V8 o if(fy_Exp::GetExpValue(isin, d))
( R, R2 C2 S& e, t {, X# t9 \2 l( U) P$ |9 j G& {& Q
cout<<d<<endl; m n$ p0 [ d
}
; ^/ Y0 |2 u2 }$ B+ e! |7 g8 W else3 ^$ c1 T6 P. R3 t* m# O: Q
{
5 c+ C7 O9 Q9 e2 G! a/ d! u( S6 n cout<<"ERROR"<<endl;( H; h. M/ H" s5 O
}
6 r& E4 s3 Q+ r* M }
0 f E3 A. l2 h# p/ ?+ n7 R2 s return 0;3 H& L5 f, S m
}
+ ^* h7 H7 i" k3 c$ j% F$ v |! G {( J" H: l: U
, ~: K. I% ^$ s0 o/ m
然后编译执行就可以了(*^_^*)% O, I. w- q7 T- d6 N4 g
其它:TC++上一定编译错误,不保证在VC6上也能通过编译2 O6 p' n& r9 f% h. e8 k
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|