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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
+ l2 _. J( `. \* T1 ?7 a+ z( V一个很方便的函数模板,可以并且只可以计算含括号的四则表达式0 m4 X, X, T3 h7 B
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
8 ^* F6 R! B f# ?* h1 i参数解释:
, D* H% n+ M' Q7 Q" mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流& t2 l, o5 @/ A u- Y- C; e
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 X( R, _; n" g: u0 j+ S返回值:
( q2 W5 w5 Q3 n返回非0表示计算成功,0表示计算失败有错误) t: v, V# ?4 E( [# T0 |
b6 b6 l; J5 g( X
% ^5 q& H) W# _7 j' M
# w1 |9 K! n5 l( }4 Q
程序代码: 9 s7 m( B5 u8 P$ H
+ b% |7 L. {0 V: J( C1 O. enamespace fy_Exp{* f. v! i R6 v3 z6 w0 a0 D f4 j
namespace {template <class _T>- m& Y# j/ v) ?# Z, k0 X6 @9 t# V
inline _T GetExpValue(_T t[], char& csym){2 l+ z( g7 h; b- k; S
char c=csym; csym=0;
' P5 ~! d) y/ T# \( v. C2 B switch(c){ M% r y" z/ e
case '+':return t[0] += t[1];: m" Z a; \9 f$ Q; S) Y) r
case '-':return t[0] -= t[1];
`; j0 t. M6 @0 n* Z- Z case '*':return t[0] *= t[1];. `% D$ O! j, o, s2 O
default: return t[0] /= t[1];//case '/':9 S; y; `; p b1 p0 o+ O; b
}, G3 Y3 l( ^, \. ^. [% O
}} _. m# G5 G9 X; f7 ?
template <class _T, class _Tstream>6 _3 Y9 Y! G) x* X/ k% ^
/* _Tstream: inputstream, _T: get return value
+ H0 F+ v' ?7 y" C+ x* Return nonzero if get value successfully */
) t6 Y& r: v9 K) h, p2 ?int GetExpValue(_Tstream& istrin, _T& nReturn){" K3 u, k- u; M( w/ r3 y4 @$ v7 o
_T t[3] = {0}; //雨中飞燕之作
1 K& y* W% x4 j! |" f" a/ c char csym[3] = "++";
& M8 o% n/ j6 n/ t int nLevel = 1, nERR = 0;! S/ {# d3 g7 @9 R
if(!(istrin>>t[1]))istrin.clear();3 [( i4 t% r/ p) T
for(;;){
8 a( ]2 r: Y f# f if(istrin>>csym[2]){
, x3 b, _4 {2 q# k+ C( I switch(csym[2]){6 q# ^% f# a% S' E# q
case '(':
! l7 {5 x% c& a* {$ Y# T! @8 J- Y if(!csym[1]){nLevel=0x100; nERR=1;}else
/ x# ^$ r7 T/ T2 k1 N0 n if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
& I- L$ U/ O) j7 |4 q else{nLevel=0x100; nERR=1;}6 S& w ]; y+ {* _# u
break; }; V2 p1 R" f4 B5 H, k1 A
case ')':: W8 g1 W3 o. D. ~
{nLevel = 0x100;}break;4 B9 A4 c2 [- N( k/ e# t; q- n
case '+':case '-':case '*':case '/':
; G; z! y8 J5 Z1 B7 M0 z+ Z) M {csym[nLevel++] = csym[2];}break;2 Z$ Z8 f: ?% D4 ^1 k& L' V
case ' ':case '\r':case '\n':case '\t':continue;+ J" V) D' ^0 `; x0 {% D
default:
) @5 I9 k* e1 `3 }/ ?- [0 C {nLevel=0x100; nERR=1;}
5 _# L1 I1 z! c- |, A* M0 s }
4 g8 Z9 y) h/ M/ T if(nLevel==0x100)break;/ j4 i+ }% v' r& N$ u, Y" I
if(nLevel&0x10 || istrin>>t[2]){
, g! r8 A3 I7 w9 V nLevel &= 0xF;
9 x& v, u) E6 _' x) `, j! j if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 q- q! k% g; F" l3 S if(csym[1]=='*'||csym[1]=='/'){, K& f( y9 X$ m( o
GetExpValue(t+1, csym[1]);% r7 j' H0 ?0 w: e
}
- n5 Y1 v1 l) b/ O# e else{/ s* b* T$ z7 i/ |( k8 P
GetExpValue(t, csym[0]);
9 ^. V X' m% h( m t[1]=t[2];csym[0]=csym[1];csym[1]=0;% r8 h! x& W5 V! _
}) c# G" H1 g3 Y$ `, K1 e
nLevel = 1;9 ^4 ^3 m) p3 ^9 O7 \
}
! S9 j. `5 m1 }: ] else istrin.clear();- X" `5 r/ i Q/ T/ D/ ^. ~. v4 L, |
}3 [- A/ a- i# z: c, \' t- l8 P' i
else{nERR = -1; break;}
9 u/ p. T% i7 d5 Z" G+ L% ` }: O# a6 I+ g1 z8 h. L
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; E" ~1 O! q P0 u( _) ~2 |
else nReturn=GetExpValue(t, csym[0]);3 M/ M Q0 K! t4 K
return nERR==-1?1:0;
1 l. Y, H: c# M" o$ T1 z! j" ^5 T}}6 l. R* j4 ?) b4 T5 Y; L' L+ p
0 D) A! A' @; _# W& |- o3 e
& h9 l6 ^+ h1 L# Q; o3 t0 G3 v6 K* u' `
函数模板使用示例:2 s4 m$ x% |) f- c
在以上那段代码的后面加上以下代码:
7 w9 v) V, _' D$ G4 x( N% T* f0 q: L5 h. A! X
- T. N$ B/ n/ a5 A& Q1 c- M' I( K& L( i* r1 n2 ]* T( J9 s9 l) t+ s
程序代码:
' O/ Y! G8 U' d0 W' P" J% J ?3 l
; p" h; t% g6 g* U" c7 u% x#include<strstream>- K' {- s$ w; L+ f
#include<iostream>4 b/ g* X% y" j; ~
#include<string>* C7 R2 O+ a) z! O5 M
using namespace std;9 o1 v1 n. {" r# s$ p* A4 @4 [
int main(void)
8 u. L9 n" e# Z1 T{
1 ^& e9 `1 D$ }3 M( e x string s1;! O: \8 @+ X- E/ H
while(cin>>s1)
% ?+ Q- n/ c& ? {0 s- l! n2 F+ b( e. |
istrstream isin(s1.data());4 I0 S1 @- a; j1 G' a2 b
double d;
4 H3 v; y# }/ X& Y if(fy_Exp::GetExpValue(isin, d))+ _8 U* K) @0 X" d
{
3 M; }+ z$ V p$ Y cout<<d<<endl;
. S8 j# e( F3 y* d7 l }; ^8 S3 T+ R0 a+ ]+ X
else
$ }+ U& x, ]# p9 o1 C {+ \8 T( ~/ I5 R
cout<<"ERROR"<<endl;
5 W7 m% n2 I0 ]6 T }
+ l6 M4 t& ], k9 J5 z. B }
1 T C7 N& H/ A* @, _0 |- e K return 0;' K$ R2 v/ g" V& `3 M
}
5 T8 `$ z8 e, W9 _' q! o2 D
$ h/ L6 D) }) ?8 B; @
2 R* D$ @) U: p0 I( Z, Z2 S然后编译执行就可以了(*^_^*) ^' L1 D. ~: ]7 ?* s
其它:TC++上一定编译错误,不保证在VC6上也能通过编译5 p% B/ ?% l4 U; k' v
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|