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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,# v! m6 g( }$ g
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' s F- m6 b/ D9 a9 H4 ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. X: L, y$ C7 `& J! z, P+ w3 c2 ?参数解释:# C; \' b2 ?0 F6 N9 w
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
0 I4 N* S2 p& F; s$ u+ L& Z, W) lnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ l0 U5 y* m- \* t* k$ w1 f0 y返回值:2 ?6 H. p2 g6 y
返回非0表示计算成功,0表示计算失败有错误+ u6 b8 ^1 J' d( }* u, X' f% L. J; ^
3 D! N7 X- x9 g; h
5 o" U3 @$ D+ W" \( [6 M* Y
; m- f' O* y; d: ?程序代码: 1 G- r/ Y# F! z
& ^6 S Z+ I/ f+ T( m7 Bnamespace fy_Exp{
8 l( J, r1 f" S1 o* B' ~namespace {template <class _T>4 D0 `& X8 v6 n; x3 C7 |0 Y6 V
inline _T GetExpValue(_T t[], char& csym){0 q0 q$ H$ n4 y1 c) K1 R7 t4 y# O: h
char c=csym; csym=0;
* O& F/ V. t. s2 H0 n- C switch(c){) I) _4 S- j% j& I3 J
case '+':return t[0] += t[1];
$ ~3 P8 r7 L: U2 H1 z% s& L9 J case '-':return t[0] -= t[1];
- {7 L; W: p+ A# P( x0 Y' F, O7 x case '*':return t[0] *= t[1];
- b$ a0 ~2 Z0 T default: return t[0] /= t[1];//case '/':
& L Y- V3 R4 F6 T: d }
9 r* T. f2 X6 k4 X$ v}}* P8 ?: a7 s8 ^1 C% O+ i
template <class _T, class _Tstream>) s! q- f4 f1 D/ f5 |( D
/* _Tstream: inputstream, _T: get return value2 c2 d: X, @$ \4 u
* Return nonzero if get value successfully */! {+ I( E& I' c- D: _& E( Z( p5 A8 q
int GetExpValue(_Tstream& istrin, _T& nReturn){
# G! g9 f, c# B' H/ \ v _T t[3] = {0}; //雨中飞燕之作
3 c c7 \1 L' T: K char csym[3] = "++";
. ?& s+ B W- T0 i* |* l int nLevel = 1, nERR = 0;
+ o- K7 d' n* i* ~& Q" G0 @& F5 {& S if(!(istrin>>t[1]))istrin.clear();3 k% x7 W6 [) p% P/ f% C
for(;;){" `. B8 v% g' w- x+ j
if(istrin>>csym[2]){
5 Q) z5 z" r$ @5 A4 U- ~$ H( }3 g switch(csym[2]){
6 Z7 ^, H8 m/ B. S case '(':
, A' I l/ ^: w if(!csym[1]){nLevel=0x100; nERR=1;}else
+ e" w# m `; ~" ~ if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, K$ \4 G; b$ |) y* u7 Q: ~ else{nLevel=0x100; nERR=1;}8 j; |4 F& h% r( X. R
break;& M. ?6 b/ \* m; E
case ')':
! O2 z) k a1 k% b {nLevel = 0x100;}break;
; r" h, r C6 A2 A @ case '+':case '-':case '*':case '/':; m* V. M" ?% S- e# l. [" V
{csym[nLevel++] = csym[2];}break;/ @& O9 }# r9 ]* \8 J: F# n( M
case ' ':case '\r':case '\n':case '\t':continue;
$ f, X8 Q6 p: V. d5 @ default:0 h4 \/ ~$ ]# k, Y- Q0 w# @# P* E5 F
{nLevel=0x100; nERR=1;}
8 F' [* G) b; C }- G$ x$ Y# e3 D# t2 ~0 ^, ^9 z
if(nLevel==0x100)break;$ g' }% f4 j& i" o) Q1 g' ~
if(nLevel&0x10 || istrin>>t[2]){
! S) d, R/ s4 E K- D9 x nLevel &= 0xF;. z5 b# l s1 ]
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. K5 c, M' @5 | if(csym[1]=='*'||csym[1]=='/'){2 b1 g4 S$ R& ~7 j
GetExpValue(t+1, csym[1]);
4 e! E* W6 ~0 q }
9 Y7 ]3 @: a6 c/ R else{
( Z& T8 r$ m$ ` r* L GetExpValue(t, csym[0]);2 Z( Z5 _% q: H& P
t[1]=t[2];csym[0]=csym[1];csym[1]=0;: \3 ^3 j/ U; L
}4 A2 o% h! _- I! Y" u, U+ m1 e/ e
nLevel = 1;
) N, `& r( P# Y }+ y" P1 X% W7 ]6 p
else istrin.clear();2 l7 u$ S& H" E, D
}
, }1 ?1 E: ?5 E" l: a0 A else{nERR = -1; break;}
0 _6 v. x$ @2 s3 w1 j }
; m$ U1 G# l# v; ?/ T/ [$ S if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 R5 b/ }( n) q& o, r! E$ ^5 C
else nReturn=GetExpValue(t, csym[0]);
; ~$ A3 K7 H3 r' \* L: z& c) } return nERR==-1?1:0;
3 C% j8 F, C3 ^2 h( {}}$ t- x3 u6 H7 G! W
6 Y& C7 b/ X& W/ ]
, q" D' @/ N; ?" N2 f! G
7 s; d( z! t+ O6 \: E& A3 J函数模板使用示例:
* x% l8 Q/ x% l0 {3 g6 s( _在以上那段代码的后面加上以下代码:: ]& u9 @, V+ j
3 x9 j* @# ]( I! }+ x
: U5 T9 R0 A. u/ `$ l" c: U9 S# P3 `0 ?6 N. {
程序代码:
' [9 F% L# J; z% u/ N3 V; Y" M7 D6 x- i+ v
#include<strstream>
6 R9 }) G J# r0 R) r. }6 F/ z#include<iostream>& O6 `5 N( k- |7 {* A
#include<string>
9 M& L0 n/ ~& U/ ~/ i# Cusing namespace std;# ?- G2 _6 J2 b
int main(void)7 s* S5 f# L* o& ?. k) ~
{
) D- q1 p3 d- u" |2 X7 X string s1;
- s/ X" `( ], L& L! d; b# t1 U while(cin>>s1)
' J6 k2 {; r. \ _ {- J; v o) T2 ?4 ]
istrstream isin(s1.data());* _$ p* \( {+ a3 M1 o" M# j2 i# @
double d;' T6 @" q& y8 g7 F T$ N$ {3 s3 U4 s7 y
if(fy_Exp::GetExpValue(isin, d))
" R) s0 q4 Q1 H. m0 W6 f {8 B' g& Y5 F) d$ b4 `/ n
cout<<d<<endl;) T* P; X" y) z9 D
}* G* X6 p- @ L8 w* S
else
+ r7 l: R( p4 t7 T. A# a {
, o7 c* U5 r, j9 g" o& C/ X cout<<"ERROR"<<endl;
5 ^) a; S# ~3 A- A( [% A* D+ O }" n6 P* ]3 J0 F! l2 c$ g+ ~
}$ b ]5 W, l: B" p5 Y/ q
return 0;+ v- W1 o' B' \, r
}. h$ r3 ]9 f$ ?
8 I$ I( i* V/ T0 x5 K$ m
) o$ V9 n! d# r/ y& b: b然后编译执行就可以了(*^_^*)' U, L: S X! m% c |
其它:TC++上一定编译错误,不保证在VC6上也能通过编译3 C; I' I# l) r. f5 O
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|