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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
, s8 |8 Y0 a( _1 {' Q& Q, X4 P0 H一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
; V5 @4 H3 H* y+ s/ p只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 F1 k$ J/ T: L1 D! I4 O$ |0 [
参数解释:/ u( h# x% k! v
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
4 B5 \8 X8 p/ u; dnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
5 Q% o; `- h2 g `$ X& I返回值:
+ S @0 R Z, H) S返回非0表示计算成功,0表示计算失败有错误. t1 o4 q7 F, g, ]) ?" @
# ^8 [5 K s9 {' ~$ a. ~: g/ v
- [+ }( |/ N% B5 M; p7 N- j) c3 X
9 f) y7 v5 V1 m- C
程序代码: $ s! x7 X7 |3 I2 D. G
2 X1 B5 z5 C5 ~9 i5 g+ {
namespace fy_Exp{( X2 \/ _( r; j' K4 y
namespace {template <class _T>
/ k* d! N2 _, X# ~" v K" Qinline _T GetExpValue(_T t[], char& csym){: z; h o, j* b0 O4 n- A0 u% \
char c=csym; csym=0;# y. Z, X7 w8 ?* O# t5 b/ E( p
switch(c){( y( r3 Y. Y* o2 i& ]6 G- S( T2 `
case '+':return t[0] += t[1];
6 W; {5 c( n3 }1 s' A case '-':return t[0] -= t[1];
) c) `; a) Y& ^ case '*':return t[0] *= t[1];
, M% p) z' N( ?6 U( n% x4 W! ^" y default: return t[0] /= t[1];//case '/':1 @7 Q8 h+ ^1 x9 U+ x3 S
}
) F& E1 w- w: Y3 \- W}}( q7 ?6 o g" f4 Y! ?$ o
template <class _T, class _Tstream>; |. `+ c* j: O
/* _Tstream: inputstream, _T: get return value# V/ n6 _' o6 W+ c8 e$ n
* Return nonzero if get value successfully */2 G- [7 ]# o" w( E" }
int GetExpValue(_Tstream& istrin, _T& nReturn){
* n% w' L0 I, N! |9 ?: D# X _T t[3] = {0}; //雨中飞燕之作/ f4 H) c. d: c! A6 n: ?
char csym[3] = "++";0 g% w2 u D9 j3 ?
int nLevel = 1, nERR = 0;6 ?1 z( Q5 e W0 V
if(!(istrin>>t[1]))istrin.clear();& P/ o' T( |6 o3 j7 [) p0 ?
for(;;){$ L0 L0 w7 N) ]% |" o2 Y
if(istrin>>csym[2]){
, s" y: q! N1 R) E( r/ S" _7 w A switch(csym[2]){0 \, y; N2 F1 H4 t
case '(':
6 t$ w+ T6 B% D$ e, g" Y+ k if(!csym[1]){nLevel=0x100; nERR=1;}else
# j# l+ q5 i: q/ @ if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% r3 j8 H1 |4 [! w0 k x, S& c. i1 z
else{nLevel=0x100; nERR=1;}: y2 c5 h3 C" L5 _" ~$ K1 u
break;
4 Z) K( Q3 B- b5 u% p- N+ K a case ')':
+ W# a) f$ q+ M/ P8 c: F( h, g* S {nLevel = 0x100;}break;# _% k2 U) O$ C( J0 N8 u2 o
case '+':case '-':case '*':case '/':
! V5 {* q5 ?7 f8 y {csym[nLevel++] = csym[2];}break;
/ f& n" I$ ^) N& j1 V, w case ' ':case '\r':case '\n':case '\t':continue;+ }5 m) W" R* H8 u
default:: b, r6 \; _. T& T6 f" t9 u7 `! ]
{nLevel=0x100; nERR=1;}
& a( F% G5 p D6 x% k' v1 `: o' ] G }
: R' }( z/ t9 I7 F$ N/ X$ o if(nLevel==0x100)break;$ n1 l1 ]( x% U% L1 A8 k) x7 g
if(nLevel&0x10 || istrin>>t[2]){
: p; t+ f1 t- z8 l8 I nLevel &= 0xF;0 h+ o1 G. T/ g. h# g& E$ [
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
1 K7 ?% d9 b8 T: A if(csym[1]=='*'||csym[1]=='/'){1 V& h) a5 h2 t. b. [( S7 D" m
GetExpValue(t+1, csym[1]);
5 c$ X' S. J- E% m, t }; P* j+ W7 g( v% h7 {
else{4 D9 U: E) ?' S9 k9 |
GetExpValue(t, csym[0]);5 f+ h. Q# J/ A
t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 M) l8 M) F' O w
}) s4 E; a$ P! G. X+ W" _
nLevel = 1;9 L* N4 e- H! p+ H
}% p9 P* ]0 I; T8 Y6 q3 `8 k9 M
else istrin.clear();7 `( l, n3 |: G d3 q
}
6 V U* o K' Q: k6 H3 x1 U% o! I else{nERR = -1; break;}& Y' w4 i. @4 G/ P) t( H; \
}
9 b! n0 l" u% V+ C if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);: f1 J2 Q6 {' | d8 D$ R& @0 X0 `
else nReturn=GetExpValue(t, csym[0]);
9 N7 y- N1 {6 N9 ?- k" _( D return nERR==-1?1:0;
. f* N' v8 z" V}}
- {( |. O0 p. Y; R% t) K: I
& ^4 J: H% L& o2 p% w% r& B. m& ]! L. J
! S7 m( J( r, q2 {. [% E! R函数模板使用示例:
3 R0 H( f5 c8 I+ @在以上那段代码的后面加上以下代码:+ Z, n9 a: f( A- k0 F5 s
: N) Y4 c6 U5 B* Q+ n$ }, Q/ p
) Q# R8 U4 P, k2 C
: }1 Y( V" B @+ ^程序代码: * w' y5 Y$ |% x+ ~, o& h
7 [4 B5 g) j2 g% h1 A1 d#include<strstream># n) \, u3 ?) z( H0 P
#include<iostream>2 D9 W9 f) x. z) Q5 w; `( m4 |
#include<string>8 O' {' s5 Y! j8 G" B5 @' [
using namespace std;8 R$ h( f6 x. A: c6 v0 F
int main(void)8 ?" O3 j4 Y* l1 t& v2 I! ~
{' P) E& w& P3 T* J* G
string s1;
5 ]; U5 Z3 m: j8 i* L. d7 F while(cin>>s1)' {; {9 _, G5 y/ W# i8 z# X
{
/ e* k1 d* p9 C istrstream isin(s1.data());
' ~! N* z7 d# j! h' Q7 q double d;. V5 ^$ R) Y7 P( P- B
if(fy_Exp::GetExpValue(isin, d))
. V3 Z: k; T; K! Z# l {6 M2 E. g' j# X- _: a
cout<<d<<endl;
+ R4 G6 U. B: s' `0 C" I }8 B& n) u0 B0 q5 C
else
. M! \2 `3 r9 B7 V8 O) K {! ?4 [. ]4 }% g: J
cout<<"ERROR"<<endl;! l6 m) s$ ]' Q( T
}
: H. |( ~. c, ? }
( e" p x+ } L% v) W0 G) P return 0;: z# h0 h( J, h7 X& n$ ^
}
) u7 f" r" K+ \ P$ n" v$ D) K8 }& H" h: r* }9 Q3 N o' i4 N
6 r9 ~0 n: m7 N然后编译执行就可以了(*^_^*)
6 Y$ b' |, ]+ E- a1 z/ n其它:TC++上一定编译错误,不保证在VC6上也能通过编译
6 P) U5 j6 b8 s4 N( v8 K 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|