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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的," k( f7 J8 E: Z& I8 q3 T+ j% h; A
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, }7 ~0 l$ C7 Y# x: ^$ V( `! l只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn) C2 X+ d* R7 R- _
参数解释:8 `: E4 q- ^7 N3 \' z4 X
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流5 l/ q0 i7 m6 I8 j
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 {2 T( F2 o8 M( b+ h6 y! X1 M返回值:
$ t7 n+ E- A; x- t$ t" i+ a- N. k返回非0表示计算成功,0表示计算失败有错误
p5 c2 S( e$ R8 _! ?2 G9 N# g: g& G
3 r& U8 _ A; _
; g/ a- `" y# ?& ? ]& z( I+ k程序代码:
' `" F7 m8 z* y* T! a0 \1 I: ?. l4 |) T/ T! @$ @6 A1 u) _' w
namespace fy_Exp{
" N, G$ @/ L' K8 v( Ynamespace {template <class _T>
4 E: }, }$ y2 i3 o- E9 L" Tinline _T GetExpValue(_T t[], char& csym){6 K( S3 W% u5 a! L3 y8 h
char c=csym; csym=0;
3 P& n. |0 {$ }' _; B* A switch(c){: \+ y4 }* l% I! i! U
case '+':return t[0] += t[1];
( ]( W% [2 G2 B, { case '-':return t[0] -= t[1];
4 D5 Y9 {. f$ E% l$ Z# D4 B, `1 U* r case '*':return t[0] *= t[1];
2 \6 ?1 Z* Q; b, m2 C default: return t[0] /= t[1];//case '/':/ B/ r6 R5 J6 v5 y+ A/ T% W
}9 u& |* z c* k9 y/ S+ O9 w1 Y! {
}}
" a/ I. ? P( U7 F$ `" ptemplate <class _T, class _Tstream>4 H* C8 B7 T ?3 R4 Z" Z: _5 @% Z
/* _Tstream: inputstream, _T: get return value+ G" [5 R) z/ v) |; }, A8 J
* Return nonzero if get value successfully */) k1 a. ]+ `, b+ w/ |6 m6 M* s9 c
int GetExpValue(_Tstream& istrin, _T& nReturn){- Y/ M4 A8 C% z ^3 D( b' I Z
_T t[3] = {0}; //雨中飞燕之作$ z3 ?% Z' y ]3 h8 m9 j/ A
char csym[3] = "++";5 ]% Q0 V0 V. u% S0 c0 K
int nLevel = 1, nERR = 0;: F# e! t1 C& A+ v" v
if(!(istrin>>t[1]))istrin.clear();* h( r( x5 t) t3 l4 D1 y
for(;;){- u6 C h8 G/ F
if(istrin>>csym[2]){% H/ x& {' Y+ ^2 D" B5 r. b
switch(csym[2]){; l- a- b# {) N1 y' y% B" ?
case '(':
( d4 C$ R6 i8 H7 j" Z3 z# t if(!csym[1]){nLevel=0x100; nERR=1;}else- ^% b' f) t2 n7 }* W2 Q: o
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 q- W9 v; U3 K% }. u5 }' I
else{nLevel=0x100; nERR=1;}, `1 I' h! }+ p+ b* {, S
break;
4 ]8 T Z" B# p, P {9 L case ')':
" n$ G( C! @ ]4 e {nLevel = 0x100;}break;
) p w- u. n4 y9 y" G case '+':case '-':case '*':case '/':1 @' ~+ a6 |+ B; G
{csym[nLevel++] = csym[2];}break;* [! c8 [1 Q# \6 S6 k5 e
case ' ':case '\r':case '\n':case '\t':continue;# M) g) S+ s! X" X
default:
/ o N4 T% t3 X. t+ U {nLevel=0x100; nERR=1;}7 c/ |# [+ N# B% L
}: T' w& W( W8 g! `& @- n
if(nLevel==0x100)break;
9 v) C' W$ A" S& }% c1 a; X if(nLevel&0x10 || istrin>>t[2]){
# n8 g; Q& q5 q5 ]' v& n. q nLevel &= 0xF;2 ?1 r+ O4 H' b2 {: v* { L
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}6 D3 G" ]' n2 ]9 _* A( @/ D
if(csym[1]=='*'||csym[1]=='/'){8 B j) ?5 V, V5 F6 n
GetExpValue(t+1, csym[1]);
" E3 c5 W- D5 |" b }; D- j8 v2 _& X
else{9 Z$ B! J& ]% f J1 h: i
GetExpValue(t, csym[0]);
( a2 o5 Y; G2 o/ C6 _ t[1]=t[2];csym[0]=csym[1];csym[1]=0;
. E# f8 |. k7 i6 X }
/ [. T+ @! \: H/ X# R: G& B nLevel = 1;$ O) G# l/ h3 M0 s6 B( O
}
' a7 P7 D0 r- ^- y% }! F else istrin.clear();
3 N$ H6 t# F6 \5 q! g }
: a0 A. K$ d; ] else{nERR = -1; break;}
F9 C$ J3 d- ] C# O3 C+ `( O }
6 K9 v& \ Z( G9 Y1 d+ F2 o w. U if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
# ` Q. H! j% j7 t+ E else nReturn=GetExpValue(t, csym[0]);
$ K$ `# |7 r, w) s; z return nERR==-1?1:0;$ Q! d1 i! B6 b# R, G; f
}}
4 P+ I3 d$ R2 I. N/ \2 J* k9 n% c( m; T
' K) X% X/ \7 n9 V0 K4 U$ P. M% f/ L7 o# y) f3 s
3 j0 o$ \. J; j( e. [函数模板使用示例:
, a7 Z2 I- a: C+ h! Q在以上那段代码的后面加上以下代码:
5 z4 ?; M# @) H8 S0 I, ^( K0 J: Q, l
' v4 P# Q/ u2 X- Z, t6 C' n: @+ ?) b/ r& U4 V9 v, d
程序代码:
# R; m0 H1 i6 ^* ]) v( ^) r$ L8 `& w' s {
#include<strstream>5 _" o2 h# R7 \* j5 Q- l8 m n( B
#include<iostream>
0 d" D7 i! P6 n/ b- H+ ^#include<string>
. F# {5 J' R5 c5 k6 y/ Uusing namespace std; f; c+ e4 G0 k/ w3 l) g
int main(void)
+ U& V4 C% J5 y9 ^8 L1 G5 o& D* H% }( M. N{
: G. `6 P( U7 O! } k! Q" _ string s1;
1 b2 a4 _# J6 j8 G3 x8 D s, \# e while(cin>>s1): ?9 R% F7 H# b5 e. J) l
{
! x7 ^! V% \" z# v* g. U h- s6 ?3 r3 S istrstream isin(s1.data());
Z9 Q d* s" D. ]" G0 y- ? double d;
4 _2 S W5 O. ?# P) B* {( G- | if(fy_Exp::GetExpValue(isin, d))
- L. @9 C/ z; A, U# n { O9 k2 W; `( }; O% Z# n
cout<<d<<endl;
% G/ K9 P6 {& d d7 a }+ i8 l2 \, U; H% O. v
else8 V; R) u0 L. A1 t
{" I' L1 U% o1 i3 r9 s& b/ }- p3 h
cout<<"ERROR"<<endl;
- ~! A0 x( r. }/ R; v }
/ D i% Y. | }- [) u' ~5 v } l, F2 |8 w% b* ]% `4 s4 d/ U% L
return 0;+ V$ a9 C% v. f. R( f; o
}2 B: I2 B6 x% f+ A
( n5 h- K: E* E3 L1 {' d9 A6 x4 r1 z7 x! i/ |% P
然后编译执行就可以了(*^_^*)7 ^ C# s- ]4 p
其它:TC++上一定编译错误,不保证在VC6上也能通过编译5 {: I; c! [. s( h; d% Y4 w3 d% Y' X
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|