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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,, t! z, v# p: ]9 W* h3 H9 Q
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ K0 F3 a2 Y' [! D6 W7 `只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), n; L) e7 {9 W4 y, h
参数解释:! P/ @$ d9 \1 L% q% G- g, u
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! \- a0 B4 M. q& ]! \& g
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
6 w- ~. _: B) p2 L: a1 E- U" w返回值:+ k8 ~# |. f; c2 O; l% E1 k- g
返回非0表示计算成功,0表示计算失败有错误+ V6 _0 S1 j6 B6 G4 z' @
( L% b1 p- a0 o" d1 }0 [
1 w* r. m8 |# c; H6 n4 U
5 k' q! x. c8 w6 R- l程序代码: - n& h5 U: q- h- }2 J6 J- l
3 |- h' C2 O3 j6 \namespace fy_Exp{
, o5 S/ o4 [. g3 |0 F" ?% E' K7 q1 ynamespace {template <class _T>5 k" Z% K' ~1 k1 H# j* D& F6 J/ M0 A2 X& s
inline _T GetExpValue(_T t[], char& csym){
! Q' f r! a% G4 N1 R9 z% V char c=csym; csym=0;+ J* g6 t. y1 \9 P, I" F7 e
switch(c){
1 G5 R7 A! L* i* a! s case '+':return t[0] += t[1];
d: y$ E% M4 f* V8 M& x case '-':return t[0] -= t[1];% E% G* \/ d5 O% R6 W, k
case '*':return t[0] *= t[1];( F0 {" \5 Z- L3 k @9 X8 s, t
default: return t[0] /= t[1];//case '/':8 U, T2 e+ U- ~5 m5 u5 g& A' ? x
}& v( I& t$ k5 O8 I3 }# J) L
}}
0 Y! }- c* ?6 ^( J, A8 v6 Dtemplate <class _T, class _Tstream>
; j, l L4 Z+ I/ Q0 Z4 }/* _Tstream: inputstream, _T: get return value. x; N8 I% N" X* q U
* Return nonzero if get value successfully */3 f/ \ Y4 G% P, S" c, e0 ~0 \; p
int GetExpValue(_Tstream& istrin, _T& nReturn){
6 L8 N' n' X$ f0 P6 U _T t[3] = {0}; //雨中飞燕之作
' r* D7 {$ Y4 V2 y1 d5 K' p, s char csym[3] = "++";- a: P6 r# @8 G& X0 T9 X- K( n
int nLevel = 1, nERR = 0; R: M' Z3 _: E% |+ ^) ^. c
if(!(istrin>>t[1]))istrin.clear();5 F6 |! x. _1 k @; R$ |% y
for(;;){
6 @6 C( v9 g; H3 I1 o if(istrin>>csym[2]){7 H9 C( z$ J* c: S$ Y8 r
switch(csym[2]){- k2 v# y0 D. n* E
case '(':
) U' F; H9 Q+ b4 d: @ e; V if(!csym[1]){nLevel=0x100; nERR=1;}else
! N, [4 g5 l2 }- ^: O* D if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 U' i3 m) P/ ~# h$ A
else{nLevel=0x100; nERR=1;}" s% _! ]! n2 N7 B$ n1 T1 w
break;
" _9 z9 L3 C$ b* x case ')':
+ B- X. _4 b$ a1 P {nLevel = 0x100;}break;
) r# m) a/ h+ |( ?( b0 X case '+':case '-':case '*':case '/':
5 A6 A6 H" Q c4 s {csym[nLevel++] = csym[2];}break;* g; B7 @/ N% {- l) B
case ' ':case '\r':case '\n':case '\t':continue;* x% c$ }! A4 ]" G" @& ^1 C
default:5 O- h1 Q; C( O+ i- c7 A+ f2 r
{nLevel=0x100; nERR=1;}
- q. n) {! ?2 a9 h }
! K" E" d* o' w if(nLevel==0x100)break;& M( ?& d3 Q1 i3 V) I
if(nLevel&0x10 || istrin>>t[2]){
( {/ `/ j1 m+ t, f W' b8 y9 I nLevel &= 0xF;# y0 i7 Z0 F! e {6 Y6 Z; C
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
% k% L: l0 K# ~6 V8 J" h if(csym[1]=='*'||csym[1]=='/'){
- f4 N( ~1 ^7 E6 e, p GetExpValue(t+1, csym[1]);
/ h2 f$ m$ p, a# ^% y }
# N! C6 q2 g" ?9 I! R6 w else{5 z8 U7 I6 V6 Y6 d8 ~
GetExpValue(t, csym[0]);$ d, T6 s; {1 Y2 Y. G1 q9 V" }
t[1]=t[2];csym[0]=csym[1];csym[1]=0;* F$ O! a" r. ^
}
, w9 y5 d/ m8 |* R) V+ G# v& } nLevel = 1;
: @( o2 W! d9 Z( Y& S1 T }
2 C: a2 d. ~, X' I# y else istrin.clear();8 a3 h3 y8 z: ^" z k% Y4 L# R# x
}' V8 N* {: \: c8 V5 S/ w
else{nERR = -1; break;}& F$ A7 Y. Y, C
}! h0 A3 m' x; l* ?, Q7 k0 M" I
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 \! a( F( G8 V; P5 y w* T
else nReturn=GetExpValue(t, csym[0]);
- K4 p2 s2 B! a( O return nERR==-1?1:0;& j2 k+ F6 I: P* {
}}/ i( ^. @2 C, n" K( P+ _6 l4 c! R
3 T& i4 B; E. Z! n' u. A2 C! K z. b' |3 Q: c) r! r* O+ L+ |- W
# Y+ a% ]( @6 O
函数模板使用示例:: L4 O( p" }: I, k d
在以上那段代码的后面加上以下代码:* }6 O/ ~5 T4 N( t
7 P$ a3 M# c7 |5 i) w
- O3 Z6 k8 o/ B. C
- I' F; h1 n: x' O程序代码: 0 ]& V8 F$ Q; [7 d* q( I
9 I2 \/ n" v1 @9 V( `
#include<strstream>
. F5 y( j3 b& ^9 E#include<iostream>( {: C! ^! a) t5 Z# c4 W
#include<string>
: M% @' |# P2 |$ P3 d Pusing namespace std;2 b4 B" r- l+ V' t H* v6 s7 P% @
int main(void)
+ }0 g/ ?1 n. }0 m/ \{
9 y8 y6 G6 Q" X$ D- z) z, X string s1;
+ R- r- }' o9 e; S while(cin>>s1)8 ]' ?2 ?& c0 g( _6 F8 l: @: E
{: j/ i+ N Z( @7 e8 e
istrstream isin(s1.data());3 I z) n1 v4 g0 ]7 p$ j' C
double d;
- c7 N+ e- Z# Q if(fy_Exp::GetExpValue(isin, d))
' e5 _* K% g/ t8 f {
& l l; V: z9 d" s cout<<d<<endl;
4 T, ?8 { s3 O, ~ }) s" G) f# n& \+ \6 `% w$ H
else
4 N1 r Y# `$ m! A; I7 I {6 M6 Y' {( R; h. O; F0 L7 A
cout<<"ERROR"<<endl;
% U% M. }- ]( w. v }
. k( T# M8 [/ R$ F" k8 _7 g }0 _3 H, a& U" {, h# a
return 0;: c" b1 N. o( t% S }. l8 I% G4 R
}
3 H( V3 _' y6 W5 b$ F C Y1 {, t" j% E" V# _, y
- |. [& k7 C3 ?然后编译执行就可以了(*^_^*); L6 `' ]5 n y ~* p7 p+ Y$ p
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" @1 |3 e# V- r' O 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|