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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
5 R7 l6 X7 E' l" `! ?& f' c. ^( [3 j一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
4 I9 E4 I! o& I只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( k8 c% G5 v5 t- C3 |" v参数解释:1 a+ r2 q* a! j- ]
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 D: n" `8 S6 r' `6 ` l+ Z: _
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
. w+ T3 Y a N' I0 |返回值:* ?8 D- ?! H, ~% \1 K8 }6 d
返回非0表示计算成功,0表示计算失败有错误6 `8 c/ L% G: W) A. }
8 F2 n# R& M. A, ~6 V' g
6 Q- h5 v9 ]+ X, K Y
- _7 Y& |7 p _程序代码: + |) b2 I6 i: X. L9 c, u7 {
9 S5 d" N) R/ s$ xnamespace fy_Exp{
/ k- L9 p, U% H2 g6 Z1 s* t7 ?9 L4 dnamespace {template <class _T>
: E% W/ S" I. X( i X2 J Tinline _T GetExpValue(_T t[], char& csym){* {! \5 m' X7 |2 A- V
char c=csym; csym=0;
0 v* O5 K3 S" D: j C& e ~ switch(c){3 d% H2 t* R+ ^# d3 a+ }
case '+':return t[0] += t[1];
) N. q( q4 l% d# c/ m3 c case '-':return t[0] -= t[1];$ e' A3 C3 ~; F1 _4 T: H
case '*':return t[0] *= t[1];9 [/ Z6 w6 c0 s f7 \7 W
default: return t[0] /= t[1];//case '/':3 C z! q: Z. i+ @
}( K7 w5 V! O( r1 }$ Z! y3 L! X
}}3 m2 k4 P0 B$ C% h1 o
template <class _T, class _Tstream>
; a. F0 F: ]2 D. }# T$ R: Z/* _Tstream: inputstream, _T: get return value
, m8 t0 N0 u3 Q" P1 I7 u6 O4 S* Return nonzero if get value successfully */
% o5 H. O" }' ^/ o6 y+ d2 ?7 c' A: |int GetExpValue(_Tstream& istrin, _T& nReturn){8 |" v4 M6 f- P( m! D% J
_T t[3] = {0}; //雨中飞燕之作
; `1 g/ l5 h8 [# n, a char csym[3] = "++";( k; c N. @. `" M
int nLevel = 1, nERR = 0;
6 R% r+ H+ }& w if(!(istrin>>t[1]))istrin.clear();
; D: H& k+ X+ C3 M8 W" u for(;;){
" u" [& S- F0 k" Q0 [9 Q if(istrin>>csym[2]){
9 J; K' R! B0 Z" I switch(csym[2]){
; ~5 k) l$ H8 ]% K case '(':
5 C1 Q8 p. ^5 b; }6 V [3 p if(!csym[1]){nLevel=0x100; nERR=1;}else
' \& Z8 Q4 `0 q$ N if(!GetExpValue(istrin, t[2]))nLevel|=0x10; }) c- R& g/ c: y! w- _' P" C
else{nLevel=0x100; nERR=1;}7 Y0 }0 C# r4 m4 h) y5 s' q
break;
9 r% t; s( O8 G4 U% f case ')':
# H. f5 y6 H9 `9 v1 X$ V; V {nLevel = 0x100;}break;, r0 P3 P% Z7 o$ b' ]
case '+':case '-':case '*':case '/':
6 } O& C( A+ i0 W# u) } {csym[nLevel++] = csym[2];}break;
& G# {4 @4 l0 z+ E/ ?/ l# Y: E case ' ':case '\r':case '\n':case '\t':continue;% L( `! }3 t* [) v9 L! d
default:
+ Q0 l0 f* v [1 }1 b9 } {nLevel=0x100; nERR=1;}
7 U& X% L5 x u2 T$ @1 e1 { }
* k: ]2 T5 ~1 c: V. y9 f if(nLevel==0x100)break;1 T3 |1 A+ E# }& k9 J
if(nLevel&0x10 || istrin>>t[2]){$ n* w6 V$ d8 `
nLevel &= 0xF;, [$ {* W A Q% W
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}' E ? s3 d) j- I0 ?& P
if(csym[1]=='*'||csym[1]=='/'){
* b' _7 G3 x# P4 S/ ? k5 @( S: l GetExpValue(t+1, csym[1]);3 E. U1 F2 d: p: x" V; T6 e0 p' J
}
4 @. T5 C+ D7 P6 Q7 n& W else{. h; t; A* B; R; M" x j5 n
GetExpValue(t, csym[0]);
" p9 }0 g# |" ?/ h- v% f t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" W3 x, s* D- T* P }
0 z2 u0 s1 L9 n5 J4 e, x* k" U7 P nLevel = 1;
6 n' p a. C5 s; f5 C }
0 ~) G. \/ C' K4 C( T" h* U) q else istrin.clear();# d% q( Y; v! A! l
}
, V- h- \9 |/ g8 M1 Y; D else{nERR = -1; break;}, M7 N9 S* a! }8 H6 T+ k3 _
} Z& H% B9 m4 F. t# j/ w4 X
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
! {$ a) T5 o; S else nReturn=GetExpValue(t, csym[0]);
/ d8 u" ^' s6 t return nERR==-1?1:0;
, R* n4 |( y6 P* E}}! T( R: \$ Y* }" b8 y) \
2 D( N4 c- j B! C3 h* x
" m* T2 r0 g9 O# q0 m9 Y; M3 f) \/ U. u5 F( _& T& V( [; @+ _- H. @
函数模板使用示例:
4 i; q+ J6 h$ b# V+ T* N在以上那段代码的后面加上以下代码:
9 g9 Q+ x/ [* ]% y& A7 G
& G& @ T5 H f' U4 v % E% f6 M. r4 |3 r# Y6 a% n* \4 H" n
' F1 i: L& h7 Z; Y/ v* Z程序代码:
) M4 D% f7 c5 U5 S, B3 v' N1 N2 T3 K9 K6 w
#include<strstream>
9 Z" Z% x. \+ D+ q' l% M#include<iostream>$ L+ L8 z. s$ q) o1 `
#include<string>8 K/ s4 Q! T2 m3 T# y3 x
using namespace std;
, w2 {* Z2 P; X2 T O: _! yint main(void)
" @! J- Y# D8 j6 x{
q( A" G( T: n3 D string s1;
9 U4 `2 n/ K% w" A while(cin>>s1)
( O4 v/ \1 V! O {% Z, t ~6 c# S8 p0 }3 H
istrstream isin(s1.data());
1 y: w( r4 X# m double d;
8 B( |; F: p8 L if(fy_Exp::GetExpValue(isin, d))" G S5 ]9 ] d% R
{
* e& O; ?2 w, c2 S, V. Z3 o4 @ cout<<d<<endl;
$ o& D: G7 N& {. V7 M$ d }
8 y E2 A0 F. \: J0 o, I8 c" M. w3 Z else
' s7 b* Q7 I _# P7 A% M {; L- E1 i' ?# G
cout<<"ERROR"<<endl;6 l; E6 M! B! h% ~
}; F* N+ g. h: d0 L; l" Q5 y
}
6 ]8 H& y) D8 I ^9 q1 { return 0;
5 A L6 e2 R' h j6 `! X# m+ K}
# J. B; X a$ d, N% J2 T4 H" R0 \: V7 w& X- M
3 ]$ S# d$ @6 }( c$ l0 J
然后编译执行就可以了(*^_^*)
; r0 q7 h- \5 _" ~. m其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ t7 d! ?' r+ i3 d8 c: {# x 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|