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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
; _1 V! T0 k1 z/ e6 h; w一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
?2 ~8 \' E% ?/ S$ E* i2 v只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)8 |7 W8 _( T" H5 y7 c2 j
参数解释:: |& z, Y L0 k& q) o! r; _: ^$ n
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流 w$ g6 U$ E; ^4 D- X0 E
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 V6 u& X' ]! D. N返回值:
* @1 p0 z# i& l0 m& B8 V返回非0表示计算成功,0表示计算失败有错误
2 |& [' k! A7 _$ z' _9 j
. i# Z; Z8 K2 o( b6 o5 E. E: K H1 d ?) z, B' w& H- r
/ ?3 L% x5 x* R程序代码: ! m! d7 J8 z( r# V. f/ Y
3 ?: d" s& a, `0 z5 e7 Q
namespace fy_Exp{
5 O3 y8 E B3 O9 B+ Enamespace {template <class _T>
: u: l4 v, W- A' X6 j7 \3 }inline _T GetExpValue(_T t[], char& csym){: t& x( K$ j8 a. A3 R" E" C
char c=csym; csym=0;
; v* ? V4 @6 \. D switch(c){+ y4 o" b8 c, R" n* B8 {' l0 d
case '+':return t[0] += t[1];$ h2 W. N1 k+ i* x2 _
case '-':return t[0] -= t[1];2 W i0 S- u( p) Y, Q6 V% h
case '*':return t[0] *= t[1];
' [- V8 d( L/ i: P F# T$ L default: return t[0] /= t[1];//case '/':' g+ E; M3 P) f7 S7 K
}9 v7 F! u3 `; U& r: g8 ~
}}# l# c, N t) C; f! L. q/ k
template <class _T, class _Tstream>7 h7 I8 b/ q4 u4 i6 ^5 j! T
/* _Tstream: inputstream, _T: get return value$ e8 L" N" R2 c" b& O4 z7 H* v' L
* Return nonzero if get value successfully */. N" I, L- K. ]( s5 P$ p
int GetExpValue(_Tstream& istrin, _T& nReturn){
) _; t# o+ l8 n9 Z3 L; p0 Q% L _T t[3] = {0}; //雨中飞燕之作1 b" K; \/ h6 Z
char csym[3] = "++";; F1 D* Q# S! y0 Q
int nLevel = 1, nERR = 0;
* |/ J' f* j+ ] if(!(istrin>>t[1]))istrin.clear();
) H4 K8 X. M- Y$ A' E for(;;){, M6 p/ e( v/ Y5 m
if(istrin>>csym[2]){% |9 ^9 z1 y) Z4 r
switch(csym[2]){) c2 e \" x: `1 w9 ?) `
case '(':& c3 C2 l. t4 ~' V$ t1 ]& j
if(!csym[1]){nLevel=0x100; nERR=1;}else
4 h: y' ^3 L8 o) p if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: {0 x3 r: x' M4 }/ b4 q else{nLevel=0x100; nERR=1;}# E# i$ ]" X' {; s \# y' S+ T( S
break;
; F7 [1 ^3 j# D5 @ case ')':
. H: l( x `: l+ \' ]; z {nLevel = 0x100;}break;
7 q* r; Y+ L8 R- R4 S2 X/ `0 k case '+':case '-':case '*':case '/':
* n1 b% d# O# H, @ {csym[nLevel++] = csym[2];}break;0 A% Y% ]8 X A: P2 \
case ' ':case '\r':case '\n':case '\t':continue;" m: v& d- v# d8 J: d$ E
default:" n( P; [6 t/ ~' u$ p; `2 w5 v5 d* e
{nLevel=0x100; nERR=1;}
$ N/ K# N. r& I4 x% u0 V }
* L5 e! t- b6 Z' j1 d' s6 k8 \ if(nLevel==0x100)break;& ]# d$ _6 g/ t' ?
if(nLevel&0x10 || istrin>>t[2]){
' k/ i* W6 v% }# V* z5 ]6 E+ ` nLevel &= 0xF;' B+ ]2 n( d0 P5 H1 z% F8 k
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
' H9 U3 B5 @3 H. R9 W- p if(csym[1]=='*'||csym[1]=='/'){
3 j/ ?* y Y) A1 ] GetExpValue(t+1, csym[1]);
2 Y) e- _; ^5 S5 H! K; ]! j1 q! c }
" D# v5 |- l) p else{
1 W1 B' \* s+ E GetExpValue(t, csym[0]);1 B0 z1 x3 G+ D, }+ U! V2 L. \
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! j3 J& R/ A% J( c- O3 w, z }
# Y& A/ g5 n0 |3 S* f nLevel = 1;
/ v# i- L- {# x( J9 B4 y }
4 s5 n+ V/ {8 w, e- r$ j$ S' h8 k else istrin.clear();) g/ L: z# }3 w
}
9 K& h: n l4 t" e5 A else{nERR = -1; break;}
4 q5 X/ }9 v* C$ C$ J }
) B; _" `6 z1 s$ |( P if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
$ f& z; o/ _/ Q) c% y+ W: `8 k else nReturn=GetExpValue(t, csym[0]);! O" n; ?) U) x Q- L4 p; X/ }
return nERR==-1?1:0;
T8 P8 l; ^% t8 }" g l0 T}}
( D) x5 r4 t# f! w, T
7 M5 \2 D" P- y7 ]! S+ c( V$ [2 s- ]% O* q$ l5 G: U/ h; ]0 d
7 M X# }; l# L- r1 [$ R: ~
函数模板使用示例:
/ C2 f' _( P* {* u. [在以上那段代码的后面加上以下代码:- w; N) @8 Z% b: \
0 l! w& ^+ x. B; d/ _
) M- r( O5 B1 L$ S' r
9 @" Y! Q$ m( s0 O: n' V' |* I程序代码:
7 V! J& T2 ^# u- b3 w/ C; T, d8 g+ O+ k$ e( B: K
#include<strstream>
0 @$ \, S. b: n# v! _: f5 ^#include<iostream>5 I% C' q" k; W) G
#include<string>" O. q3 m1 [1 |# j$ s! ^
using namespace std;
. ~! ?; s& G9 F; Pint main(void)0 W7 q4 L1 u' M* |6 _
{
4 g2 E- S% h6 H+ `/ U! O# Z9 ^ string s1;
6 Q. W" N r2 Y. \# j) ^" y while(cin>>s1); J& U( L( R3 E- n
{
( C. n; |4 q/ R7 l; O( p8 s istrstream isin(s1.data());! \$ S* _ G6 b# E8 h( D: o9 d
double d;
' v+ Z0 I. n: g9 }( L, B if(fy_Exp::GetExpValue(isin, d))1 @0 h; O. K1 `0 w
{4 y2 C4 N1 @! s9 w! M& l
cout<<d<<endl;* ?* l0 ~: E1 O* X7 N+ R6 P* R* ]4 P
}
, n# u4 c( l2 m& f+ A( A else3 G; X! e8 E6 T4 j$ p U
{8 q' h. m9 u' z
cout<<"ERROR"<<endl;
' W7 F6 }; `# t, u* Y% z& b }
5 j9 N1 K% K' G2 x }
- A* ], E5 B# S2 a return 0;( b5 x) C) i" k5 o2 U. t8 A' h
}3 P8 y4 J1 X2 b# Y8 ~$ j
M* {9 |/ S* O0 s! }
3 W& }$ L6 l! b3 j0 S6 Q然后编译执行就可以了(*^_^*)$ ~- f+ w" v+ d/ C* p; C+ R
其它:TC++上一定编译错误,不保证在VC6上也能通过编译0 U4 u2 R" r* l9 U- M# y
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|