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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,3 l/ E8 v; M1 i
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% J! N, p0 f& Q3 [$ g只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
+ m$ G" H! R c6 G4 b参数解释:
! L! M% a( |! R; E# I5 }istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! w& u1 m: i) j. v E4 x1 Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定$ s8 N$ w K9 S# t. V ]0 [& I
返回值:6 }3 m1 P. k0 S1 W( r
返回非0表示计算成功,0表示计算失败有错误
6 H& d p3 B$ V, _% C8 S$ m1 W: T2 D
7 O, u8 c/ T( K" l * r2 W8 _1 r! |9 x# E% @
! a8 S7 g; j- ]. N程序代码:
- g# M# b m7 L) U
9 w2 n; ]% e7 f$ J- y" C& ]5 T ]/ fnamespace fy_Exp{1 B' T2 ~8 l, Y; w* i" P; I8 V
namespace {template <class _T>/ \1 T, x6 {& n: y6 i7 M% b
inline _T GetExpValue(_T t[], char& csym){
+ ~% |9 @* X7 D& H/ {" \$ Z. e: e6 l char c=csym; csym=0;
) \5 Z/ {& ]7 ]/ H switch(c){7 h5 b. I3 a4 b8 w( e6 V
case '+':return t[0] += t[1];4 T" O* g* \! X
case '-':return t[0] -= t[1];7 g1 x' g) ]- w, a1 G4 c+ Z
case '*':return t[0] *= t[1];
; ?' z# Z# J7 T6 E2 F default: return t[0] /= t[1];//case '/':
/ `! g$ _& a1 D2 M- K }& ]' R6 {$ M: Q4 k! q k0 j' [5 j
}}
U( z( O( d6 Xtemplate <class _T, class _Tstream>
/ j- I5 V& c# R+ g/ D5 ?9 ?- \/* _Tstream: inputstream, _T: get return value4 v1 L6 I$ V: a# u9 R/ R& v
* Return nonzero if get value successfully */
* R) v* I- @* uint GetExpValue(_Tstream& istrin, _T& nReturn){
5 U. a, b9 u" d! j( L _T t[3] = {0}; //雨中飞燕之作
* d* L8 O& U. A char csym[3] = "++";
9 Z0 C( r! X$ p( s3 r" V, z int nLevel = 1, nERR = 0;
2 \8 X+ Y& V% _/ J0 P( F) r if(!(istrin>>t[1]))istrin.clear();
' y' k, p7 X, [3 `, s for(;;){' s- h1 U5 U. L' P" B* p# l
if(istrin>>csym[2]){8 d9 d( P. @1 c8 O+ q- D g
switch(csym[2]){+ Q: x4 m& M% X+ L n6 p' g+ j6 R
case '(':7 m2 i5 E6 I- e" P3 h2 V- P
if(!csym[1]){nLevel=0x100; nERR=1;}else
) ^% t: U$ v {3 a, ] [! n if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, ~( p. I8 O7 |4 z/ j9 V# x
else{nLevel=0x100; nERR=1;}
* O) A+ V7 F; ~. V& \ break;, Z& x* @0 l2 [ H0 E
case ')':
$ Z' v$ M( G2 ]2 D2 I/ v {nLevel = 0x100;}break;9 s# w. H l/ H% `( s _
case '+':case '-':case '*':case '/':
4 z; b8 V: I0 i; r {csym[nLevel++] = csym[2];}break;# d) }/ V$ W+ V5 {0 H
case ' ':case '\r':case '\n':case '\t':continue;
8 L2 g8 G- Y( A: r, R; j" I default:6 \" {' X+ C8 s: ?4 o- v
{nLevel=0x100; nERR=1;}8 [1 V a+ b+ ]; E- E6 }4 u/ [ a
}% R- S6 n; j. x' Q* a1 o+ v$ M- D
if(nLevel==0x100)break;
$ k! \4 f( L8 e if(nLevel&0x10 || istrin>>t[2]){
$ [" R$ L) G" f+ B1 o nLevel &= 0xF;/ m6 P+ ]% B W! H
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 M% R5 s- H: p) g# U* k0 P# O/ X
if(csym[1]=='*'||csym[1]=='/'){) H5 q" _' ]6 l4 H; p+ ?' v
GetExpValue(t+1, csym[1]);
5 [% ^* M/ L6 c }9 V! Q5 O; y0 P( |
else{
6 n7 k1 e8 u+ `: u O GetExpValue(t, csym[0]);! ?( ^! ? H" t4 ^' _5 m
t[1]=t[2];csym[0]=csym[1];csym[1]=0;! e$ l2 d- A3 i
}) X, S# i, y) h
nLevel = 1;
+ f' T l4 t4 O$ Q ^: a }* n; _% a, ]/ c9 U+ k* {
else istrin.clear();
; ~/ n4 _- S$ D8 M2 a- T }% \' l6 `/ \( z4 @( z
else{nERR = -1; break;}5 Y H' C7 F: N, J0 C; R
}
- V# V$ b" W& j1 f0 ` if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 U# c! T* G* H* U else nReturn=GetExpValue(t, csym[0]);) [2 W7 z _# l: j* l4 I
return nERR==-1?1:0;: @* M3 z1 E+ X+ @' G+ {
}}
; Y9 O/ d& o$ m0 J. E9 v3 @) q, R
# t7 `# I3 F6 V0 Z, M' S# k3 N4 _' q; l7 i! }2 j
1 k, ?: F4 E- e; l/ U; P+ V
函数模板使用示例:9 L+ d( Q. N2 V) b2 _/ q
在以上那段代码的后面加上以下代码:
# ]% t% T: {1 l& E3 ~" l
3 v! k4 p' r2 ?" T( S2 u
2 Z2 y/ E& `! P/ T2 ?, E: d0 J* z" c* ~
程序代码:
. m4 L# s0 ?* z/ t5 n x$ H2 m% X7 q7 h/ N
#include<strstream>
) V& u! f9 D f" R! i K( |#include<iostream>
: X! X2 L+ k9 V# ]" C0 p#include<string>
1 c. t9 d. E( A( O7 Y5 W1 _% Ausing namespace std;& i& E- ^/ _- _' d$ j
int main(void)
, s) r- }! S) o2 R- R# a- Z{
" R6 `8 f: r* _5 O4 K string s1;
9 I5 p( E- d: P2 c& } while(cin>>s1)
0 R2 q Z8 j: Q; K) H {
1 u/ @% h0 Z$ t, @7 ] istrstream isin(s1.data());5 x9 d/ ]* Q2 @+ H/ E
double d;4 L3 W2 n8 R) O
if(fy_Exp::GetExpValue(isin, d))) k( F) v6 s( {* A. @
{$ X3 p- t$ h& n# \8 i& Y
cout<<d<<endl;
# c; Z, P% \; U* E0 Z* Q4 p+ D) J! ~, _ }, \2 @2 K. X# A( g
else
" U& f) w1 z9 a5 S, C {
" M* V! E5 y3 o9 C7 @$ ] cout<<"ERROR"<<endl;! N2 u7 ^. b' V9 v# n
}
5 d$ Q+ X9 x6 H }
@ ]( b7 E0 H7 i* n, N return 0;' U7 U$ y# ]" }5 ?
}# X! r) \/ [% |
, a) o1 v8 D! I
, G9 `2 @5 E) f2 H, D* R: [然后编译执行就可以了(*^_^*)
$ D/ V, {/ y9 i其它:TC++上一定编译错误,不保证在VC6上也能通过编译0 i* T5 v, |" ?$ ~1 e) O' \/ Y
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|