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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,' ?# Q- L0 a }
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! v! S* [; E( E" i- f0 z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
: E2 h# g& D0 D! s! ?. f参数解释:% m- V& t7 H4 o. V' J! Y1 W
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流. @+ c" m! T( ]/ o+ X3 n$ U
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
1 l, a2 Z. d) L返回值:
2 X7 i/ E0 w& E5 l返回非0表示计算成功,0表示计算失败有错误+ _4 e0 Y& m# o2 h r, @/ ]
' N4 E+ l+ h+ A6 p2 X- i
; d3 B1 I7 U! Q9 J0 @& f
0 B d2 a7 y( Q( C程序代码:
% U5 i% B+ b3 c3 E! U2 l# J8 F; z3 x6 V5 R
namespace fy_Exp{+ B8 D4 p& r" h3 x. }5 n
namespace {template <class _T>
/ N+ H4 C1 K1 b8 r( U. `. ~inline _T GetExpValue(_T t[], char& csym){
1 b5 r/ ~# V3 a. ?1 U. I7 u char c=csym; csym=0;- b1 S5 H$ O, ~
switch(c){. N/ y; Z; X5 n/ m% M& {" x( o
case '+':return t[0] += t[1];! \2 s c* r/ I. u# Y/ F
case '-':return t[0] -= t[1];2 T( J; L# `' z( W/ }( ^
case '*':return t[0] *= t[1];
4 ~; z0 G W5 A default: return t[0] /= t[1];//case '/':( H1 X3 ~8 ^: g6 P" J4 @
}( L: `) W: P) a6 G8 u# C* W. O
}}
' e$ Q" x+ V; Q" L, stemplate <class _T, class _Tstream>
# S/ b, @3 ^: ^9 D4 q; k/* _Tstream: inputstream, _T: get return value2 z9 _& H) _9 a: I; O* Z2 V
* Return nonzero if get value successfully *// Y7 |: x% K% V2 S
int GetExpValue(_Tstream& istrin, _T& nReturn){
; `7 t) D$ d8 h/ w) o$ n! w5 O _T t[3] = {0}; //雨中飞燕之作
5 }8 @' A# m6 P char csym[3] = "++";
: z4 T/ Q9 W6 h5 L int nLevel = 1, nERR = 0;9 S) ]3 i+ k; I, k3 J% u
if(!(istrin>>t[1]))istrin.clear();
0 }3 G# R& v0 }+ r for(;;){
6 L5 D6 l0 H( j$ ^; f2 b( I, h/ O; j if(istrin>>csym[2]){
' V. b2 Q$ W: H, g" H switch(csym[2]){
9 O1 e5 J \4 p0 l case '(':% c s$ b# J+ f: }$ W
if(!csym[1]){nLevel=0x100; nERR=1;}else' W+ X v* j5 Z/ k2 k
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
" D' X4 r M( i {7 c) @+ W! p else{nLevel=0x100; nERR=1;}
* q& L4 X k1 T+ Z/ ]' f1 G$ g2 ] break;
4 L. n% D; U1 u, U/ }6 |; l8 ~ case ')':
, ~5 y/ r+ |2 z: U {nLevel = 0x100;}break;6 r8 f% o2 @* u' g( D
case '+':case '-':case '*':case '/':% J- E# ~ q; ]' J) w) K2 P
{csym[nLevel++] = csym[2];}break;
5 P* N3 j0 v/ v$ a case ' ':case '\r':case '\n':case '\t':continue;
5 Q. u* U0 E. V+ t3 A7 n5 U default:
+ @% z' M0 `& j& a5 _9 u) t1 ? {nLevel=0x100; nERR=1;}
# V* b* F* x5 Y }
; [. Y3 ~6 I8 `) z! j if(nLevel==0x100)break;
: ~7 T: I: @8 B8 T- f if(nLevel&0x10 || istrin>>t[2]){" B+ b( k0 P6 ~% K! d
nLevel &= 0xF;+ `0 {0 h+ Z: k3 l/ `8 O, I8 I+ f
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, w$ D( A. t. d' } if(csym[1]=='*'||csym[1]=='/'){
- ?9 _$ |* @) a$ b# _0 k$ c; X GetExpValue(t+1, csym[1]);2 A: x p. m7 \9 V+ \
}
L; w% P1 U: ~4 x' Q$ X else{' e, |( a4 u$ T1 Y0 ~+ @
GetExpValue(t, csym[0]);1 V0 z' I/ B9 A; T: d& \
t[1]=t[2];csym[0]=csym[1];csym[1]=0;, p: _* f) N7 y# X/ I- _
}
) p& f4 Z. Q. b. r, I5 e nLevel = 1;# R; f, _: ]+ z& \+ s3 I
}
$ `( ^+ [ Y- x9 _ else istrin.clear();
- ]+ v+ r% N6 d$ Q }
6 A4 } Y" M, C else{nERR = -1; break;}
# P+ j+ j/ J" p- I8 C9 B; K } R B: Y! |* S! I5 H
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
- [! A1 Y% g- N; A else nReturn=GetExpValue(t, csym[0]);- p! s' B' j' G' p2 H0 ^7 {" z' I( C
return nERR==-1?1:0;1 C! D7 q* Z- Z: R# j6 n$ e
}}0 ~$ n- k2 N& C9 H- X8 _
0 e% L6 \* H, z+ m) e1 \4 }
# E2 q! s6 [$ `0 {1 i' z
" q1 y, E# L# L* J+ |" _" _4 h% ]函数模板使用示例:
' I: ?2 Q. R1 h6 h2 |2 a# w在以上那段代码的后面加上以下代码:$ h+ c4 {" V8 w8 ~$ e
" q! L6 e b2 ~& \& b2 \( W$ s
3 O# g( O4 J( t/ Q1 I* o8 Q
$ `/ c1 O D( F
程序代码:
/ r% B6 x, n0 |5 J7 A( K4 u* z8 \# C$ p# j& J
#include<strstream>. W, r1 Q7 L- i- D7 ^8 `- n
#include<iostream>
7 k- u& v# y" e6 x+ ]" K+ }2 ?#include<string>
# f _/ m4 k cusing namespace std;+ J* c- F1 U+ J) Z, v5 y* W
int main(void)4 v/ S6 v' ?% Y3 [% P9 R
{! `! ^9 a2 I5 Q! B% N; P$ K
string s1;8 y& L9 a$ A+ A
while(cin>>s1)& a) F# d2 U, |* K8 Y# @
{
j8 G& k9 y2 M, E istrstream isin(s1.data());' J5 U7 u, x$ ~: S4 {0 ^
double d;
+ f1 l. P- z% Q if(fy_Exp::GetExpValue(isin, d)). L: B& N. m G* R6 Q( O* f
{
& Z/ C+ Z8 z3 d. L( g- {/ Z cout<<d<<endl;
+ c# {- ^3 C3 H% M }
, s2 B/ p6 S. W, c7 s else1 b$ D$ |" \* k4 R* i; x
{9 s' D& u2 I9 Y" T o
cout<<"ERROR"<<endl;
4 I% F" D1 v' f! v# R' J" A& K }
' t; f9 D J! \" h' p }
* k# O" v2 @1 B! I0 A return 0;# M/ p/ C$ `' |" x0 b. O
}) a5 C& x% [& _8 q; x& e5 Y
8 y5 v, {& }7 j& R5 D
" H# ~" R7 a$ p' z; n/ _6 h然后编译执行就可以了(*^_^*)8 r) l0 X9 F3 V. T) ?, L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译# u* h: c% K2 d+ t0 j2 J
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|