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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,, ~' v$ L3 I6 K/ T" |. X4 t% G) N
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式( _" ~0 j4 X! j' s" ~0 U; {
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 G |7 e {$ S- J9 Y5 S: S; ~参数解释: \) e( s% t o
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 h! R8 }/ D8 W& W: N* p# z% P0 s
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
1 Q( ]. f% m0 x B) a2 \, t* B/ e返回值:
9 i; v# B* c7 \2 t, A. u: h0 V4 K返回非0表示计算成功,0表示计算失败有错误0 d8 C* M2 }0 d; F6 W
6 C: }# F, ?2 ?- t. l
. Y1 r4 ^. D8 r
$ l( @0 [: K4 P# m2 F
程序代码: 8 F" r* m- q1 B+ z4 C9 V* }' ?
( X7 b- u+ b$ Z& h0 pnamespace fy_Exp{
7 b, a3 k# p9 A5 P7 y$ jnamespace {template <class _T>
) y2 o$ h2 c6 C5 T0 @, Iinline _T GetExpValue(_T t[], char& csym){
5 @3 a) l5 R4 E$ H char c=csym; csym=0;2 z. `! i* i W: {6 s5 T. l
switch(c){
6 E. m5 c& W3 i0 i6 }$ d9 e8 O case '+':return t[0] += t[1];
) K% g5 W+ N7 d case '-':return t[0] -= t[1];3 X' R, k/ I# o" e8 A
case '*':return t[0] *= t[1];
2 I8 }% D7 l; w3 L) a5 s default: return t[0] /= t[1];//case '/':/ z7 H: _: J! j8 v5 \7 M& Q& X
}) r2 s; L) P& D/ L Q! v: z
}}
! I# W9 x. w7 x; gtemplate <class _T, class _Tstream>. l# h& u: S5 r. H
/* _Tstream: inputstream, _T: get return value
0 M( N; r' o, b* f0 n" O2 y+ ~* Return nonzero if get value successfully */8 A2 u& k2 I: T# N5 w; f
int GetExpValue(_Tstream& istrin, _T& nReturn){
7 w U( x8 n) f0 e+ R _T t[3] = {0}; //雨中飞燕之作
; F8 K$ O: K' X- a; N |' _ char csym[3] = "++";
8 d; Q- X/ j& W8 v int nLevel = 1, nERR = 0;
9 i+ c! i8 V) I$ P if(!(istrin>>t[1]))istrin.clear();$ e$ g, v6 f, ?0 X3 r6 Z4 u
for(;;){
+ j3 \) }9 p9 i! ~" T# Z- g if(istrin>>csym[2]){
9 J4 Y2 F) p% y1 P7 d# b. B switch(csym[2]){5 a+ p) v P/ A0 m' }
case '(':% `" T x, Z7 E+ Z: }; h0 [1 e
if(!csym[1]){nLevel=0x100; nERR=1;}else
& [0 _% X/ p! P. W8 s! j if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( N' V4 P- K9 y7 I% z
else{nLevel=0x100; nERR=1;}
6 V6 A: A( ~( ]% ~; g2 A break;
% ~! \- o7 E( _7 b# Q6 L6 x2 n case ')':
% V: F& J" G" ^# Z% o" { {nLevel = 0x100;}break;
0 }# H' J3 A0 F5 ? ~( @7 D case '+':case '-':case '*':case '/':* G' G9 b5 F$ l% H, I1 g
{csym[nLevel++] = csym[2];}break;1 z4 ]. A) j, Z n% {, Y& ?! O
case ' ':case '\r':case '\n':case '\t':continue;3 g' Y$ u( T1 w7 F Z/ h1 w! H5 Q
default:7 i4 d& K% p( j1 I( R
{nLevel=0x100; nERR=1;}
3 I+ b# C7 x9 u: w+ i. \- q }/ Y3 M' S& {, J5 e
if(nLevel==0x100)break;' G6 A5 L- T; H0 K
if(nLevel&0x10 || istrin>>t[2]){
& Z; S1 b/ i" ]0 r: D7 w8 F7 N nLevel &= 0xF;8 H% M# I) H' ^( G; W
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}+ c7 y( A; u8 ~
if(csym[1]=='*'||csym[1]=='/'){
2 \" ?( p" c% @* c GetExpValue(t+1, csym[1]);
& h! P; i' d0 C9 e- j& C! H }+ {' F$ O, u; |; }" T( s4 F
else{
' D* [# o- r, `" [. \0 N( o' Y GetExpValue(t, csym[0]);+ O, ^8 b; J) b4 L# {2 r
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" B8 J. m/ p# E- I$ Z+ q }4 `* E: l, Q0 [: Y
nLevel = 1;
3 D! a& x X0 ? }
' m0 W8 X( A6 T$ C( b- g% u else istrin.clear();' w. {' m- U/ ?: ~6 S* R
}) s0 s/ q+ H0 G2 D& M
else{nERR = -1; break;}% B) C! S& r a5 [( i; q
}/ T* f5 F. B/ ~% i! i5 l2 y6 i% U
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: y( N' f8 O3 R/ h else nReturn=GetExpValue(t, csym[0]);
' ?- p7 E! N5 I4 W: O! F3 q return nERR==-1?1:0;) R0 a3 E }% D8 L! ^. k: Q
}}
7 |/ ~, O" _# O6 Y7 @( e2 i5 ~4 }
, N3 I, T1 V1 O1 i
& m/ o) }: Q" g4 f, X0 ~
( f+ V# S6 I( G2 r. [% x函数模板使用示例:; Q4 e6 S2 l) { B2 h( \4 v1 b7 I
在以上那段代码的后面加上以下代码:
/ z( T F: x# G9 O- A/ Q, E& w
, v$ `0 g1 X4 C * H% B! a8 \5 P8 ?6 q5 ]. A) J4 |
5 t( A8 g5 e# [
程序代码:
. d1 F, H0 J$ q: s
4 q. K6 I w6 M" ~0 V/ ]! ?1 H8 d#include<strstream>
6 a' t8 x, o8 @, p#include<iostream>( |0 y. K) e i. g6 C$ a
#include<string>
, ^, w4 m# Z; [# ~6 ousing namespace std;4 x1 o2 l8 E" Y0 f- o: N5 y( i
int main(void)
4 V( \5 U: ]* D. T, m: i3 }2 g{
% W. e) P" f. L3 z- | string s1;8 X+ |" l! p5 T* i' C1 b
while(cin>>s1)
& A- L+ F0 s0 R: P; {4 | E {( y" v4 P Z6 ?- j" C5 V4 J: E
istrstream isin(s1.data());) a2 i1 a& K3 a% N( N
double d;1 g- _+ S% i i% G3 U( S+ q
if(fy_Exp::GetExpValue(isin, d)); U- @0 L1 H4 m# r
{8 W0 ?0 Y" D' y: D7 Y9 ]
cout<<d<<endl;
^7 T7 U, V9 ] }# L% u v" B; P# w7 W
else4 o& v& b$ V+ k$ z
{9 ^1 z f& L( e) F
cout<<"ERROR"<<endl;
& ]( [8 W; N8 v% O h# ]6 J8 p }
2 m. J" O+ d6 I+ R3 b }3 v+ j0 C# M' d/ V
return 0;3 `3 [! r: [# o) e
}0 j& Y5 ^' A5 Y% _% l- w
+ e3 J1 v5 _, M# E) r8 y3 U
4 V6 G9 H5 ^6 |& k6 F然后编译执行就可以了(*^_^*)1 B# U1 T. m- @- N
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ p" w' K) c' j. x 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|