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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的, D- ?6 z; l6 F. B$ G( B
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
* u6 F0 K; e/ M; F* h只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
+ `- o' \! E. m& M7 Y2 m1 `+ I. Q参数解释:+ t7 d! h* k* l1 r
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: @. S7 I, D+ s/ K5 QnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
' |( h/ z5 B! p! ]2 ~ X- Z+ h& C返回值:
. I& L# z5 D W- ~* {9 b4 @4 Y* q# T返回非0表示计算成功,0表示计算失败有错误% [/ Z. \4 @/ g9 o" I* u
3 L% i6 r( M. Y: E& P
2 U; x! B7 m# F2 N9 k+ n9 h1 Z
0 \8 O% @. A: Y, e- ^& }程序代码: 9 l# d# r' I% p; [' \6 |7 u5 j
! H4 D% [. h7 h5 l
namespace fy_Exp{
) w, {0 K" ]* W6 nnamespace {template <class _T>
: ` \5 k" `" C9 H; J/ L& m/ k8 u$ kinline _T GetExpValue(_T t[], char& csym){! A" V6 \( K& J7 }- w! F, H
char c=csym; csym=0;
; E2 A, T, l3 M7 @/ l switch(c){- Q( S! A. a; U0 ~
case '+':return t[0] += t[1];
# D6 J( o h. |' `' _' [ case '-':return t[0] -= t[1];
7 p# p6 ~; h6 D( J6 L case '*':return t[0] *= t[1];
G* j3 J! g3 a. f+ G: X0 K& [ default: return t[0] /= t[1];//case '/':" |, e' |8 K- @" e6 U. n$ m$ Z
}" n0 L3 `3 x2 B- @: }
}}: k; b+ k9 E- A U9 n; A! X1 L
template <class _T, class _Tstream>
) @4 |- R* l0 _& ~$ }/* _Tstream: inputstream, _T: get return value
1 G; N3 G& ^- Z1 p. y: D* Return nonzero if get value successfully */" {8 J, u/ D" E* Y: Y8 P4 d
int GetExpValue(_Tstream& istrin, _T& nReturn){+ s$ }2 w5 P( b1 z0 K' [+ k% a+ h
_T t[3] = {0}; //雨中飞燕之作
6 d3 T: n' N2 t# K1 O, N char csym[3] = "++";# J' p! g4 R, |% V* T0 D( ^1 ]
int nLevel = 1, nERR = 0;2 ]" D# [0 z6 k8 m
if(!(istrin>>t[1]))istrin.clear();" A+ s# ?) K2 n/ ^. P; ^
for(;;){4 S' P0 L- j2 v# d- }: W$ r
if(istrin>>csym[2]){8 E4 J: t% W+ B6 l' u) B/ _
switch(csym[2]){; j4 P+ ? ~7 H
case '(':
& h% z* o; ]8 F* w* f* `1 r+ g if(!csym[1]){nLevel=0x100; nERR=1;}else
/ _+ i* M ]5 ~# F$ A3 A! N if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
! e. l6 b6 \8 i- Q else{nLevel=0x100; nERR=1;}
! @4 h. [- X. d% m5 i/ S break; ]" \0 x- r6 S
case ')':
7 _3 s4 i, S5 N: }- M {nLevel = 0x100;}break;
& l8 K, T3 Y" i" Z! L case '+':case '-':case '*':case '/':
: W; v a" S8 M4 C {csym[nLevel++] = csym[2];}break;1 J1 R% Z) L* F% O' h |6 c" x4 ?
case ' ':case '\r':case '\n':case '\t':continue;; d- H) e6 g% O7 h' V
default:. z5 c0 C( W) B0 Q0 `5 M; {
{nLevel=0x100; nERR=1;}
) M& F* P2 B0 s3 ? }
9 C% W0 G x' b if(nLevel==0x100)break;
+ K6 X. t) ^$ x" A5 s if(nLevel&0x10 || istrin>>t[2]){
6 S) Y* @- e9 O. r* P% [% F* L6 E! z nLevel &= 0xF;$ x& g, T9 h* C f' Z& b
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}1 z k9 {; _7 R
if(csym[1]=='*'||csym[1]=='/'){
9 ~% p. e5 q# i: K( W+ u: ?- H GetExpValue(t+1, csym[1]);
5 H) ]1 a( R) z" j }
6 W7 X6 T3 m) S: G" H else{
& a. {2 k. K1 J1 ?+ V3 A' Z: I. `, e GetExpValue(t, csym[0]);1 ]3 e/ g1 k9 X) A
t[1]=t[2];csym[0]=csym[1];csym[1]=0;0 F5 ?" n" P# o) S; F
}$ \) e$ X/ T* e3 F K$ F
nLevel = 1;" C- h% E0 X; {1 Y4 H% ~( t
}9 Y& p0 |3 q! i2 b7 H9 h, s, q( x1 g. m
else istrin.clear();
3 t; g" x/ w2 j) b }
) s* c3 i' S& ], @ else{nERR = -1; break;}
# P4 z" L# x* k7 } }
; B3 U' Y y `# a. O; e* {8 V if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
$ y7 `4 i1 c' J4 {6 l/ g else nReturn=GetExpValue(t, csym[0]);
7 I, J) z7 I3 E3 `3 I* ~ return nERR==-1?1:0;5 W$ C! v& y0 o4 [7 i
}}
; M5 i+ q- F% f9 \4 W' d
3 o2 a& V; a3 _5 g% ~
1 ^: a: E6 c: r/ Q/ I' ^" `/ Z' F e8 V5 X- r4 \ q. I8 L
函数模板使用示例:( U4 ?8 Y: l# m" M5 h. r( E
在以上那段代码的后面加上以下代码:+ [$ Y, w* o! j0 v* Z
% Q8 r! U: k! r1 o% D$ ~8 U
( T+ p _& ~; f
1 L4 @0 ?& n7 S( s! ^$ Y程序代码: B: w* Z4 y( k, t8 c
1 M; t, ]/ p F# t. R% f$ l#include<strstream>- M; q. C5 ~1 b3 k9 S
#include<iostream>
6 _+ p) r C! M0 b/ V( v2 J: j9 c#include<string>5 x3 O7 z/ z1 k! P
using namespace std;
+ r$ n$ I1 B# v$ j' X1 @int main(void)
( a% A, c/ c7 Q' g9 O; T# }3 v7 `4 I3 ?2 M{
# w: f; q9 u" D( }! X# Q string s1; `& U. L) v8 g2 n
while(cin>>s1)
, r& x/ O+ @. I1 I$ s4 a {
9 F1 f; O/ }" r* f# R; ~ istrstream isin(s1.data());
& y& ]$ K& `* ? double d;/ U, [1 L5 C8 @* a" I2 X6 z
if(fy_Exp::GetExpValue(isin, d))
( u+ W9 H" L( A) m+ b {
5 ^/ N1 {7 `) }! E3 d( a% ~ cout<<d<<endl;, y$ l% Y; b, J) `+ E( G& ~* U
}2 ]7 O/ ~& v2 y3 k% a$ D1 l1 u
else
n5 S; u( E" d/ |- }2 F4 v/ t5 t {* k. F3 v! @( D7 @% r' I
cout<<"ERROR"<<endl;) z0 c& F/ }& z, L6 z
} h) _) ~! {) X3 ^1 g8 P
}, w% m$ ]4 x( q: d/ G- @: j
return 0;' y/ L. d+ ^/ y8 ?& C
}
. A$ p& \$ Y' l7 O, [. E0 P' t; N8 B: [0 S
& S! v% F6 @0 v$ S- U( x
然后编译执行就可以了(*^_^*)6 u5 M! @, _3 X# q/ M5 Z! g
其它:TC++上一定编译错误,不保证在VC6上也能通过编译' P- W% S, Y- \" w$ F5 g* ^
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|