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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,+ A7 C3 R+ m3 b, W
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式 i- ~' Z! W( Z& c \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 \5 T2 @4 A/ I6 z) j# W参数解释:
, ]1 ]: u, X! D3 n W" l. wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 i6 B" M9 c, Z0 L+ F
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
& N) d3 w" h* i) G8 `返回值:. w8 k e; n/ L0 [- E4 L5 u
返回非0表示计算成功,0表示计算失败有错误
& o1 I6 Q# u5 a' P+ O+ c: e
6 L k7 R) M$ D/ ?7 f
* i- i7 L" ?) L/ u8 E4 Y. v" K. l
. h6 u3 M# x& ^- M% x, a程序代码:
; }$ |' l1 p% W% A, P6 T. W" V+ q2 ]
- {9 e* b' H( i0 p O( Q: @9 inamespace fy_Exp{
( w% ]/ P2 s- r6 Pnamespace {template <class _T>
u Q$ y: t. F( r; w: finline _T GetExpValue(_T t[], char& csym){. a- J$ v6 U5 D+ C
char c=csym; csym=0;1 i5 Z8 f# g3 ~$ x/ _& ?
switch(c){
4 O( D6 g0 b( }5 Z' e case '+':return t[0] += t[1];
' Y) `5 g) s1 E9 @: m/ d case '-':return t[0] -= t[1];) {1 m) ]* D w( M
case '*':return t[0] *= t[1];
?0 r' u& M! }( `( ^# U+ O default: return t[0] /= t[1];//case '/':6 D& i1 A- U) b/ G( @! s; G$ e# M
}
0 D% L9 M% y! I3 W( e6 b}}5 _: u9 V- k% k
template <class _T, class _Tstream>( ~- R" L4 ^0 S" R* a w( z7 F( {
/* _Tstream: inputstream, _T: get return value
6 Z- Y4 ~3 S9 l. y t* Return nonzero if get value successfully */
, N* E9 c! ? F/ G: }: `& sint GetExpValue(_Tstream& istrin, _T& nReturn){. @ T1 Z+ c' m% h
_T t[3] = {0}; //雨中飞燕之作6 }, p5 F1 N2 d1 \* w' z9 q' c0 f
char csym[3] = "++";6 Y8 s, m9 B1 g6 v. |* M, `% K
int nLevel = 1, nERR = 0;& e& _ I; Y& a W) e- u: n
if(!(istrin>>t[1]))istrin.clear();9 O7 ^! T1 g+ d
for(;;){
) s G) _8 K1 Q' r# ^; \ if(istrin>>csym[2]){0 B9 k3 t8 U8 a% d
switch(csym[2]){" B! V9 v5 D: `( z% ~" C
case '(':
M" P9 m, u8 U% b9 M2 S% _1 m) S/ O if(!csym[1]){nLevel=0x100; nERR=1;}else
c( G4 @, y r" x if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: z" ~' q" \& u, d n else{nLevel=0x100; nERR=1;}4 D) b: z" u w m t& h. B1 B- H8 t
break;, a) @7 ]# X9 F% @/ m
case ')':
+ V$ e5 X7 O" d% b/ h1 n$ C% | {nLevel = 0x100;}break;
- @* ^/ \/ n' _ case '+':case '-':case '*':case '/':: ]( }" m, A$ ~8 q
{csym[nLevel++] = csym[2];}break;% z) p5 j. G0 F7 y; r
case ' ':case '\r':case '\n':case '\t':continue;. |8 M3 e# z2 t0 L% ]- e+ M& \
default:4 P c: Z, k5 [' ]8 X5 X
{nLevel=0x100; nERR=1;}
1 v z. k1 A. O }
: W9 N* U9 M) s- O* V9 T' k if(nLevel==0x100)break;) Z d" a, @9 F- V- P
if(nLevel&0x10 || istrin>>t[2]){1 c1 f+ B3 U, z8 Y7 J* Z
nLevel &= 0xF;
: l @% _2 P4 V2 J if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 J4 Y0 R' T, R4 @* ^7 b3 B& \ if(csym[1]=='*'||csym[1]=='/'){
. ^3 d; r$ G8 a) Z GetExpValue(t+1, csym[1]);
! w0 J+ l( r0 h$ v! q5 z$ f }
- E! u! j) C( w' H0 s6 e. n9 m* Y else{$ I3 K; S# C, Z4 ~
GetExpValue(t, csym[0]);
, _' ~7 _& a; @ t[1]=t[2];csym[0]=csym[1];csym[1]=0;7 g& z; l0 V% ^5 G p- a+ Z$ z
}
- X. [1 D$ y a) G7 u" K nLevel = 1;
2 p# R5 E+ Z* r# i7 P8 \% p }
, A, t. g- _! Y! `. s6 U1 b2 e else istrin.clear();5 N% m' E# \: V2 t0 Z5 r
}
3 c) t1 z5 H: } else{nERR = -1; break;}- I8 [- }+ [1 a: T6 X
}
+ F$ g# j' D+ p4 Q4 n2 Q if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);0 V% G& E2 w9 D! y) v
else nReturn=GetExpValue(t, csym[0]);2 C+ n( d6 J0 O a* N; [
return nERR==-1?1:0;4 H0 O7 T/ _5 I& r2 R; Q; Z o
}}) w2 c9 _/ c0 f1 q
0 O8 W0 [* I6 A/ P+ G: C U3 i: i u7 N
p- R+ e( I5 a9 G
函数模板使用示例:) s' u/ j; ~6 F5 P% ?* q
在以上那段代码的后面加上以下代码:( a1 ]( Z3 a u5 A% e
7 X6 q; w1 S/ f3 k: j8 t3 y! r 6 v" r3 ?/ @. Y
1 C7 l9 S8 U! r; y& W" Z5 N* {
程序代码:
. u( l9 L5 u# i1 S
6 Y6 g O& O H; ^#include<strstream>
4 a5 F& P* Q0 j5 v7 B4 \#include<iostream>2 }9 Y* `- g# q/ P: v+ q5 E
#include<string>2 C' c. c3 c+ C2 c. n2 F2 a
using namespace std;
3 F0 x5 d& {1 O) ?) l: R# gint main(void)
6 M/ ~- ?- l, N$ |( u- p% q{
# g9 v# ]1 n0 `8 E$ P8 x, L string s1;2 C0 T; K1 s2 [; `2 N) E/ v
while(cin>>s1)
L& C ]% r# w+ _2 F! p% U {. r `' {! n# b6 C9 I
istrstream isin(s1.data());
* t5 m8 C% i! u' d5 b8 C5 E! W double d;2 _; E+ m q* U9 X6 M: N( h' R
if(fy_Exp::GetExpValue(isin, d))
7 B; N3 y) [# E! h9 } {+ M c4 Q3 @! F) Y! I
cout<<d<<endl;* _; l, I: Z; y n* l
}
- Z+ Y ]; L3 M0 x+ z% | else/ J9 D$ m1 n9 X$ @: ]$ ^1 A
{
I8 {* t7 K# @& E cout<<"ERROR"<<endl;
6 U7 I1 `* M; n4 g* N }
7 U; g8 r/ P7 h6 O7 Q& V+ u }
, g1 j, l" F) d3 A( z; `! n8 |, M return 0;
1 N/ ~) h* T9 B) j: C}$ y! l; D' Z7 P4 D1 h x" y; [ u$ T) J
+ [& g( v+ Z, A; ^& ]; B
: B1 R, H) r( b' [* s
然后编译执行就可以了(*^_^*)
6 k. S+ o4 q7 J. ~% L6 ]其它:TC++上一定编译错误,不保证在VC6上也能通过编译
- S2 e& @7 Y& H7 B 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|