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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,5 K( R8 S( E& E3 U7 p
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ D. s7 L1 N/ |6 ?5 a$ d只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& Y2 \: t( ]! w2 S* ]/ I参数解释:' g7 d! g4 b A. S1 D% f, z7 D
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 g; u! p/ L7 d! C$ I% e6 RnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# {8 ]0 E/ K" e3 G返回值:3 x! \; E) V6 ~+ j$ \8 {4 P; Y+ l+ ^
返回非0表示计算成功,0表示计算失败有错误
- b* {! V* |5 W8 Y# U) [
y, a! S/ x/ i% s# ?
6 u0 h6 ?4 a. t. z( i) i2 h, w. ~( Y4 x* V3 x& X
程序代码:
, k) I" o% O. I7 A$ O' n! D' S
/ j9 K* Y0 v8 \namespace fy_Exp{8 i& J) [' C. Q* b, D
namespace {template <class _T>
0 @9 S3 b5 I# H# n3 ainline _T GetExpValue(_T t[], char& csym){5 [8 S9 a: ]! L9 [, g
char c=csym; csym=0;
& m& T8 a& G' _$ n0 y3 N4 _4 v" T switch(c){
7 `% z( W$ b- H Z* _' _ case '+':return t[0] += t[1];7 C, \3 ^1 I9 U' _, P
case '-':return t[0] -= t[1];
% H, I2 U3 o; y1 V case '*':return t[0] *= t[1];, F' p/ K! }0 Q, W) y& z! I9 k0 p( ?
default: return t[0] /= t[1];//case '/':! I4 D5 ~5 Z' i$ Z
}7 u M! |) k/ Y) t
}}9 V8 d0 k8 p6 |# {* E' K
template <class _T, class _Tstream>9 J: y8 z0 g* z* h
/* _Tstream: inputstream, _T: get return value0 z) E- G& M6 Z
* Return nonzero if get value successfully */
0 @# \6 _* I3 `4 qint GetExpValue(_Tstream& istrin, _T& nReturn){" Y& M0 O: g' W0 F6 n7 _$ x9 f
_T t[3] = {0}; //雨中飞燕之作
! d% a, a( w3 l! Q char csym[3] = "++";( ? X* a: ~3 V7 E5 Y9 C% G
int nLevel = 1, nERR = 0;2 h% ~ I) j& v" F+ n
if(!(istrin>>t[1]))istrin.clear();
+ g4 g4 r( G0 h, |, o# U for(;;){' N2 D# ]4 U. F1 O
if(istrin>>csym[2]){+ i) m! i4 V# [1 n
switch(csym[2]){* k0 Q2 s+ `5 K5 K4 l/ R
case '(':
4 c. ~1 `3 i2 ~& i+ q, X if(!csym[1]){nLevel=0x100; nERR=1;}else! b, m5 x" Y" A5 {5 f% b, a* j
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, X0 o- F) L5 S t# n5 A) u
else{nLevel=0x100; nERR=1;}: H* z& c" Q# _4 f: k! n
break;/ @: U M& O' Q+ t" e
case ')':
) K" B9 b4 A2 _, N2 Z {nLevel = 0x100;}break;
2 W8 h( y2 y D* v9 U5 y case '+':case '-':case '*':case '/':2 f4 a- R7 t* {
{csym[nLevel++] = csym[2];}break;& J1 \" |3 x0 L' y' J6 T. }
case ' ':case '\r':case '\n':case '\t':continue;8 }1 H5 q; d0 J6 u3 \
default:3 h' X/ _' \( f: B( Z; }- c
{nLevel=0x100; nERR=1;}
- ~9 |# \6 Z! j }) p( c' f5 r4 D2 _
if(nLevel==0x100)break;) ~: x7 X$ B T) [
if(nLevel&0x10 || istrin>>t[2]){- b( C, H- M, X* z0 i/ ~6 F- C
nLevel &= 0xF;
0 i, O" x) ]. } if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 M7 L( c' O" @6 Y' p, G2 w- \
if(csym[1]=='*'||csym[1]=='/'){, V/ ^* A" `! g+ @6 I" M4 H6 o6 ]
GetExpValue(t+1, csym[1]);0 B; P" K: Z0 [! B( I8 q4 X
}
& x c- n8 l6 F4 b' a8 q6 |. P' q else{
( n) T4 e/ [& r. k/ m+ U; z$ U" s GetExpValue(t, csym[0]);% e& ^0 A9 [/ w" q, c* Q
t[1]=t[2];csym[0]=csym[1];csym[1]=0;0 {( x# M6 r1 H0 X: N" E" f$ p
}. O: r9 b9 w0 i0 I, u+ x
nLevel = 1;) g7 v2 d! N L! N& d
}
5 ^- j1 k" x$ ]" ~& q' k" O3 i else istrin.clear();' v9 q7 C9 Z' R$ A2 c$ l$ f
}6 m8 H( Q9 d4 a2 G/ ?- u
else{nERR = -1; break;}
" O9 p( F6 V' Y% J& ?: e5 Q }
( U; M* d- {) ]1 B h* Z" j if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
* G8 {) g) c: J0 ]- ?- M: K% G4 S else nReturn=GetExpValue(t, csym[0]);4 t: _1 Y0 T9 m/ @3 ?9 o x, |& p
return nERR==-1?1:0;# u( G0 ]" k# o. Q2 X
}}' d* l: G( ]) z8 E8 R. ~
3 N8 H* V7 F9 U) y
9 i& ~ {" w. [6 w
" E* ~. ]! O7 _: S函数模板使用示例:
1 J/ Z- P; |$ G* W9 m8 b: M( b6 s) O在以上那段代码的后面加上以下代码:2 z& E3 G( l# g; e/ I/ q& n
6 E5 j0 W/ |: M' x- `4 p , c4 H, ^) r: a' j) J& t. H) S) J
N' G5 Z3 L6 ~! S( T8 D. ]程序代码:
2 `- V* V ^4 h! h; B
% g0 D. a; p" ~( n3 d* p3 [$ b#include<strstream>$ S/ e( C" {. T; ?
#include<iostream>
: V8 D* Q: ^* E" I9 Y" A1 y#include<string>
* w: h# |( j0 R0 _ X$ @using namespace std;
. T, w/ r/ R/ i) C2 x. j. _int main(void)
1 K* l' y7 a+ H9 {$ z{; _% Q2 z6 V Z, N
string s1;
: Z7 ]; I2 V! k8 j: d while(cin>>s1)% h% b" A* O6 q
{
9 b8 X" T+ x) @; N6 j istrstream isin(s1.data());
; U$ q1 l2 s( [0 f double d;
/ M" Q# @7 P5 I8 N* k if(fy_Exp::GetExpValue(isin, d))
. ` x/ \( D5 |; @" P {. A! `+ p& J/ X$ @7 k1 V
cout<<d<<endl;0 r X0 {) v m5 a8 a; K
}) V+ w2 |) i6 I& X
else
3 H3 y, A7 _% L {, D: n& E5 f- Y" b) i, V9 Z
cout<<"ERROR"<<endl;/ A6 e0 w4 i/ B" Q9 q
}+ l" C5 {5 Z! V
}
) j- ?# _4 g6 k+ m return 0;3 ^. w: O' O) H, q- t
}
2 Q7 x# d( u* E7 s: m: v! }. o1 g5 A3 J9 G# V S. Q
- q7 S* A o; {( P3 Z
然后编译执行就可以了(*^_^*)
7 X5 s6 v0 S( O9 P7 X. c3 \其它:TC++上一定编译错误,不保证在VC6上也能通过编译0 ~# D% X' v# `& H
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|