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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
* r! |& o) T% u( `2 e+ W一个很方便的函数模板,可以并且只可以计算含括号的四则表达式5 L: ~! i) r& x: e" M+ B
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
2 d& S. k) D9 E( v+ Y4 L参数解释:8 r1 n& l" ]1 L0 T% q0 m `$ y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* S3 B3 |+ q0 t5 i' U& v j
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" F: o, N2 m" d/ P返回值:! U1 g, [3 t+ Q& j i5 a5 U$ M4 Z
返回非0表示计算成功,0表示计算失败有错误! x! L5 e$ y6 I. e& l9 E i1 Z
/ x# r" x! k9 v6 [+ G
0 b+ h( ]# o+ @
1 J! W5 x( k/ h4 X+ B
程序代码:
- E4 t% }' @+ X7 o! p( w
/ n* O! M5 w& C( E5 }namespace fy_Exp{4 f. I" C/ d! J; c1 K/ i5 p7 f7 c
namespace {template <class _T>4 X: X/ c6 i5 _& q' Q {8 W0 N% @
inline _T GetExpValue(_T t[], char& csym){/ c. Y' y ]& g
char c=csym; csym=0;
! O2 B% C# ]8 _5 S8 ~2 V switch(c){
- R& \7 _/ l5 p6 T case '+':return t[0] += t[1];" W& V* {3 P2 Z( M1 N5 d7 F" e
case '-':return t[0] -= t[1]; C H* _2 C3 o" k
case '*':return t[0] *= t[1];
0 I, ^% }( V0 ^( G4 f d7 g) \ default: return t[0] /= t[1];//case '/':8 b/ r$ x/ I# x( I4 J V
}
/ ^+ X) ?/ E4 I% B% k C}}
z* d" n! p1 N7 y! P: Otemplate <class _T, class _Tstream>
! Q# z1 R, W; t2 x2 c- G/* _Tstream: inputstream, _T: get return value
# A' ~, z2 t; V, }* Return nonzero if get value successfully */
: O% V4 G& Z2 @; Y5 |9 y- ~* |int GetExpValue(_Tstream& istrin, _T& nReturn){* j$ n% P4 q( i9 I, T) k: g! \
_T t[3] = {0}; //雨中飞燕之作* z% n7 A* q# p* z
char csym[3] = "++";4 l7 N; T0 R" e. e" j
int nLevel = 1, nERR = 0;+ u; v; G% |3 {( ^* s8 ^3 V: J
if(!(istrin>>t[1]))istrin.clear();
" f& w! J" j* }$ a( t. ~ for(;;){ h1 f; Y+ E$ Z& A$ s8 T+ b# e+ e# G
if(istrin>>csym[2]){
. Y$ u) j, Q. w3 |: x6 \/ s% q switch(csym[2]){
1 T$ r- Z" h4 {, U; b8 f% a case '(':. x8 i. q* U0 V) Q" ]
if(!csym[1]){nLevel=0x100; nERR=1;}else7 } \9 c% O6 O8 u! m
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 d( _4 C# v2 I) c
else{nLevel=0x100; nERR=1;}* T+ v8 [6 z% [4 X
break;
5 Q( c+ k, F9 Z1 a case ')':
! `' p) d1 N {$ p3 F {nLevel = 0x100;}break;7 W0 E% c# I2 A
case '+':case '-':case '*':case '/':
0 ~2 A" p: c: E. Z/ `: L( m {csym[nLevel++] = csym[2];}break;
Z: t }& C4 f case ' ':case '\r':case '\n':case '\t':continue;
, Z7 B! F1 v- o$ g3 f default:
4 C. o! y6 |1 W% r {nLevel=0x100; nERR=1;}
4 S4 U. }/ v6 u9 m( }; h }- s0 f7 r7 {' M% [8 a7 A
if(nLevel==0x100)break;5 u2 B4 z5 f3 U9 ?# N
if(nLevel&0x10 || istrin>>t[2]){
. L' E6 P% V. i nLevel &= 0xF;$ p$ a; a L. p3 S
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* z$ f6 s& c8 o- v' f, V
if(csym[1]=='*'||csym[1]=='/'){5 c3 [. W5 V0 ]
GetExpValue(t+1, csym[1]);$ J% {- w$ ]( a2 u2 }$ n
}
1 F7 @0 w# b* ]0 |; J7 W) E else{4 @4 z+ M9 ~* g6 g0 S, a# [. A
GetExpValue(t, csym[0]);
+ N7 a4 w1 W6 K$ i4 I: Q t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 z; ?& @* ?7 p. X: d
}2 N" _ C' t* v! Q, c7 m
nLevel = 1;2 Q& L4 p( n) w( f
}& A2 \( a1 S# x) s5 L
else istrin.clear();
; s A5 X8 o6 m: P }4 F" M5 N; X9 f9 O& w, A$ i i0 J: I
else{nERR = -1; break;}+ c* k* L5 g1 M) F! ?( H- ]
}
7 Q+ D' h \- u& P' ^& q5 b9 k2 D- r if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" _& O1 w: @# g! t( ^; K else nReturn=GetExpValue(t, csym[0]);
: V5 O( \. p, k3 n; f4 y return nERR==-1?1:0;0 I, K9 {1 N4 N6 X5 |7 K6 E
}}+ e$ }6 q' E9 u# i. m
# \& E! ~' _1 F2 W8 B2 ^& K3 B) E2 w3 a8 v# ^( l1 d+ D- G. m( o% t1 _
# J, H7 }( Q5 R5 _6 C8 u6 o
函数模板使用示例:9 a- W0 q c4 }. V: L- M. r( P
在以上那段代码的后面加上以下代码:
! q, H$ _8 t# u" _3 b3 O' X0 L( [( [, B7 i
% ^, A- Y! D! i6 r% G% z
3 S) ?- h% C% s+ B
程序代码: 3 [ {5 L' ?6 E5 E
% X* d' k/ T" M3 v/ @% s#include<strstream>; ?$ p. N0 T/ Z) K' k
#include<iostream>/ [+ ~2 x% Z8 X& L* z, S0 q6 Z2 `
#include<string>
9 c7 `% n5 f+ J A! |1 Wusing namespace std;9 K/ ?+ ]2 r9 x, a/ s1 J* \& N
int main(void)
# ~2 }, s7 G9 J{
J; t1 b( s, R2 q: ?- }5 ]- V string s1;
f8 o8 K6 M P& E: o while(cin>>s1)! W9 M. k6 j+ T9 S
{
+ M0 B) F5 G- t) T+ z& b istrstream isin(s1.data());3 r. Y$ B1 N: R8 o% r
double d;
9 q$ J) O, \+ F1 X if(fy_Exp::GetExpValue(isin, d))
" Y6 N/ Z B& P' [2 q {
& `% p( d2 l( L s- @2 `7 x' F# _4 H; ]# ? cout<<d<<endl;
: [2 j' A6 ^- Q% J/ s }
0 Z6 V8 }. S, \9 ~3 L2 i else
# a, B$ F/ Z2 {) o! U {
& }8 v" z2 n) G" W cout<<"ERROR"<<endl;3 j3 A v' \) Z* f3 P* ], K9 i# P
}
0 e% e$ M" e9 X" _3 U6 L- b! @ }
: \, K$ Q" `9 V1 c) ^ return 0;7 X9 f% p6 W; j! n0 `3 _! L
}4 Z, }0 G) P7 p# _+ `' ]; I& B
0 T4 [8 E* l, J; W# N7 U0 s) l1 V: l6 U5 y7 l: ]$ c
然后编译执行就可以了(*^_^*)# U; x1 _, F! e0 u$ n$ t
其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 U& ]/ G ~, M: H6 ~- u
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|