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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
) m' p: E: L W( _一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) Q. v( b! q' u$ i只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# [4 d7 ]0 u3 G9 f参数解释:3 x& y6 u2 F. ^9 P1 P3 y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* s" s8 x: R% ?3 x& o
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
/ y; W: |" J( X: v8 M5 @* x8 C返回值:8 Y7 H: F' a( w! d1 q s+ I: ]# U
返回非0表示计算成功,0表示计算失败有错误0 Y$ y+ j2 ~1 u% p' r) @- i5 ~
+ j$ o4 r! t9 p, j$ Z
6 w! F: y9 Y4 S! |$ P% y
& O* W* G7 k7 h! n( ?3 W, [1 D- E
程序代码:
% e7 D2 J, T6 [# b- P7 K5 `" v5 G) V; W, s* W2 u8 \
namespace fy_Exp{
% `2 Y- ]; y+ A3 Z/ ~9 ?( }namespace {template <class _T>
% l, [6 c7 n$ e2 U" H4 Yinline _T GetExpValue(_T t[], char& csym){
) B {; }7 V& K" _2 G W: t char c=csym; csym=0; i S5 `3 G8 o) x. v
switch(c){# A4 \) i* p. i- T2 u; q' f' C
case '+':return t[0] += t[1];5 h9 U0 @% t, h5 i# s
case '-':return t[0] -= t[1];
1 Z/ J7 \9 f0 T! s8 }3 Q1 i case '*':return t[0] *= t[1];
0 L: X9 |5 E+ x! Z: ?9 u default: return t[0] /= t[1];//case '/':
" A, r8 v! t. \ }, G; k' `2 c4 ?/ a5 c" `2 T% l( i1 S
}}
# h2 O( c/ y B$ jtemplate <class _T, class _Tstream>
6 `* m) C6 V1 t* Z$ e, T) }6 L |/* _Tstream: inputstream, _T: get return value
9 s' @& H1 u9 S: H" ^) T; @- c* Return nonzero if get value successfully */
: T: ^. f+ S l+ P# |# o+ U. xint GetExpValue(_Tstream& istrin, _T& nReturn){
3 ^( V f) {4 k9 \/ B! }$ H3 ^6 x _T t[3] = {0}; //雨中飞燕之作
3 p% D3 m2 [3 Z8 y: F7 L char csym[3] = "++";
* C& [; ?7 G2 k7 L int nLevel = 1, nERR = 0;7 n. v$ x$ H& T* M1 e
if(!(istrin>>t[1]))istrin.clear();+ q- E7 T/ |2 f7 d
for(;;){& C. ?2 P2 V$ S. `% d
if(istrin>>csym[2]){7 M! z" S- r% i$ }6 ~+ U7 P; h
switch(csym[2]){ i% B7 u. V. s0 l
case '(':
) t- @# Z/ E. U! d0 Y8 E3 Y0 o if(!csym[1]){nLevel=0x100; nERR=1;}else
5 t4 Q% T7 F" [+ b3 ~ if(!GetExpValue(istrin, t[2]))nLevel|=0x10; R# G9 u+ g9 Z: f
else{nLevel=0x100; nERR=1;}1 j" Z6 T+ j# ~9 u
break;1 i' L3 h1 i( m7 M/ Y: j9 M
case ')':& x/ b! Z. ~6 ^
{nLevel = 0x100;}break;0 Q1 F q5 Z' }& N& j7 r+ D
case '+':case '-':case '*':case '/':
9 Y+ l4 L# P& G m1 P9 h8 | {csym[nLevel++] = csym[2];}break;+ \$ M6 U) W& L Q2 L* ?9 E5 |
case ' ':case '\r':case '\n':case '\t':continue;
' ~) O0 D) L4 G% \% P default: o: \! p9 J5 y0 {8 G$ M8 g
{nLevel=0x100; nERR=1;}1 m" W7 m0 A u0 B; I$ l5 T6 `
}% w/ q. [- D# l
if(nLevel==0x100)break;
. c/ _7 j7 ]/ r( l if(nLevel&0x10 || istrin>>t[2]){: |1 B/ B2 L& |5 M8 A$ J6 X$ B3 T
nLevel &= 0xF;7 k0 H- x t5 c, W1 R
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 t7 a5 y) ~& N3 P( t" J1 g. j if(csym[1]=='*'||csym[1]=='/'){
8 ]2 d; U3 b; { GetExpValue(t+1, csym[1]);
; w- f3 a- G. I% Z- D8 @: b. N }6 T. S: {2 ^# [/ I" B, ?) [
else{) x$ j9 L. x5 m. F( t( p& W
GetExpValue(t, csym[0]);4 t) {0 C' S+ r
t[1]=t[2];csym[0]=csym[1];csym[1]=0;) m |/ R6 K' l' c! n5 i/ ?0 }' F+ s" I
}) k# F: B( D3 x
nLevel = 1;1 ?* q3 ?) y7 r" O- G
}) a/ Z' @& U! M2 T' ~, P, ^ T7 ^
else istrin.clear();' g S2 I) K- w5 T& ]
}
3 `3 b0 Q5 Z3 ^. b7 c else{nERR = -1; break;}
( y2 E3 [5 h+ Q) K7 X7 y }) z n. G7 Z+ b) X+ i' [4 ~# R
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
# E1 n+ X, E1 ?% l6 L, J else nReturn=GetExpValue(t, csym[0]);
6 x. H0 q' Y, [: ^1 Q: u return nERR==-1?1:0;
8 u' m. Y3 E. k: _( w}} [9 M9 E% E2 } L1 p
; V, Y i+ e$ ~+ {9 z
4 V2 D, T% ^( b5 h: ]3 E0 f( L9 K0 P1 \0 A+ r
函数模板使用示例:
+ P! R+ w D; A7 q/ i在以上那段代码的后面加上以下代码:
Q; ?, C$ e3 s; T' s3 X8 x
7 T! V/ f& z2 [& L [- S; @ \ $ w2 e/ [( }& k* L
5 o: O( b6 b6 V# p4 ?; [3 w: B
程序代码: % Z" _% h& C) q9 d1 l% b/ J# }
2 V8 o; v; k1 V4 @" d L7 g0 _#include<strstream>6 _7 _0 E. A- P
#include<iostream>$ k2 l! J( w# C# r; F: {
#include<string>
( |8 j* t3 u5 H$ z1 M$ w8 }using namespace std;
- C4 a, H$ l. ?4 Z E) uint main(void)# J" L: b" f9 H
{
+ J' t0 _) }& Z ^5 q! j* c) Z string s1;
; n) q6 }$ L+ c9 P. ] while(cin>>s1)
- v4 @! l& \$ q {
1 Q# |. g: v0 v$ S3 O istrstream isin(s1.data());
( b! f2 O7 B4 f1 `% N0 w0 D double d;
# `( s- a+ i9 F/ }1 U9 l: j if(fy_Exp::GetExpValue(isin, d))
+ e/ B6 g8 w' Q8 F3 u {! ~0 y3 A3 o, J* v# c( }
cout<<d<<endl;
2 m2 O. w F$ H4 D. M) e3 N: L }, l$ O4 s* v% c
else% r: f3 Q1 c. N: a( G
{$ v. o4 K9 m( g' [1 V
cout<<"ERROR"<<endl;/ _% A7 U$ ]. g8 O, t
}4 G8 V: S8 q5 l& Z9 t
}
9 q7 |7 T- s* k& w return 0;! [" A( e. X. l- {3 L% H
}
; e) J" `8 a% `4 M2 ?6 z) [
% N4 }( ^6 Y* A3 g# f6 V8 w5 X9 g7 l5 y! S" k. n' R1 H, {
然后编译执行就可以了(*^_^*)! e7 f+ N3 Z* q- O7 C; }, [" `+ f
其它:TC++上一定编译错误,不保证在VC6上也能通过编译- V [, A8 A- D+ S0 O+ y
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|