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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
$ D) T# c9 S" T" Q$ J% a$ e一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
$ |5 }; R; U7 Q7 k2 K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
0 D# Y/ l2 R+ w& H- b参数解释:
$ f( B/ B* \( @" Mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! ?6 r& l [: O- A
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
; T& z. H% d/ D4 i! u& @, ^返回值:
5 ^$ c( k! W! ~: I8 e: K# E8 i% S返回非0表示计算成功,0表示计算失败有错误1 c8 |: M( j- s6 b& f+ y
, D% Z6 u" Y7 ]& y& I8 [ , I- `# J; x4 F' c: d3 C" T
" }' o; z0 Z$ n' |
程序代码: - M% ^& v* _5 E2 R6 P+ E2 T
$ Y! ` A9 v# |+ B% P7 B% m/ tnamespace fy_Exp{
: }! c% q$ N3 R& snamespace {template <class _T>" {- r, H# ]3 |6 S$ T% ~
inline _T GetExpValue(_T t[], char& csym){
) k) N* a3 ^" X4 ~ char c=csym; csym=0;
. Z# e. {+ Z+ g3 F( {3 v switch(c){
9 |, o$ C9 Y6 g N* _6 `: {2 [ ] case '+':return t[0] += t[1];. c& d+ {& U; E2 B5 V) n k
case '-':return t[0] -= t[1];; A! X/ s' C3 ]
case '*':return t[0] *= t[1];/ b+ }- Y' o0 }5 l) k2 q3 @# |4 S
default: return t[0] /= t[1];//case '/':
% T, y* i" ], v( M }. j0 d0 A3 [, n8 ]
}}2 D/ i: g$ C* Y, s2 w( Z& }
template <class _T, class _Tstream>
: A$ \) p% [. m) T$ y# r/* _Tstream: inputstream, _T: get return value; i5 Q" v( V* {1 k A3 ^* _. h# K- x
* Return nonzero if get value successfully */6 E# ~( l* y* |# k4 Y. E/ [& u# n4 X
int GetExpValue(_Tstream& istrin, _T& nReturn){* L1 c$ B7 Y* u" e5 I. P$ W8 v
_T t[3] = {0}; //雨中飞燕之作
" _6 x9 a8 C: P+ H char csym[3] = "++";
9 A' S$ Y1 s" c% P2 u. Q int nLevel = 1, nERR = 0;
& Y6 A# F( b" j if(!(istrin>>t[1]))istrin.clear();
5 \1 _6 L( l0 Y# T/ h for(;;){
" l; k7 r( V# ]5 P# b( H- D7 ^7 { if(istrin>>csym[2]){3 v K ?' I& c, ]
switch(csym[2]){
, ^9 N/ `) [$ K# } case '(':5 Z5 E# n& p5 W
if(!csym[1]){nLevel=0x100; nERR=1;}else
, X- ]! ]+ }- e( u if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 \5 J# P& m$ @0 K4 I8 ~) c# G
else{nLevel=0x100; nERR=1;}; }! A+ w6 Q- _/ `
break;4 Y$ x. M$ _# I& I. X% P6 A
case ')':7 G4 O. @" S, C. S s2 r3 ~( ~4 `( L
{nLevel = 0x100;}break;
6 w& O8 H7 h) o+ u! ?) ?& G case '+':case '-':case '*':case '/':* b# _9 ~) o8 ]) i! D
{csym[nLevel++] = csym[2];}break;
8 |7 W0 `: C6 g, C8 U case ' ':case '\r':case '\n':case '\t':continue;
! {! X5 [ ~" L' z1 m default:
* m: \( ?/ C& J# A1 l9 P {nLevel=0x100; nERR=1;}' D8 W. G, S* h' r! n. @! [0 J
}( k' j# b# w- d8 C1 v w
if(nLevel==0x100)break;) h. m/ G) d K! m) s F( M
if(nLevel&0x10 || istrin>>t[2]){% B0 {% @. o' a+ R; E- P4 [# U: Q
nLevel &= 0xF;1 {6 o* I. P, y& U F3 u
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, O) g9 i5 O F+ ` S
if(csym[1]=='*'||csym[1]=='/'){, \6 a J3 y6 y8 [- j( k
GetExpValue(t+1, csym[1]);$ y5 y2 x! {9 _! {) S
}# q( E5 \: U1 U% y0 p9 F
else{
+ }+ {. W1 B3 q' ~3 u& k. V GetExpValue(t, csym[0]);2 e4 h& V& j3 }3 Y z9 l% J+ T* a& ^
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
5 k2 o7 Q, j6 }: w, B" B* B }
1 W, }; F! y. r* Y: Y2 N" z0 z nLevel = 1;- y5 o q, z, u( s8 x. Q
}
, d9 @3 D3 |) g S* y% _. R else istrin.clear();* d& ~) C! N4 @# K0 A
}
! F( Y$ ], s$ |0 x1 C else{nERR = -1; break;}
* n6 |( a) m( s' p9 |; A9 H- |2 M }- v9 j" x' H/ E
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 {$ W9 Q' x# ^; w: ~- u else nReturn=GetExpValue(t, csym[0]); N0 I8 [* A4 @" N- f
return nERR==-1?1:0;
* h5 t( W- ^1 Z- t: j6 `7 P' ~}}
" f9 b$ T5 `( H5 w/ x
; S$ i1 i) n) A* K
2 x1 n/ i- J- C# N, I) i- ~
, w$ F+ d: |8 H3 w, d7 M函数模板使用示例:
0 w6 h1 n( y9 E2 p在以上那段代码的后面加上以下代码:1 x# p- R7 K+ p. u* J8 Y! z
) S5 d- T5 L8 x: Q* }
8 b0 N1 `: E; v* k
4 z+ F4 j$ ^/ s, b$ S程序代码: : F: J" D& r3 S
' j- v( R: o; ?) P c- T+ i- {1 G
#include<strstream>
+ Q& q6 _& j/ D2 o) ]6 o+ E1 r#include<iostream>
' { n. Y! J" }& ]2 F#include<string>9 w, O/ L$ O7 Q3 I7 O% g! J
using namespace std;" s) {3 m* ]+ ]) L' z
int main(void)
! [; B( x3 I+ q" z7 y! k{
% \5 |& H2 C: H. v4 K string s1;
( k8 v8 y% l$ u2 l while(cin>>s1)# f$ r% G! \1 S. a- q
{
) i1 W6 p0 ^2 L; Z istrstream isin(s1.data());
) I2 t5 c$ X) _6 o double d;# H/ a+ y9 k9 X2 i- ~# o
if(fy_Exp::GetExpValue(isin, d))
+ @ N) X' ^! z. _/ G {
* n/ x4 M1 u! h0 Y% s u7 {! |8 ~9 | cout<<d<<endl;
* l4 [- B6 ~% G0 v+ m/ @5 ] }
! f9 {1 b/ ?, Q9 b else
3 r1 [; k# f+ |2 x* s2 O) i* ^ { |, P1 K' ?9 j& _
cout<<"ERROR"<<endl;/ d* k" P. l, j; \& T
}
8 |2 M# X2 k$ ^4 w8 W7 _2 n/ L }
: z. L3 P1 Y) o% D' U* ?: H9 q return 0;
2 o- B' t, y, o}
, U! B5 ?# n8 f: a; a$ z
/ n8 U8 `' f6 R% h, @. p- o& i- }
# P s( m7 T" i: b2 Y然后编译执行就可以了(*^_^*)
# K, E: x$ }3 C/ p4 g' l2 B) x- }. ]+ O+ k其它:TC++上一定编译错误,不保证在VC6上也能通过编译
8 z2 ^. R( Z( k 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|