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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
0 N: [. V6 e. K$ B" E' N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- G0 R4 v4 @) }: ?2 t# p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& F/ d6 w$ l: V5 Y0 [! Z参数解释:% X$ J4 X' a9 g' u4 n
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& w [. ^1 {8 y& E+ h/ {- bnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ A# l) Q: _( W! c- a0 O& o返回值:
# F& C) w) ]* t返回非0表示计算成功,0表示计算失败有错误
4 b' J4 J6 H5 g, s7 P1 n* b5 H8 U( d) Q3 V) ^( q% K
% f. u2 H) N1 q9 }2 q8 j) p$ @
" D: F( _4 Z2 M2 q程序代码:
/ p, O8 v0 N- b z
& V, x6 z8 q9 S& T5 Wnamespace fy_Exp{: k: b7 d9 w) a. K8 T3 o
namespace {template <class _T>
, \/ c- m4 P: Q qinline _T GetExpValue(_T t[], char& csym){* S! ~: _* N1 k6 [' L* o
char c=csym; csym=0;) Q% ~* N+ _; } \ p3 {
switch(c){
. r: N! ^, S0 S) w M: l case '+':return t[0] += t[1];- @5 E0 y) L- _! w
case '-':return t[0] -= t[1];
9 R% u ]9 Y B9 H& r4 h case '*':return t[0] *= t[1];
6 b2 O% G I; C* b default: return t[0] /= t[1];//case '/':
1 G& h3 ~5 Y. F }
% x7 n; o a! x( b! ?}}
) z2 _( }9 }( R& Itemplate <class _T, class _Tstream>
- d$ q; M* z _9 M/* _Tstream: inputstream, _T: get return value
! x1 L7 |. n- v$ ]/ N: s2 Y( Q# Z; n* Return nonzero if get value successfully */
% R7 p. ~% e7 K$ Z% Qint GetExpValue(_Tstream& istrin, _T& nReturn){& z; ]! X2 S$ T* Y
_T t[3] = {0}; //雨中飞燕之作
7 w* t! B# J8 D/ A4 L char csym[3] = "++";1 @9 c* Z! V: u2 H2 w4 B
int nLevel = 1, nERR = 0;
$ L; @6 \( b ?6 V if(!(istrin>>t[1]))istrin.clear(); a5 g/ F) C4 [) z
for(;;){ x z. @3 z1 e$ {+ R2 Q* D4 Y# U
if(istrin>>csym[2]){$ k9 o0 H3 ~6 H: G( n1 t' y
switch(csym[2]){
- v) z# I1 J0 c+ l/ H" ^$ t case '(':: k @4 Q/ \# E, v+ I4 m9 a5 R+ r
if(!csym[1]){nLevel=0x100; nERR=1;}else
# }3 B' o p( O) {- |& a! ? if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 M; B4 Y/ t6 f L d else{nLevel=0x100; nERR=1;}& k8 Q; Y! B" z. p
break;9 P# y/ B% Y* P7 w; G: q* ~5 ~
case ')':; Y) Z0 [9 n- C7 v) S: E
{nLevel = 0x100;}break;8 i! T }. C; Y9 w2 P
case '+':case '-':case '*':case '/':8 V, i x& h0 j2 |' I3 i7 h
{csym[nLevel++] = csym[2];}break;& `+ H& b- u" b1 P
case ' ':case '\r':case '\n':case '\t':continue;
6 l: n& \9 `6 _4 ?( u( q default:
! p) y3 r0 S( L1 K. { {nLevel=0x100; nERR=1;}' p% @0 e( m0 G7 T$ l* u9 \% C8 e
}' w% r$ p+ @* p9 ]
if(nLevel==0x100)break;
' g! b5 D. R: g# H/ K' r if(nLevel&0x10 || istrin>>t[2]){5 s, k* C+ F k6 T# ~% }" R! G
nLevel &= 0xF;9 R7 [) q- s) h$ A
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 b. \" b8 S5 P, _ if(csym[1]=='*'||csym[1]=='/'){
# W" q9 m) f0 e& a [ GetExpValue(t+1, csym[1]);, D% X+ } A1 D% `4 ]9 |6 p
}
$ n) d! b# b A. c else{
# o6 g8 L# B+ ~+ I9 L GetExpValue(t, csym[0]);
* n7 A3 U4 V& B7 R0 p t[1]=t[2];csym[0]=csym[1];csym[1]=0;; {; @. m; K9 y& \& L0 |( \/ w I' s" `
}# s5 i- x" q* B
nLevel = 1;
' X5 i% ~0 v$ S" X: y; i }4 H$ Q* t+ A( F& e2 j1 b
else istrin.clear();% J+ Y. x" j N/ E
}
! w/ X: z4 ^$ R+ B0 } else{nERR = -1; break;}
r1 u$ I# g! t( H# ?; Q! x; L }! y6 m7 X- n; q* M' j. ` T/ T
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);0 i$ B8 ], z- p0 s# ?$ f2 w
else nReturn=GetExpValue(t, csym[0]);# C) f1 j& T5 X+ d8 J
return nERR==-1?1:0;1 n$ i( C+ \$ K: y8 R! s
}}
; _& U* R& a9 M: x
4 l- e5 r. L0 {9 ~! a& L1 p b1 O8 b. Z, [1 A1 f
1 T$ z, s& G- @
函数模板使用示例:9 b; m( ?3 H2 Q W
在以上那段代码的后面加上以下代码:
" L& x* B5 `: U! X
$ y6 t" F( j6 G/ D8 q 6 ^+ h9 h. ?2 x
) A& B5 C( U& s: e8 |9 a( D程序代码:
8 v4 C: `( E/ b) y! r
! Y4 d0 @/ _; h" Q, c1 h#include<strstream>
; U4 \3 i; W0 r6 {#include<iostream>
* g% x- Z' ?# m* k p0 t#include<string>
% d& c8 Y7 W. b! a# D5 kusing namespace std;3 j- E! Q$ V9 t* B4 V! H0 b8 H- g
int main(void)
' j: z) E: I/ I" h' l! [5 T{; p1 f: e' |5 H4 a
string s1;
7 l% S& E- a) J0 D while(cin>>s1)
4 @2 a# d, B m {
6 y2 w/ f( b3 w0 f( w7 ^( g/ V istrstream isin(s1.data());
: o$ n8 G/ O: K" I4 k double d;
( E9 D5 ]. T2 P if(fy_Exp::GetExpValue(isin, d))5 N" H: K; j; `6 f4 c
{$ W* L, g E4 d2 z2 ]
cout<<d<<endl;
2 [ z8 Y: I8 B A }
, c& \1 `. n6 q: u' V else' n% \7 ?2 D% {; c
{% W+ _7 `, q9 I5 @3 e
cout<<"ERROR"<<endl;* g/ ~6 i: }8 |, `4 C1 T5 b' E
}$ P6 A: {' Q2 Y( _. n
}
9 [( ^" c1 X. u3 J9 l. ?8 z n return 0;/ i- n4 z. C ?
}% i5 }! P) h" R7 M B+ J
: u, G1 Z$ t4 T/ M# H {$ L% K/ Y2 [
5 l; N- | z! e# w9 y2 j- o5 d
然后编译执行就可以了(*^_^*), V, Y( I q! h4 S* r
其它:TC++上一定编译错误,不保证在VC6上也能通过编译/ p" h6 \- |; t
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|