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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
* b1 x- a/ p" t* y一个很方便的函数模板,可以并且只可以计算含括号的四则表达式/ @* W) s* E9 D$ Y& z- C" Q) Z
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ J2 [9 ]! t" e1 v7 U; p+ d# b
参数解释:6 \8 Y/ G- O& v: Q! H( b7 o
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流. A+ X) K! A7 T3 V
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
& M! Q# n: j$ j- W+ s6 u" p返回值:
9 c* c4 K( ^' O8 y4 F/ t返回非0表示计算成功,0表示计算失败有错误
( |1 p. M1 o6 o. p4 _" C6 i
6 T2 r/ m- q3 ` ^; n % T! `1 J- t0 c' j& M5 `2 X
/ m/ h& c3 y9 K( w$ [4 D2 X程序代码:
& y# E& g N2 D" \* D. i' n' E& A
- [; v# T$ d$ [, X+ anamespace fy_Exp{3 V0 B/ ~0 O1 k0 r z: n
namespace {template <class _T>
# o! X$ S! @. Q9 Z( Yinline _T GetExpValue(_T t[], char& csym){# F' E1 h- R. a0 h2 l
char c=csym; csym=0;
! S+ w2 ]6 z* d; a+ n switch(c){8 x! S) f% r' H& r0 e q% G
case '+':return t[0] += t[1];
- |9 d# u5 |$ x1 g case '-':return t[0] -= t[1];
3 W+ d8 X+ Z' D! `* o/ K% v2 g case '*':return t[0] *= t[1];' a2 S: ]( z7 D2 }4 a' G
default: return t[0] /= t[1];//case '/':
- G* b" I. B& C5 G6 U }
h0 H: R* O9 L# F! a}}
- H k* V- Y# ?0 x1 Utemplate <class _T, class _Tstream>* Y0 @4 m; ~6 h6 `# w6 m! z
/* _Tstream: inputstream, _T: get return value1 v3 i5 T6 [8 v7 ~
* Return nonzero if get value successfully */# i% F( s6 R/ @" L4 ]$ C+ j; W& R: g
int GetExpValue(_Tstream& istrin, _T& nReturn){
# J, u, B/ A2 H; W2 q _T t[3] = {0}; //雨中飞燕之作
Q) r, X& f$ r; H char csym[3] = "++";
3 Q7 ` `# U: e( A& D& s$ c9 _2 I int nLevel = 1, nERR = 0;
6 G3 W$ Y( E6 H3 X if(!(istrin>>t[1]))istrin.clear();5 C; @3 t1 c, b) o) ^9 E
for(;;){7 N9 U! Z. n" D5 U
if(istrin>>csym[2]){8 v/ f! L! x4 x# V: r- Z* m
switch(csym[2]){, y/ `" ]0 q3 @& b; E
case '(':4 W Q( W. x6 z; m, a$ I
if(!csym[1]){nLevel=0x100; nERR=1;}else& N7 w6 q9 r# ^8 y1 O0 J) F
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' P; a* q0 S* v! P else{nLevel=0x100; nERR=1;}
7 j# V4 j# m7 ~2 \, {8 E; L- U7 u break;% y) e% e. W& s2 ?( h0 z
case ')':
6 o/ b. ^# h9 X: B, N6 l6 \; t% o' ^ {nLevel = 0x100;}break;
3 W% |, a+ l8 |; I case '+':case '-':case '*':case '/':
" u$ P% ^5 Z0 ?+ t7 Q6 w3 T {csym[nLevel++] = csym[2];}break;
0 {8 N6 p+ ^! H* l8 H case ' ':case '\r':case '\n':case '\t':continue;
1 j8 P1 C. p; e( s" H5 V% f% o# z default:1 O- b8 q$ Q* x
{nLevel=0x100; nERR=1;}
: e1 \1 g' \( T# _ }
( ^$ U6 W/ L( p- T5 h/ T, w if(nLevel==0x100)break;
3 X5 z, i3 ? a! |: E& X& d9 z2 }0 W if(nLevel&0x10 || istrin>>t[2]){
+ b, e6 M/ f+ p7 u k1 F1 d nLevel &= 0xF;
3 b6 }7 w$ z( z if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
7 C1 ~7 X% }% [4 s/ y+ Q1 e( W9 Z if(csym[1]=='*'||csym[1]=='/'){" V& L7 r5 X& E; h0 }" h
GetExpValue(t+1, csym[1]);2 a0 B- m. V% R
}( S% C/ q1 S) J
else{
" H: |1 V% e" E5 y6 W) i9 w+ O GetExpValue(t, csym[0]);! Q! e% W3 f" P6 d9 A
t[1]=t[2];csym[0]=csym[1];csym[1]=0;( p8 S, G; K# P* C' t% D7 V% `
}& M& x$ ]! f- L2 d/ o- ]6 |& y! l
nLevel = 1;+ o! ~ x2 K( h" [" h
}8 |; L2 p6 P# @+ t$ ?- @
else istrin.clear();
1 \ S; w$ u. B } W8 I0 ]7 {3 a: M. n
else{nERR = -1; break;}. \! {- {7 f8 y" g3 Z* k
}
8 b, V2 }" }, M, U- { if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" c4 i$ ?! t/ T; Y, d else nReturn=GetExpValue(t, csym[0]);
+ \1 t! G7 R3 m6 ?" E return nERR==-1?1:0;$ b# `' p- K( i/ Q* c
}}
3 J3 p' |7 V* @6 f
8 U6 {9 [ F" d4 j( I) q3 ]/ \2 a! _/ x( ~, B+ h
: ]6 d9 s6 K; S
函数模板使用示例:
' u7 S* l" c! C, ]$ L* P5 N6 H! F在以上那段代码的后面加上以下代码:( Z' D, J: T, M( A3 X* E
$ R) y% [6 X: D! S' G8 y
' m# j6 A! w- ?- `
6 ?) T) c, N; }3 \! G5 E) j程序代码:
+ B9 ?6 S& ?6 C i- c. R, ^( d, ?) x6 y; T, t
#include<strstream> o5 r4 h2 b8 A3 ]! N
#include<iostream>
+ }$ ?4 M& f1 }$ n/ q1 R. O#include<string>
8 Z. r) t& I9 o7 U& \6 _3 |using namespace std;. r0 Q1 T, ~ Z0 O; ~0 B2 A
int main(void)' R8 M0 w9 m$ _4 v# X$ h2 ]; _
{/ a$ ?/ R, E# o( x- e
string s1;) U7 N6 s( x) y. |
while(cin>>s1)
9 Y! q9 F7 p# H7 ^4 m {
$ k6 }" O5 C. J, i" r$ ^ istrstream isin(s1.data());
* v6 M" P9 F# U D- E4 e1 m double d;
" ]- g" K9 h. m1 E if(fy_Exp::GetExpValue(isin, d))2 d+ t, d2 _( [" T! f! O/ T9 y
{3 I7 h9 v+ T& M
cout<<d<<endl;: W* W& @: D( f& v! T
}- z* S, T* H" A+ V# d$ P: w3 C: D% y
else7 h- ~' M* [" _' j8 `
{
P: T4 K* R' @" K6 H1 E @3 B' {& K cout<<"ERROR"<<endl;! Z9 ?. {. E z& ~; n$ {6 h
}
* g. z) X* j: U+ E6 t4 Z' K }9 y( x7 W4 R2 {. H5 M3 C' P1 @; m3 y
return 0;
6 ], @4 G! h, A+ L* z3 ^$ ] M4 Q}
- N: H6 h& ]" W0 h9 y2 t5 {+ o9 L1 ]) I" S7 g+ \( u
: a+ v9 f& h2 u' x) s! j$ G+ s
然后编译执行就可以了(*^_^*)
8 K( x* a( f( ~1 e1 T% q其它:TC++上一定编译错误,不保证在VC6上也能通过编译
6 m, Z5 g1 n5 Y1 ` 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|