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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
$ K( d9 b$ F# c8 E& Q8 r$ N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式0 N# ?# o1 {' M, R: X4 F% y
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)9 d/ g4 f0 h! j! g* ~* Z
参数解释:( z/ B W: T) G# a4 {
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 Z$ t0 H6 ~0 @. s2 j& P( ?" N6 S
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定- f6 R2 g6 n# P
返回值:
+ J9 \) |+ X# T0 M$ T返回非0表示计算成功,0表示计算失败有错误
% U w9 Y. ` G) Y' [6 A5 K1 P1 Z( z
' f3 R& `( V: q: V7 Z 5 c! J# c# P; C/ X/ r+ x; z
1 g+ j& V( p- b- m; s$ B( s. Z# i+ ~程序代码:
* X R! N4 z& `# b+ y' x; e1 }$ ]) C3 v/ h L
namespace fy_Exp{: @9 d/ b' ~ \# A9 [
namespace {template <class _T>
( g% e/ K1 D( F: ]# ]/ binline _T GetExpValue(_T t[], char& csym){
8 `+ E5 w3 E+ g. U, g' G- } char c=csym; csym=0;- n6 {- B7 z9 e9 p5 F1 f
switch(c){
7 P A! r1 T V# |5 b" [2 Z case '+':return t[0] += t[1];
8 x$ s' _4 i$ L, d) v/ F case '-':return t[0] -= t[1];/ i! l4 f( u7 Z" v D
case '*':return t[0] *= t[1];6 M5 Q2 u8 r# A; N; U8 g5 }
default: return t[0] /= t[1];//case '/':- S: y7 x0 |5 U' B
}
& f5 Z6 s" [4 X8 k6 H, E6 v8 @}}0 i+ m2 U& n0 k: S. o% U
template <class _T, class _Tstream>
3 Q d ~" H; [# R3 F/* _Tstream: inputstream, _T: get return value
4 P: C0 J9 p) q- b* L( s* Return nonzero if get value successfully */9 I% g- f" y' j* v* s2 e4 G
int GetExpValue(_Tstream& istrin, _T& nReturn){1 b3 K9 l0 `& v4 j, E; ^# r% {
_T t[3] = {0}; //雨中飞燕之作
0 X" ?/ C4 j1 T- I& G char csym[3] = "++";
4 a1 v. g% b; A/ w7 p int nLevel = 1, nERR = 0;
0 \( |+ d; E9 K if(!(istrin>>t[1]))istrin.clear();
5 b* F* Z3 m3 ~ for(;;){- O% f! r5 q/ d6 o! H+ `+ D
if(istrin>>csym[2]){+ X& \5 _0 N9 p( I! ~
switch(csym[2]){
5 A1 o% w8 D: r/ }! K4 ~1 r+ r case '(':! V! k9 J) d! c. ~+ s
if(!csym[1]){nLevel=0x100; nERR=1;}else
. J6 B. U) C6 S* V8 [ if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
! A8 x$ S5 f9 k& r; ~, ^4 O else{nLevel=0x100; nERR=1;}
5 m l4 a0 X2 y' L) ?& _ break;' A. ^( V3 [& @' K0 b4 I6 C
case ')':
v) x2 J2 Y# R5 D1 G {nLevel = 0x100;}break;' _% f6 O# Q' K. \' X) O
case '+':case '-':case '*':case '/':, K1 E' y5 g3 e5 B" k* ]
{csym[nLevel++] = csym[2];}break;
# A; v( S$ k6 ]' A case ' ':case '\r':case '\n':case '\t':continue;8 l, A$ [9 ]! P# W9 Z9 [
default:
, _0 A( G* d8 Z% n8 Y- C3 j) h% X: y {nLevel=0x100; nERR=1;}
8 r3 C+ f$ v; c3 [/ I }
& C! A7 l2 ~- {+ l7 o- e. Z if(nLevel==0x100)break;) @4 H. k$ _! E: D+ K4 `4 ~ c: p
if(nLevel&0x10 || istrin>>t[2]){
/ B; O% l. o) y nLevel &= 0xF;8 U3 F& c0 N6 O" `, ]$ Q7 G( p9 K
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 ]6 S$ C# i3 b6 y6 ^
if(csym[1]=='*'||csym[1]=='/'){- ?) O2 X# f1 y; g. Z+ Q
GetExpValue(t+1, csym[1]);$ I* O# H0 w) Y) }
}
& x8 P4 H- {! H( y, s! w4 o else{3 ]$ a+ ?: F, Z0 s5 k
GetExpValue(t, csym[0]);
9 c5 s( {6 g) M- c( S t[1]=t[2];csym[0]=csym[1];csym[1]=0;
2 d2 a9 I) Q3 {2 o }
5 _7 s8 z! J5 ?5 ]1 ? nLevel = 1;& [. h) |- S: `- h. y% J5 B
}5 _1 I/ Q' u0 T4 c p, g, W4 w4 B
else istrin.clear();4 p% i/ A3 X( T0 y- j* Q
}
5 r* U% O. | S2 D2 O' h else{nERR = -1; break;}
7 N: R1 ~7 T1 l% g% t% P x8 V }* O& ~2 {+ ]* ?, t3 b5 e8 J h x
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: c( b: M( m* f" t- L" r, _# T else nReturn=GetExpValue(t, csym[0]);
6 J1 ]$ w8 G, Y7 g return nERR==-1?1:0;/ W& Y; a4 c/ n7 \
}}
- W- Z" `4 a+ u' P
1 W- F/ ~( }' U K3 U+ M4 \( k
: U: @' z, K! E, ]2 k- P* @/ S$ h/ d) X4 Z
+ \/ r* y5 a$ B, Z9 T: a0 o函数模板使用示例:4 o8 X$ F1 u( q, M/ _: X
在以上那段代码的后面加上以下代码:
+ c7 T; I0 H0 o. R2 t+ K/ q
' o& c1 x; B, U( d L* _ ' C& p P/ r2 ?" w
! R3 q, q2 K1 S) o- u1 {( U
程序代码: 4 A; s; A7 T* |
4 R/ k: y- F; q' S& j#include<strstream>& J+ m- _2 @" X8 i8 X" V
#include<iostream>% }! C7 I& L/ l+ ~
#include<string>
, m0 g' m$ h- g4 G' v" j8 l! e% fusing namespace std;8 \3 q4 K* H7 T5 F) v
int main(void)
) F3 }3 c* N" U% T: J2 l) ?{
% D d. L( v# Y, K# l string s1;! q, X, `1 t6 L! o: D9 a
while(cin>>s1)
& \5 [, t$ L# T& R5 p& C6 ~" E {4 c7 @( ^9 J4 U& ^) h( H% Y$ E
istrstream isin(s1.data());* }( i c! }( W
double d;, ^7 j1 x9 K o+ h2 H" ?7 y. C
if(fy_Exp::GetExpValue(isin, d))
$ |5 X1 } |9 Z0 X7 w {5 b# F, F' {8 J i& P
cout<<d<<endl;/ c3 q G' i/ E7 f
}
% G' z# v. [ @* @7 H" Y else7 ?/ T* j- m) z% e; x4 L3 l* n+ H
{2 n/ u# J' P, u% O$ V: U) R6 q" T
cout<<"ERROR"<<endl;
# s0 o4 L& B8 G }
u& D* @* K+ C }* M& n, ~5 S- v% R/ v& S! `( i
return 0;4 p: Y9 \+ `/ o5 o% w
}. }6 p) z- ]' B5 Z/ q, A
; }# W( {9 }7 r- |9 r
. n0 Q2 T4 ?4 d3 z然后编译执行就可以了(*^_^*)/ P2 i& Q7 L2 @
其它:TC++上一定编译错误,不保证在VC6上也能通过编译; y! Y) V; R6 M1 k+ L9 Z$ ?
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|