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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
; I1 H) L- U8 [一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& a+ x3 Z' @+ \只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)$ U: H( p A7 M
参数解释: O# q/ S5 V+ u* A& G6 ^% s0 M" P
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' `) J' G1 C" V9 c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 \/ T0 E6 w3 O/ M8 w( I4 V
返回值:1 r& e9 H" N8 X/ c
返回非0表示计算成功,0表示计算失败有错误/ y, {; q! ~) n1 Y! ]
2 g f+ z1 e% G4 w6 Z
]6 \. N* x: ]* S/ Q
! C$ a2 F! r9 [- `" Z程序代码:
+ M# P& ]$ ^9 e- o" c. j4 V& h0 A
! l' N% B% q+ F* _$ onamespace fy_Exp{
) |/ {2 H3 B, B: [namespace {template <class _T>
- u$ P7 }7 s- m' U; F5 N7 Z+ pinline _T GetExpValue(_T t[], char& csym){
/ d$ N; a) t& B char c=csym; csym=0;* W. M. M, S( |; q4 W
switch(c){' w. w i- v. }8 s2 U1 D# A
case '+':return t[0] += t[1];* _/ B9 t, L) p; ^3 t: A" a. ^
case '-':return t[0] -= t[1];
8 j& R# Z( |4 k! K8 K& N case '*':return t[0] *= t[1];8 ]/ O& u. Q$ o# S; g, C* d
default: return t[0] /= t[1];//case '/':
3 l9 m& g6 h* \6 ~1 x }; w. ]9 x E1 J0 e/ d
}}
+ V; w. C4 F& l+ i6 C' wtemplate <class _T, class _Tstream>
+ L' o: X( r& w* j7 B/* _Tstream: inputstream, _T: get return value% `" `: D. O7 ~! j1 w* Z# I: f
* Return nonzero if get value successfully */
3 M8 f/ t9 S1 ]. \& mint GetExpValue(_Tstream& istrin, _T& nReturn){
+ b( m) P8 m6 e, H. l6 s7 V0 C8 @8 ` _T t[3] = {0}; //雨中飞燕之作" t0 j. l+ J8 ]5 R% v; V+ F5 J
char csym[3] = "++";
! n6 F V5 i4 K4 T! \5 q/ v int nLevel = 1, nERR = 0;
+ G! L8 ~: N, B9 r if(!(istrin>>t[1]))istrin.clear();( ?! ~; G e5 y4 B) h
for(;;){
. m9 v+ W7 A2 M2 A( \% u if(istrin>>csym[2]){. V. J) n4 m4 }
switch(csym[2]){' L4 R" b* V% w, H) D6 g+ @
case '(':
8 \& k( Z3 x- h" S9 t4 C if(!csym[1]){nLevel=0x100; nERR=1;}else2 U8 d0 W" o2 v6 o' x' p
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% S0 f! V8 [* @/ d7 a
else{nLevel=0x100; nERR=1;}+ Q. Q) f* J% p
break;
! Z- Y4 R1 z9 e5 I# n; }2 O) {0 F case ')':' O0 v3 J3 G- m3 n
{nLevel = 0x100;}break;
U' v; f( b0 ?/ @$ t! J# L Q case '+':case '-':case '*':case '/':. m# G/ x+ }" f: h
{csym[nLevel++] = csym[2];}break;4 f7 n0 m/ V, f! X2 m6 O& S
case ' ':case '\r':case '\n':case '\t':continue;
1 G! k0 n7 N( J$ N6 o5 i default:# A: E; j$ e. ]
{nLevel=0x100; nERR=1;}
* }- X8 Q. U7 N) a* a }' c4 ?. X0 R( T8 e- X7 V
if(nLevel==0x100)break;9 X. p, n- \% o" c4 x. Z
if(nLevel&0x10 || istrin>>t[2]){' c0 B: A0 _; n* }
nLevel &= 0xF;9 w1 `# c8 Q- E3 C/ y* g
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ e+ q! [& Q, Z% P6 {
if(csym[1]=='*'||csym[1]=='/'){6 e) w1 L# ~* x2 @2 s
GetExpValue(t+1, csym[1]);. w6 Q4 h! F w1 Y8 V6 d
}
# q: p* D4 s7 H& J else{
! T% `/ s. q- ^$ h# s GetExpValue(t, csym[0]);- r' o: H R; |+ ^" m1 l; h
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
4 X% `, C: q" } q; f! j% `% F }
& J" J6 ~. v2 d$ i1 Y' T$ n, R nLevel = 1;
3 t" p' _% M3 H }) t) S1 ~2 x% T8 b+ ~ B) k( Y
else istrin.clear();- R( @; Q- F. l
}8 Z. v$ ?1 V1 i9 N
else{nERR = -1; break;}
" N& i9 |/ v! `" k# e8 {& Z }! c s# g6 K% m- j/ a0 |. n. b: R
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]); y, T1 Q( |3 P. B
else nReturn=GetExpValue(t, csym[0]);
( I. Y% i, S! J6 O- n! Y return nERR==-1?1:0;
( N$ i' V7 G; {; I# ]6 t}}) o# R% ?* i, _2 B
# u) M6 N3 [0 @# D
0 d$ Q8 r4 _! s$ ~
0 V' Q8 s5 O9 v3 }- m) V# O函数模板使用示例:
5 o% T4 O/ y% y$ X! M在以上那段代码的后面加上以下代码:* n% w" n" T t7 V g6 U
6 U8 f) i: G* B) _5 {1 ^- g, ~
1 \( E) m. k8 v+ k) l( g
% v3 u& c: t* Y% w# a程序代码: 8 e7 u; n% }/ @) p& Q
! J" L1 Z$ s. I5 k' i( `
#include<strstream>. l. o- v$ D. U, V; Q- a
#include<iostream>$ t% b& _1 o5 d4 X) k# i
#include<string>% [" a% x3 _( n3 f3 m3 g
using namespace std;
' e- v' M; O+ ?) Zint main(void)
( S) i2 X A# S* m% R{5 \9 Q( I8 q2 t+ _7 p! \
string s1;6 [" u+ x- U: u" C0 a
while(cin>>s1)
: v- M* y# u6 D% t" [# C3 b7 T {) B( G3 n. m+ `$ Z7 f8 ^/ r8 B
istrstream isin(s1.data());/ d; J! W* m5 \2 e& S r
double d;7 A+ f; B! J9 L' {0 E! P
if(fy_Exp::GetExpValue(isin, d))
1 T" V9 W" n' e+ N; H {; [5 z1 _3 V! D- d% D8 e
cout<<d<<endl;' O1 ~! Y2 `/ e4 [1 m0 y
}' d3 }- o# [3 t! Q$ _
else
4 k, d. x" l P# W S {4 V% F! k4 Y! s9 L' k
cout<<"ERROR"<<endl;
3 @( P4 F5 W1 g8 _ }
8 }' V# j0 K7 H- O }
4 F7 b4 {6 ]( h' L" s/ L return 0;
& e1 i( R' J/ x, h" p, _; v}) L8 ~- J6 y; N! ]6 [* n3 M
6 N4 R- T9 q$ L! V" U O$ k: O
+ [2 C( v/ s9 }4 [然后编译执行就可以了(*^_^*)
" H& _+ [) g" k) s. z/ w6 x其它:TC++上一定编译错误,不保证在VC6上也能通过编译2 f! H* M3 Y, _( Y! _
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|