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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
4 ~* H; n7 s0 B# O一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 F# T2 Z4 A1 t3 O( ~8 ^, N只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2 j5 p/ E' k' D) R2 B$ o
参数解释:0 c# A( b, b* H/ @3 H7 T/ z- v8 V/ G* \
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
) X" _, _1 }5 rnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 I9 U- `2 v: ?# o
返回值:
; A+ a/ S; w: \2 z4 y4 j3 e返回非0表示计算成功,0表示计算失败有错误
2 L) Q4 ^ g. q7 V% @. X2 B# ]% m" \& e
9 O ]! ?1 }" T0 Z
1 v/ h% i' \6 H9 {
程序代码:
) Y7 @* t' X4 m3 h
+ y! h" \1 E: Z {( P0 x* ]. J$ ?namespace fy_Exp{9 J& P* [2 ^5 }) ]2 J$ n {
namespace {template <class _T>9 |/ x% ~$ S0 f2 X/ o
inline _T GetExpValue(_T t[], char& csym){2 l7 J) Z9 }7 t" q3 _* T
char c=csym; csym=0;4 B- t2 F; m }/ f6 h" H
switch(c){
3 Z, l; t& |/ M case '+':return t[0] += t[1];+ n1 l- _; h4 k$ N0 q2 B5 J
case '-':return t[0] -= t[1];
' Z9 [& ?8 M# j case '*':return t[0] *= t[1];
/ [5 `% @5 F. j; K. o" q default: return t[0] /= t[1];//case '/':$ ~* w2 L& o* n2 b8 ~$ Y, v# s
}" y) _8 A! c1 v4 l
}}5 g& V/ m3 h9 _3 u
template <class _T, class _Tstream>
. a6 R0 H! W, f2 x6 |" O/* _Tstream: inputstream, _T: get return value4 H7 X* j0 e& I7 y9 g' \8 R0 u
* Return nonzero if get value successfully */) w# L% G# t* R% A& a: e
int GetExpValue(_Tstream& istrin, _T& nReturn){
* R: q7 k0 ^$ J2 J9 p7 G _T t[3] = {0}; //雨中飞燕之作
e5 u [, r% _ v9 p/ X char csym[3] = "++";
( [! [" t$ u* Z% M1 j* O7 E/ s int nLevel = 1, nERR = 0;4 B, g5 z5 @& ^9 [+ r
if(!(istrin>>t[1]))istrin.clear();
. Q$ ?/ P- b& x9 K. T. k. N: ?% ]5 H+ O for(;;){
$ z! G; S. C1 {5 V( {7 ^( i! x if(istrin>>csym[2]){
- H z. {& @4 D* V: ~ switch(csym[2]){
+ L8 Z9 Z# V G' [% C0 _ case '(':
+ e% N! ]6 U* D$ d0 D' Q: `9 ` if(!csym[1]){nLevel=0x100; nERR=1;}else
6 O! p$ B4 w7 t if(!GetExpValue(istrin, t[2]))nLevel|=0x10; c3 ^9 m1 g7 ^+ `
else{nLevel=0x100; nERR=1;}+ I, P. N# ^2 h0 V' C
break;
/ ~! Q, d6 Q- U9 P. c case ')':% e- m2 W6 U+ Y! n( u) \* ]
{nLevel = 0x100;}break;
. e# d3 w8 p3 c9 W! s9 P/ Q9 G0 `! j case '+':case '-':case '*':case '/':5 \$ {, M0 a9 h/ y) Z- K0 ]
{csym[nLevel++] = csym[2];}break;
* q+ Z5 d4 j. l/ ]& Y# u case ' ':case '\r':case '\n':case '\t':continue;
* F% H8 ~7 b: K( t/ O% g default:
. w5 Z2 g: B% M% @, j {nLevel=0x100; nERR=1;}* }) w4 ]; [9 W) E L9 d
}! J h! j6 L& [ O; L! F: E& U
if(nLevel==0x100)break;
6 P2 Q, Y4 ^: K if(nLevel&0x10 || istrin>>t[2]){9 e' t) n5 z4 y5 u- G$ X9 F4 o
nLevel &= 0xF;6 r& a5 d4 f! v1 U
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}" o* X5 ^. }+ f3 Z2 `$ u
if(csym[1]=='*'||csym[1]=='/'){
$ b* p% a, ]" t0 M d6 P; m GetExpValue(t+1, csym[1]);
+ _5 u$ I/ L6 I }& G* [! l- m6 q7 w4 K% R
else{6 g5 g4 Y; ?9 j
GetExpValue(t, csym[0]);' e2 [4 X6 O, E8 Q+ X# K7 B5 q
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* f- ?: y8 d+ Q/ I9 k4 { }
) V- d; k& C% @/ e nLevel = 1;
' b! w6 g, u* W. c' c7 F }9 |$ ]! m- V: @) Z _
else istrin.clear();8 ~% z- I( e. [" ~& \% z; F$ x
}
" \5 q7 N( s6 v6 Q- Q else{nERR = -1; break;}
2 s) _1 W, T' p# q' R0 y. K. L }. e# k; [0 ~4 i" Z) B
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 X5 f$ F5 ~& K1 w* Y4 @
else nReturn=GetExpValue(t, csym[0]);
% o+ Y7 O2 m4 v8 {7 a$ E! Q3 S) h return nERR==-1?1:0;
9 e) y0 U. z5 w+ l: J( W; e& m8 _}}
1 A3 X; N7 T0 I4 E1 `
* A$ Q* R6 _3 ^
0 j7 l3 T, {. B/ ]1 s! s$ U
/ B0 c: I2 e) k5 S8 m函数模板使用示例:
- S, z+ m0 M! i6 L$ ^8 \) w/ t在以上那段代码的后面加上以下代码:( Z' K7 ^# W( M7 Y& Q# h- H
4 ^$ A& e/ n/ E) O4 W
! B" H3 h7 y5 j% \9 f4 U( q% r& y4 p+ S
程序代码:
' `3 Q6 ^& m2 O# N v
$ k1 @$ L8 _4 k2 Q3 h/ Y#include<strstream>/ b7 y* F- G8 B4 p) v2 f/ Y
#include<iostream>$ `' e. K6 |. w+ N2 x
#include<string>
, L3 Q2 c" C' ?/ Z8 _- c6 h" Kusing namespace std;. E* a* E! O: c4 R. x
int main(void)" d/ I) a; _# y. k9 ~ {" D
{# m5 r) m0 ]9 Y# U+ u3 o) s: y
string s1;
6 K6 C, Z2 p* ?- u* g6 ` while(cin>>s1). K. o. K: [+ |* _4 Y
{! E/ x7 y* h3 r/ ~7 X3 J3 a" o2 F
istrstream isin(s1.data());
+ K2 q& R6 O4 Z/ I6 j& a double d;
. Z6 b; J0 e* y3 u4 R, c$ h if(fy_Exp::GetExpValue(isin, d))& Q) n2 Z2 ~6 M. f1 }6 `
{* n1 R, C$ h+ o$ [. ^) t T
cout<<d<<endl;
8 a: X; S: |7 q, D+ H+ o }
, M# j3 k2 \7 k- P( O4 ?! ` else
! N: @, }* A: S% m {
: |9 I+ b+ r! t1 q0 O1 k5 f3 \ cout<<"ERROR"<<endl;6 n6 y( L+ J; T# T+ P3 s
}& _ u* f! U8 u
}+ w! ]5 |: G& k; ~5 B1 |+ o& f
return 0;- G9 t6 i7 c5 k; n
}3 x5 w/ y: O8 G }" B) @
& k4 z& A* F5 n2 ~! c1 U+ ~; Q( k# O
然后编译执行就可以了(*^_^*)
. m6 H+ c6 K( K7 [其它:TC++上一定编译错误,不保证在VC6上也能通过编译
' O9 t$ D. A4 O7 i9 u3 l7 ^ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|