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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
3 B: K _8 w5 F* c+ U4 X+ K一个很方便的函数模板,可以并且只可以计算含括号的四则表达式6 H3 J4 I. W3 W- m
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
: ` k0 b: V3 S4 P8 U* `0 Q2 b. Y参数解释:
# K: a* K5 P( K6 nistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) d* l( s( c7 i, a/ o5 m
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定- }# c1 {+ W+ c
返回值:
. y" r/ e% U r6 S, ~返回非0表示计算成功,0表示计算失败有错误
; ?1 R5 F! E! W- E# r `
( ?1 k+ ~# x; _/ w, R; {7 N , c& g6 j3 V! y7 @
. j% }, i% ^: A; P7 u
程序代码:
1 @% V6 a. }& P: n
7 N# }! _: @! U: X* @5 _namespace fy_Exp{
* s" ~" @# A! fnamespace {template <class _T>
7 h0 q1 x) L; Dinline _T GetExpValue(_T t[], char& csym){
- K; B7 O6 } r3 V% I char c=csym; csym=0;
: G- T9 }% p. ]8 P' ` switch(c){
, G. U! e _/ \( V) K; z, h case '+':return t[0] += t[1];
3 }+ D/ J8 [) [2 [ case '-':return t[0] -= t[1];; n7 K5 p" E) f6 w8 z
case '*':return t[0] *= t[1];5 V: ?, e5 @: B/ M& x: Z& @- l8 N
default: return t[0] /= t[1];//case '/':0 ^+ p7 j' Y( {, S$ u- g
}
* m5 E0 J+ ^( z N& T}}( J* ~# y) ?" ~$ M. C
template <class _T, class _Tstream>+ I+ m" b# h. `, e, k
/* _Tstream: inputstream, _T: get return value" t5 ` Y& k& T+ f+ j/ F
* Return nonzero if get value successfully */
; \9 s& ?4 E u& s2 ^, @& f1 s+ Nint GetExpValue(_Tstream& istrin, _T& nReturn){9 x5 u+ l% r0 f) Q; V; b
_T t[3] = {0}; //雨中飞燕之作3 x" C% q3 A9 i5 D' X% p. k4 ^4 p. z9 j
char csym[3] = "++";
/ s: @) W, \) w# M" Y0 f$ P int nLevel = 1, nERR = 0;) [0 a+ n* O% H! f+ t ]
if(!(istrin>>t[1]))istrin.clear();
$ ^% V& d. @' { for(;;){
# Q0 k4 r; m' v* Y" P1 b8 P if(istrin>>csym[2]){
) w& {! u$ t* c# d7 x: L switch(csym[2]){
2 d9 x5 x/ y; U, ^* \ case '(':) a$ G% p1 B9 `+ f& W5 k
if(!csym[1]){nLevel=0x100; nERR=1;}else* B) p; E3 z6 ~( V2 I
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;4 T/ C: b# D) m3 r
else{nLevel=0x100; nERR=1;}8 H5 d6 ^$ }* b, S( h2 g& A- \
break;
5 w4 _/ L1 k$ y/ V, c case ')':& m6 u$ ]& L z1 `9 S1 l% P+ D
{nLevel = 0x100;}break;; w0 a% R! Z" S2 g( j+ r
case '+':case '-':case '*':case '/':8 z, b( V( {2 M- y3 u
{csym[nLevel++] = csym[2];}break;
% @& L3 q2 u* A, R; n3 @" Z case ' ':case '\r':case '\n':case '\t':continue;3 D7 a) [( j* N9 y- W, {
default:
' h; z5 S$ [# _) }2 r1 o3 @- s {nLevel=0x100; nERR=1;}
" P( _5 n! v+ @ }
( M! ~" n6 c% r, } if(nLevel==0x100)break;
: \+ g" L, z( H) T0 s, K if(nLevel&0x10 || istrin>>t[2]){
. w5 `8 h5 }" O2 f6 u nLevel &= 0xF;
7 d; Q2 [, k3 a; J if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
$ M9 |( L( C8 G* W7 N+ u6 z* y( A8 m if(csym[1]=='*'||csym[1]=='/'){
7 U# X- g1 V. ] GetExpValue(t+1, csym[1]);
4 S* V( o5 J& G }
0 `, N$ `9 g) B else{
4 ]/ I% B' U7 G GetExpValue(t, csym[0]);" F y9 X! V0 O& J6 B1 \
t[1]=t[2];csym[0]=csym[1];csym[1]=0;- o y6 Z& @ r9 {5 l P* m" I
}
% e+ B# K1 [$ ? nLevel = 1; O2 B; a0 C3 w( m0 W! S+ s
}
; s! D( R, A7 g1 w+ R7 f ?. L else istrin.clear();
7 G$ g& z, T M }* ~! B4 ]9 H: J1 \- b& ?6 _) \
else{nERR = -1; break;}6 D+ {% Y K% w
}0 M0 T) P% H' D
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);0 [; s5 B- O5 v7 F
else nReturn=GetExpValue(t, csym[0]);
0 m! l" _ `$ ?- e return nERR==-1?1:0;
$ q& ]0 }% b4 X. f% l, q}}/ ]; n: {3 M; J1 N8 ^5 r) n
: K) ?. O) E/ L# V& ?. @& T) o! O
" t0 k8 K% g$ Z/ d# a函数模板使用示例:. \8 h! @, O+ `/ f
在以上那段代码的后面加上以下代码:
4 t+ k7 u$ D b$ O( Y! v4 u; R/ Y) p9 n
/ _9 X; h* N6 ?1 y; k, W7 h2 m
. F, o5 @+ c% D1 [2 V程序代码:
2 M$ [% m- G% o p' V# A; \# S- z. c
#include<strstream> B/ r) O0 t6 u; T$ f
#include<iostream>% c5 @1 X1 V( y" ?% i
#include<string>
8 `3 M+ x- x7 h) c( Y' U! }using namespace std;
, Q3 g; P1 u% N6 I5 u& @0 r4 bint main(void) `% `5 m- f9 U" L% q
{
, n0 W; S+ t/ T* @ string s1;
4 B4 C# n% o. z' R5 G% p3 B while(cin>>s1)4 D: | R9 _9 M4 J% m7 a+ P
{& ?4 \# L) C; `8 G; x2 b, W0 Y5 \0 W
istrstream isin(s1.data()); _1 E# N8 d- \- M' l0 |
double d;
- F p/ a( B" E! x6 K if(fy_Exp::GetExpValue(isin, d))* Q3 S0 J" n, F
{
/ y- @/ _/ G* G$ P( b/ ] cout<<d<<endl;0 k' X y3 ?6 \. l; p
}+ | v6 y" _2 ~ Y% T; h
else) J3 D6 J* E! f$ X2 [! h9 j; T
{
9 a: T2 T* J- _8 M) v; h5 Q# k cout<<"ERROR"<<endl;
- R" x' V1 ?, k( ~1 K m B n }
/ \( X. M; `6 S; b+ w& y( k }
& O2 `3 j2 E% m7 m! _ return 0; I. o" r/ h" `" ^/ c. ^* M
}. C8 B* [8 n: w
% E2 G" l( n" J' I
$ F' K9 q% U2 j/ K/ l( l3 n5 f然后编译执行就可以了(*^_^*)0 `1 y$ h/ o4 v$ ^0 k
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
d+ G2 X0 T& {3 @ l! I 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|