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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
! U( g+ s: j1 Q$ D1 G! K一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" ^4 T# J, O3 Q2 r& q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
+ U; T; x' y2 U$ v参数解释:2 T! F, s2 S/ C$ z9 d
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 S# g k# b8 M# s0 C) B8 y6 S8 dnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 b+ ?) U. O, `( K$ q返回值:
2 e4 n2 n& S+ {/ t) u& m返回非0表示计算成功,0表示计算失败有错误" |5 A B$ E- i! K3 g
) T1 Z& ^+ k- p' W: j9 l+ q) o
" L" M b! Y; p' B/ Z0 l8 V- _! T' s
程序代码:
6 |6 _ h9 |! G. P4 p+ e: y& z5 | U/ ]1 A
namespace fy_Exp{0 @% ?7 n2 ~7 v- Y: m) x
namespace {template <class _T>
$ o* T* p2 h6 [! ^( t" G* _inline _T GetExpValue(_T t[], char& csym){
# E$ z: ]+ K' d; U6 J/ _ char c=csym; csym=0;
k! X& q1 R: h2 F$ n7 c switch(c){
: @ H) n. ?. ?3 I case '+':return t[0] += t[1];
" k" b. ^ v& S case '-':return t[0] -= t[1];! r8 @" m/ r, e
case '*':return t[0] *= t[1];1 ?0 }0 Z' u- ?4 y. ]1 E; x! v
default: return t[0] /= t[1];//case '/':$ K" Z/ H' V3 M' H# U' _
}0 ^! J3 W/ ]/ a& A( v! g
}}
3 \: ?4 g* A1 b" etemplate <class _T, class _Tstream>, g; N( q" M( O
/* _Tstream: inputstream, _T: get return value
. l, R$ O/ i3 | J# a* x* Return nonzero if get value successfully */' U( {3 G" U+ A& v0 M
int GetExpValue(_Tstream& istrin, _T& nReturn){, d& L4 j0 b+ J5 B6 t- }5 g2 P& f7 c
_T t[3] = {0}; //雨中飞燕之作
! G6 D& C1 m1 @8 b2 [ char csym[3] = "++";
6 ^9 ?( i$ b# e* c7 S9 c' a& g- D. _ int nLevel = 1, nERR = 0;
* n6 y4 [& @! t. x# N2 R+ w B if(!(istrin>>t[1]))istrin.clear();- L: k3 \' Z+ S- r' ]3 l; b7 x) q
for(;;){
8 C& o% o) ?4 n if(istrin>>csym[2]){9 Z2 C% X& ~1 x. C8 H5 K( U
switch(csym[2]){
; n5 r6 x$ y& c; G! M' ` case '(':
8 \( P$ q; a7 {4 V if(!csym[1]){nLevel=0x100; nERR=1;}else: w& S1 F* e: v' l4 x
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, a8 W2 `$ I) l
else{nLevel=0x100; nERR=1;}
8 U. R. f. X7 U% {: h, Z* p2 ? break;
8 `9 M2 m* [, ?: K, Q case ')':' M# X1 s( p& s' T* b7 F. q5 P( r: M
{nLevel = 0x100;}break;
8 h$ _5 e. A; M: U, I case '+':case '-':case '*':case '/':! B: |7 ^+ L. ]- }9 d
{csym[nLevel++] = csym[2];}break;3 T \+ l6 v, _
case ' ':case '\r':case '\n':case '\t':continue;
Q$ @# G Z6 U4 g2 {+ M- w2 R default:6 r) t- z5 m+ d! F6 d" c6 ?) N
{nLevel=0x100; nERR=1;}/ ?7 S" F0 H2 k/ `2 t
}
* }2 E; R% f. W [. g/ ?7 E h2 s if(nLevel==0x100)break;
' I7 h( H3 }8 y6 U if(nLevel&0x10 || istrin>>t[2]){6 g8 P6 T7 N. n" g
nLevel &= 0xF;
% O: O# c6 A4 J* z% c% M if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}1 l' N1 X" g" q" f, W
if(csym[1]=='*'||csym[1]=='/'){
$ n7 u7 _; H7 @, |8 G# i6 G9 {9 ] GetExpValue(t+1, csym[1]);
2 {7 O+ _: R8 ]/ r% C }- C/ v. O7 \5 _5 l! J3 z
else{( q9 M2 _: [+ |1 ^
GetExpValue(t, csym[0]);% p4 h8 C7 o+ D
t[1]=t[2];csym[0]=csym[1];csym[1]=0;# x( L( d5 ?' V. Q4 e8 n
}
% ~+ ?. H7 J* k nLevel = 1;
. W% U6 Y/ _1 j% N }. E! u4 d, v; a9 l+ r% `; v
else istrin.clear();- [. X) R9 l$ ]( z6 j, U
}% V# o6 C- i. t
else{nERR = -1; break;}. J Y( r! j: V( Q! I0 i
}
; M/ m2 o4 R% `* Y4 v1 L% b% {, [, m if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& L* e2 L# e& s else nReturn=GetExpValue(t, csym[0]);3 l3 R1 B$ c& d% d3 }( a
return nERR==-1?1:0;+ T. J6 c; M4 ]; [! o9 n) S' U, d
}}
- t4 b' M% K3 F( _
% M1 {. i5 j) S8 U- Q
2 K/ o& @: o9 a, V" _9 b6 [' s* O$ E9 L" r7 n
函数模板使用示例:
1 c% B+ Z' r% M6 D在以上那段代码的后面加上以下代码:1 t& v& S( \9 M& `6 v: q
( |/ A" d! K7 J' f 9 r! J& C, q: X1 S) ?9 n+ Y
; K! S5 ^9 O% J- G7 i9 R: r% m2 w* D程序代码: 8 d7 P. F6 x9 h
$ n4 [6 O9 m3 g, O! n
#include<strstream>: F2 c) Y" E9 y1 B% m* k+ D8 A
#include<iostream>3 R* L* {1 X. Q/ i- F+ M
#include<string>
" v$ l- H4 Z. v9 musing namespace std;
1 `+ _/ l$ ~: iint main(void)
) j& _( @7 }; @- ]# K{
4 a( {& J/ F2 I* D string s1;9 X" N. @$ w3 D) a+ {
while(cin>>s1)
* b3 H; V: ?" x' Y8 e5 e) n {1 f& r. s% L B: S, Y+ I
istrstream isin(s1.data());: c* t+ N+ @( h B( V5 F' q7 A3 k
double d;
6 A- @$ W# x V" [5 R if(fy_Exp::GetExpValue(isin, d))
: ]2 K4 |. g2 n( s8 H {
0 o9 w0 z# |7 k5 b& d& y# ` cout<<d<<endl;
1 G: O8 @- S4 t, a) b5 o }
3 X+ Y# h3 D5 u2 }$ S else
- U: g& Y* ?; b; ^2 T {
( P/ ]+ e" G6 b: F cout<<"ERROR"<<endl;6 f3 D% a( y) G& d
}
0 @+ p4 ]. R, Y4 ?9 l; Z+ d; t }* q& X6 x6 @. s' G; |$ B
return 0;6 f6 _7 W4 h: Q
}
" P7 o$ q: @3 M- _8 \& p/ E* F J) j4 }
4 r2 _. v0 r# V2 Z* j& v然后编译执行就可以了(*^_^*)
- u" x" D) J9 T! s3 i" N3 O" \其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! h; }/ ^4 ?* Z! l. \# M* O 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|