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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,) d3 |, J8 G2 ]. a. A
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! U5 J8 D2 W# n, N; m3 {, K9 j
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)* J; I& c" k& G- \
参数解释:
8 `) z1 j$ q2 l- H C5 M; g0 N% uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流 f- n; P7 Q7 h! [% M- ~* C
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定# R& k# |. z; h+ v" Y; v f
返回值:6 x) \& n7 S" m) D6 h3 E
返回非0表示计算成功,0表示计算失败有错误
6 D! ]5 D7 T* [; c6 b, K6 l2 m! y; W' }# q* C9 I: d
$ F: R6 Q3 | S2 @# P& u, b7 j
( G7 t2 Z. X0 g
程序代码: ( f5 N% L9 f3 z% ^4 R
" }( h- h! Q* |6 c& ~namespace fy_Exp{) w: W, v, K4 g0 _- c
namespace {template <class _T>. g3 Y! S4 [2 @, ?' o
inline _T GetExpValue(_T t[], char& csym){5 F1 H9 B* E! o4 I2 o# r
char c=csym; csym=0; ]) q" {% u, \' t
switch(c){
, m' `( O3 P+ f case '+':return t[0] += t[1];. e- F7 f/ _( e* \8 ^; u2 l
case '-':return t[0] -= t[1];5 c; [1 ^2 P5 H% W& N7 g
case '*':return t[0] *= t[1];
# b( s- G) ~' [# K8 r+ z; L default: return t[0] /= t[1];//case '/':8 |9 B) Z* G. w t
}: R% x( t# t3 s. m
}}3 D/ k# i g, J+ s7 l: ], U
template <class _T, class _Tstream>
3 A" I9 m+ U6 O0 a. c' b( w( W! l/* _Tstream: inputstream, _T: get return value
6 L, F# {" W: v# H* Return nonzero if get value successfully */
+ ^4 Y; m! D8 ^& ~/ Kint GetExpValue(_Tstream& istrin, _T& nReturn){2 u- C. _0 P( h9 y; z" e2 ~" Q: r
_T t[3] = {0}; //雨中飞燕之作. h2 p7 q# W/ i* [
char csym[3] = "++";
: E' n4 W) ?2 u: S1 E K8 w" j6 i int nLevel = 1, nERR = 0;
: w9 x, B, D; M if(!(istrin>>t[1]))istrin.clear();
" l4 Q, Z; P9 \1 a1 R0 a- t for(;;){
& s) e* S) w% j1 U- a if(istrin>>csym[2]){
+ x% q! ^' g$ m0 ?' O, _; S" c switch(csym[2]){, i ]( C+ L0 B0 L, g, I5 M
case '(':, q3 E' `/ b( V/ |3 n9 M( C
if(!csym[1]){nLevel=0x100; nERR=1;}else- S+ L* ]9 A" b
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- R" y; u4 N! B, ? else{nLevel=0x100; nERR=1;}, |* l8 ^6 v: e- j' l9 q
break;/ B, l$ j2 W- I
case ')':/ t! R6 ~0 {: C; {" z
{nLevel = 0x100;}break;
# ~/ M6 X* e' C9 q" T3 g* E8 Z case '+':case '-':case '*':case '/':
+ S. R" t, h4 R4 g {csym[nLevel++] = csym[2];}break;; x. G( b- ^2 w/ R* `
case ' ':case '\r':case '\n':case '\t':continue;, G/ N- Y& A' m% O
default:
% T" ?" J3 T- B+ G {nLevel=0x100; nERR=1;}
* X/ X7 Z' N% @, m* S$ _ }' x8 s1 e+ C. b* w1 z1 r9 y% S$ M, t
if(nLevel==0x100)break;, e; {' t+ t/ R; ?2 f1 j
if(nLevel&0x10 || istrin>>t[2]){3 O6 ]1 i2 ]5 P5 N Q9 d* w
nLevel &= 0xF;" X/ X# s- x9 Q8 o4 C
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}1 `: m( {" f7 E/ f( [2 I' Z
if(csym[1]=='*'||csym[1]=='/'){) T: d S* l5 y; W5 g
GetExpValue(t+1, csym[1]);
8 `: A) Q4 l* p+ r }; f- ^% O4 K( [: X8 m, ~5 v
else{
" U: S5 A9 U! O6 n GetExpValue(t, csym[0]);
; H1 p9 ?8 `3 h/ a! Z: K9 h7 v% F& e& A t[1]=t[2];csym[0]=csym[1];csym[1]=0;1 p; G5 g# V4 g5 Z! K& v
}/ r, F9 `2 _9 R2 w4 { b; y
nLevel = 1;' E4 P2 W) V7 K- g2 q! u6 w% M
}- |- i* D1 W) j9 A
else istrin.clear();5 y5 L2 e' A; {. O$ V
}
8 q0 u/ |8 ^, _. Z$ G7 t) p else{nERR = -1; break;}
/ S" U' P+ l" S6 d3 l% a1 w! L% v }2 p* w6 v. \" F3 \( t6 n3 L
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. o: H" Q( u( ~: V ~ V3 n else nReturn=GetExpValue(t, csym[0]);2 E, C) F3 S6 Y' V* D8 |6 w: Q5 F
return nERR==-1?1:0;- |$ L$ ?, C0 P5 T. P) R2 D/ M
}}9 a7 `+ p/ J$ r' ~. @ ]
/ N2 W$ m2 h' W3 F4 a6 Y/ o+ J
3 v, L$ v0 K1 \+ [- O
' r( K0 @/ H: H" a, Z9 { @5 M5 I函数模板使用示例:6 A% f) \3 N+ O+ G, n" B2 s
在以上那段代码的后面加上以下代码:
# \9 Y( A( y2 ?+ Q4 h
6 o2 b- \) S ~* e; B ! m$ Y/ b# |+ |- g; Q7 Q
& T" G2 q/ n0 U+ J程序代码: ( n A! P4 u3 K( U8 a$ I
( Y9 Z7 k" Z8 G( U' b& r
#include<strstream>
7 d) A1 {- \; M! @8 s#include<iostream>4 b9 o) v+ D" U7 V. z& c
#include<string>
G) W- A$ m1 G5 w9 i) h1 z/ L$ Qusing namespace std;
( [# N" [) a7 P: m& R8 Xint main(void)* I7 y2 i* p. P2 K3 @9 A" X6 |
{) H7 i5 V& \+ L1 e3 R0 Q
string s1;9 o0 z* T1 l1 i' U0 ~
while(cin>>s1)
* E4 U0 I, U. P( p3 S { Z5 @/ x0 U5 ^- e
istrstream isin(s1.data());: f" G* g% ?' |9 \
double d;
s& J# m% p3 i9 ^* A: G if(fy_Exp::GetExpValue(isin, d))
: t- m/ W! A8 W' y# A5 ]8 I! Q6 V {
8 @# K$ g7 G% f1 V9 | cout<<d<<endl;
2 y7 ?6 U X/ x/ s4 t8 x }. |9 ]1 `1 B8 L3 O5 h# k
else7 ~+ E% _/ Z" v7 W% T
{, ]& N1 T8 Q* }2 U2 q8 m
cout<<"ERROR"<<endl;
% u9 F b7 W; p% F }* a$ F( `; b; ^6 U
}' L. B) T9 U) g. h7 E+ o* j4 W
return 0;
' {4 D0 F; E& e}# o$ a, d2 m$ ]
6 o+ d2 ^, ~ i. I0 F0 `$ J
# i- w- ]/ D" u7 ]6 `# L然后编译执行就可以了(*^_^*)5 n/ P9 ^- J7 c; y2 M1 P: [( _
其它:TC++上一定编译错误,不保证在VC6上也能通过编译: e$ O; h7 }$ O! L8 b
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|