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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,0 R9 H! S w# m. |2 @# q t+ x+ x; w
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式$ J& O0 Z, d/ K
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)* S" C9 U4 r/ L9 K
参数解释:
- N9 ]( y) B( ^# A) E: \0 Nistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" o T6 y( `% \8 O* DnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定# c0 \" z* c2 o/ }# G" H* U/ o
返回值:
" _3 O/ _" X5 K& B返回非0表示计算成功,0表示计算失败有错误
% V4 H+ c9 m# V0 X: N: j2 u, \
& s/ P8 @5 N; |9 F$ {6 z
+ F$ Z9 o8 d$ _/ X( ?
: `+ D8 u( M7 p& U$ h程序代码: 1 K ^* c* k) B1 @( B
; _- a5 Z- v$ B* onamespace fy_Exp{
- r( X+ _- h2 N# Q/ s: ]1 mnamespace {template <class _T>( t4 n+ e1 k6 f
inline _T GetExpValue(_T t[], char& csym){: U) W' |( k; q% L1 b1 L5 p
char c=csym; csym=0;9 p; K2 N" E$ b8 E$ I7 d6 [
switch(c){" p; I5 M* [( Z% G! O6 l3 `
case '+':return t[0] += t[1];, c1 S8 F$ A C" v) x c
case '-':return t[0] -= t[1];/ o8 d% q1 @4 Z+ ~0 ~3 `
case '*':return t[0] *= t[1];% i7 h! Q% f9 i4 {8 Z/ p
default: return t[0] /= t[1];//case '/':
( R+ M% Z5 K* v( c+ X }' J" s& [6 r% y5 k
}}# i/ y! `, x) B2 [ ]
template <class _T, class _Tstream>* u+ e9 B) b9 z, [! e
/* _Tstream: inputstream, _T: get return value
- E$ ?+ a+ L( W5 }( y' `! [& c" V* Return nonzero if get value successfully */+ ?$ ^; ?$ r# ]8 h; G0 p' J) d
int GetExpValue(_Tstream& istrin, _T& nReturn){
1 x# e# L( H' a" b$ M6 {& h4 x3 ]2 Q _T t[3] = {0}; //雨中飞燕之作
3 i& b) n: X1 }9 E" z char csym[3] = "++";8 _# Q1 E3 t! ]0 o' v" h3 m8 W& S
int nLevel = 1, nERR = 0;
5 h4 E3 F2 A: k5 r" E7 a if(!(istrin>>t[1]))istrin.clear();% P0 F& n3 o" s7 ^: g8 o
for(;;){
! z4 F2 K( ?& N" c1 S if(istrin>>csym[2]){; w. s: \) |) Y# k2 J# k
switch(csym[2]){
# j. M A6 _3 i4 r: [- { case '(':. y/ n4 }( s/ i4 q' P! Z
if(!csym[1]){nLevel=0x100; nERR=1;}else
. ^# @2 N. D ]" W if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
5 r0 N+ Z# c1 b2 R8 ]5 N( l8 H else{nLevel=0x100; nERR=1;}0 b8 ?, A8 x' T+ M
break;
5 ^6 A" o: h7 w9 c case ')':
8 ]8 t6 }- b3 t- n {nLevel = 0x100;}break;* n. H8 e: E9 C6 ]) x" K1 W0 R6 b
case '+':case '-':case '*':case '/':
; c M8 _' } v8 P% R7 X0 l {csym[nLevel++] = csym[2];}break;' P1 k$ E# H) F7 e+ t
case ' ':case '\r':case '\n':case '\t':continue;; o! o5 R2 C; |+ J2 X# O
default:
/ ?$ R- {2 s+ I% y {nLevel=0x100; nERR=1;}2 p. N r, o& V* U( J! E
}
5 P. \5 j( q* P8 J if(nLevel==0x100)break;1 D+ H! x% R0 K7 `* P( f
if(nLevel&0x10 || istrin>>t[2]){
0 B5 U" c$ V4 k, f( i nLevel &= 0xF;" H5 }( E7 A7 x' w
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;} h# H. v/ [9 L% {
if(csym[1]=='*'||csym[1]=='/'){: n) \/ V1 v9 U J: J; l
GetExpValue(t+1, csym[1]);" ^* n# X$ y8 [ K# x1 {
}* i# }' T" s2 J& e3 D
else{
$ q/ l, | q3 l2 w GetExpValue(t, csym[0]);
& [' J, r- d$ F2 H$ @. x9 k, n t[1]=t[2];csym[0]=csym[1];csym[1]=0;
}9 w7 @0 R( R& Q) T$ ]% e% @5 j }
' L! s ^ v0 V5 I9 ^# O! L nLevel = 1;
- b- k/ S, w% p: B! F7 [ }& J8 @. s3 {* R8 Y" R6 i1 T$ {
else istrin.clear();
0 H. R. p4 F `, |% ^ }
+ \. |6 D+ M! D else{nERR = -1; break;}& i' ]& [9 u4 j( ^5 q
}7 r: {6 w$ S8 ^1 S0 e
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; G& u/ T7 g2 t1 f else nReturn=GetExpValue(t, csym[0]);# N5 j8 t3 f' J$ @6 j" h0 B
return nERR==-1?1:0;; z- |. Z* s$ E! G
}}
- L$ ~1 p& s x8 f8 h3 n, p4 K# {$ [) G+ N# p) |. A# u, d
) d0 \6 Y/ n/ l, m5 x3 U2 S1 A) k" {; @% V- }. q$ q' G$ Z+ H
函数模板使用示例:7 u9 r, w, c9 \* [: p: r
在以上那段代码的后面加上以下代码:7 `7 `3 ^; ^" j; o9 M
% a( Q+ A8 p8 h3 n. j# X. z * t1 X$ a; v' u# R! R
; f7 h5 g2 h) b% u( Z- ?/ s程序代码: 0 C, Q: I6 n0 O. O) J3 g: {
' j" }9 b1 Q7 k$ h
#include<strstream>4 B5 |. [+ h! T' Z: u( E
#include<iostream>
. n0 c( s; R1 H6 r# z( e3 y#include<string>
. F7 e' M6 p+ Jusing namespace std;5 u% F' x' `( a: o, U' Y8 @* ?' H% A
int main(void), h3 x' m7 L& t. X v
{" `* h$ d% V+ Q& P/ _& ~+ H
string s1;- E+ z5 i1 F. \8 c+ N
while(cin>>s1)
: `# F6 t! I4 P8 [ k" P9 f {
; f H2 X: @# ], [- D5 a istrstream isin(s1.data());
& k4 f$ a' \% q2 n( ?7 e: g" ~$ h6 s double d;. a6 x. f3 T, n+ k W' M, |2 m
if(fy_Exp::GetExpValue(isin, d))
; h. ?9 X, L3 w! q0 @0 R# G5 R {
! |7 e# p L& _" Q2 K' I cout<<d<<endl;
! k6 S3 V& G0 \# F0 d$ a9 h }( K9 O, J. C! _0 H& P. G7 R# K4 a( w2 x
else
3 q: D5 W* ?5 A1 Z' I {' Y6 }, {3 y- a5 J. O9 d# ~" P6 {
cout<<"ERROR"<<endl;: W! \ w& F# Z. H/ L( I0 q8 S! m1 G
}; I9 v9 ~2 J Y3 F2 L
}, Z3 `- o/ e9 R. ~1 j9 L- G, u d
return 0;" v ?0 j+ k; k5 H
}
! c- n4 j! [9 H, }& Q' i( t% x0 o0 H+ K5 X6 Z' C! O1 {; F
8 l3 O+ W8 C) ]' T9 K然后编译执行就可以了(*^_^*)
" D% U, i5 I, U其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 _9 v+ ]) K% w7 J. O2 ?0 S+ [
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|