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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,7 K: M- o' v: o4 d1 b
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式8 \- `9 j; h- W/ K' g3 C, z
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)0 G7 y( h! n# b7 V. D
参数解释:3 z( E$ G, m& f, _; d, Q# W
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
) F/ v0 t: B# M3 y+ Q u' X( nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
- j4 ]% p( M5 o, w返回值:& }0 [$ ]! C; T* s+ K5 M# Q- H. H4 T
返回非0表示计算成功,0表示计算失败有错误 t) M7 G9 n( p4 E
9 {5 V! y. W+ U
% Q& ^) R5 ~5 p! C9 U! f
7 s2 v: h- v3 S3 e+ Q; k9 l" x
程序代码:
+ K0 u) e- |* ?9 b3 v
. @ c3 k+ z- e" A) Cnamespace fy_Exp{
. Q( n) Y6 ]% o6 D# lnamespace {template <class _T>
, \3 E L* c' s6 Dinline _T GetExpValue(_T t[], char& csym){/ Y3 D2 X0 u3 ^/ V
char c=csym; csym=0;: Z* ^/ |8 B2 c& z- V
switch(c){2 p3 S7 F o5 }/ M; W( v; `# F+ i d
case '+':return t[0] += t[1];
% ^/ n o6 C! N. A) m1 N, }( q case '-':return t[0] -= t[1];
3 W7 a8 Y, q7 D& N q0 _ case '*':return t[0] *= t[1];
- U/ J# H5 m, Q% K9 y" P default: return t[0] /= t[1];//case '/':7 Y/ x; x+ L7 T7 b: m, v* A8 v
}
9 _2 W7 K* ^1 W$ J3 q( K/ p}}, B- C$ _# m" O$ B
template <class _T, class _Tstream>9 P1 d1 {. K5 q
/* _Tstream: inputstream, _T: get return value1 U) B, d8 K. d2 |7 p3 w
* Return nonzero if get value successfully */
* L t+ x# k" g, o% C4 cint GetExpValue(_Tstream& istrin, _T& nReturn){
( M/ s, a( d5 I# L A, [ _T t[3] = {0}; //雨中飞燕之作1 r5 h) b8 C- s1 ~( z
char csym[3] = "++";
% P8 F9 U0 w, Y" T" o int nLevel = 1, nERR = 0;+ m+ D& l$ g9 b1 s, L- J2 L( m. k
if(!(istrin>>t[1]))istrin.clear();. N( q% o& X% Z( n0 M# s/ D
for(;;){7 }0 @: Y8 s E+ H$ }/ `+ q
if(istrin>>csym[2]){
) ]3 l9 v1 X8 G" j9 C8 ~ switch(csym[2]){6 L/ U/ [. u& v) }- B/ D- s* R- j
case '(':
0 N" C" \2 K7 @- |! T7 U6 E; p/ _8 e if(!csym[1]){nLevel=0x100; nERR=1;}else
- q8 k: h; `5 ^+ R& R$ F if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 P4 m0 y5 x: O9 F, H else{nLevel=0x100; nERR=1;}. t. z/ o e% H) _$ z, p
break;% Y+ G, P) q( }
case ')':
$ Q; P0 e3 x; J+ g {nLevel = 0x100;}break;# a5 S u) k% i4 {3 |( P
case '+':case '-':case '*':case '/':
) t1 v' S0 t. S) w {csym[nLevel++] = csym[2];}break;# t H. ]! O" m: b! ?1 v
case ' ':case '\r':case '\n':case '\t':continue;
6 L3 W) l5 @0 @$ G# O6 ] default:
+ a/ R( ]" R' \: A( Y& s5 _$ A {nLevel=0x100; nERR=1;}
' [! S2 z& `: [ @6 ^9 \( U } s7 j5 O6 \$ z; [ N
if(nLevel==0x100)break;7 Z1 C$ {0 C% V) [/ X! g6 O
if(nLevel&0x10 || istrin>>t[2]){* ?5 U. N* q' t/ H) J
nLevel &= 0xF;; a; U" g0 J) _6 c% C: p4 Z
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- A" K3 b! K ?% Q if(csym[1]=='*'||csym[1]=='/'){
7 p* V) @& C# G1 R7 b GetExpValue(t+1, csym[1]);
# z! n# F$ g Z, O1 k; n- x; h; z }1 J5 {( z8 ]( {; F: t6 i
else{$ H1 @9 j8 i( X
GetExpValue(t, csym[0]);
\: h8 Y P: D& P j- x. ^* M t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! k+ ? j7 i* @9 A# I& } }
; y. O- c' w0 P7 I nLevel = 1;: d3 X$ W0 N( }; x9 g
}1 x! q) D! v; y
else istrin.clear();- p5 q( A$ b6 Y8 A8 W6 a9 A
}/ ~% X& y" G% `3 _ v
else{nERR = -1; break;}
, q4 h+ E8 q" ^% @' @! \5 J( W }
/ ]# O# r- j( s7 K if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);# X5 x. R* b) D& N
else nReturn=GetExpValue(t, csym[0]);! ~" X0 Q) h* \1 f3 s7 Y+ f
return nERR==-1?1:0;. u9 u8 x( B4 o% q# X
}}
& I3 a" p7 H8 A4 N4 o1 n- D4 |5 W8 f2 W. Y" X: d
! ?9 m, z8 M) T& Q
# U; A6 {- M- W0 C/ g函数模板使用示例:+ g9 r" M& ^: X1 Z6 u# d# p: W
在以上那段代码的后面加上以下代码:5 g. t" e' r* V9 X& ?
. f! `1 J3 p: I; ~$ u3 B" s& ?+ b
- ^) C9 G7 W) [5 U8 Q7 ^' C& t
1 J/ K- l& s3 Y/ E) z; `/ E3 y. @程序代码:
) Y- X# |6 {9 L+ p6 g, K- p9 f+ D! E
#include<strstream>7 T4 L0 o; p9 j* l" X6 ~2 S" s
#include<iostream>
: Z3 r0 t& U, J: @7 Y9 ?! M) _2 H#include<string>8 \2 M' |5 c0 S: p9 U
using namespace std;1 u: J; @, a$ p6 |) y
int main(void)
) P* P4 d. N/ Q{* M/ M/ F+ J- h5 ]( Q4 S
string s1;, a; c3 v6 o) d) o$ d% ^+ |
while(cin>>s1)
2 F6 r& G+ ^% d& { {
6 j, }2 @& m! X7 }, Y! n' H istrstream isin(s1.data());
% _. A3 A* O2 A# m0 z2 U double d;& T" I% W7 X: A
if(fy_Exp::GetExpValue(isin, d))& z3 I% j# d3 Z/ x3 C- }
{9 ~8 S$ {" R' f" r9 b$ N
cout<<d<<endl;
0 Q5 C' K3 [0 ]* h. n2 z }
) ^2 H8 O$ T. t1 V! n else
! b/ J. c3 c b: O0 ? {: E4 q& L% i: k1 p; d
cout<<"ERROR"<<endl;) Y2 y, d1 x" I; d4 U
}) ]0 t' W* @6 k7 U* S8 F, O
}* f% m0 X7 \) e" C# d F
return 0;5 _6 ]& l- ]- E: d L/ e
}
% o, P3 P- W" F# {# c# j$ S' m, x- _6 U3 @; h0 ]. k
7 p! \* l, C: |( l' k2 g
然后编译执行就可以了(*^_^*)0 r9 k9 v. S4 J9 L [
其它:TC++上一定编译错误,不保证在VC6上也能通过编译3 S$ l6 N E, x5 }; ]: D$ d
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|