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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
# \' C3 r) b8 Z: x) V& c6 I一个很方便的函数模板,可以并且只可以计算含括号的四则表达式, A6 Y. Y# ~9 e
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), E7 R6 }! f }* S& v! {3 R0 [/ m
参数解释:' J# H" J: P' s/ A6 S7 p i
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% ]7 s; f: Q8 B
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 ?. z7 a$ ?! ^7 I! M: K3 V返回值:. W6 @1 g" J) X$ K7 W
返回非0表示计算成功,0表示计算失败有错误1 ` l; R+ i4 X) [/ I
5 Q# u9 [9 ?* h 1 t) E) V0 f. N0 {* [5 C* [
7 K' i, N- y/ c+ m5 I! F
程序代码:
5 \' @ v) r6 i) J5 T, y5 {2 V
4 ?! i7 [ c9 n' [) F# _namespace fy_Exp{* N- u1 ~5 v& h! X% E6 l/ d8 X
namespace {template <class _T>
5 C# C/ A2 }3 d0 L: K8 Sinline _T GetExpValue(_T t[], char& csym){4 ]- f1 f: O' d8 L* S% o
char c=csym; csym=0;
: I0 f, b/ ~$ i: I% ]' d switch(c){! ^7 f! _1 {# O' ~& v: o4 A
case '+':return t[0] += t[1];
" W ?; W' e4 v9 F* L case '-':return t[0] -= t[1];
/ v f; j- B7 n case '*':return t[0] *= t[1];* w9 P* l3 q" W
default: return t[0] /= t[1];//case '/':2 e/ `1 U" B5 A
}% x* Q% d- a/ {2 P4 w
}}* U" ?% }1 q2 S
template <class _T, class _Tstream>6 R# U3 l7 U' U" C5 \
/* _Tstream: inputstream, _T: get return value; I& q% r7 u" f% R+ V0 w7 L
* Return nonzero if get value successfully */* A! ]6 ^1 E' r! P+ O0 M K
int GetExpValue(_Tstream& istrin, _T& nReturn){
. k! o1 B" J( E _T t[3] = {0}; //雨中飞燕之作' L5 K$ Z5 M8 e: q4 M5 g$ O
char csym[3] = "++";* r& ?6 z& @: h! X
int nLevel = 1, nERR = 0;& T1 p: q; O& P4 ?! g, A
if(!(istrin>>t[1]))istrin.clear();- @- A* ~: w0 h- H4 E8 b
for(;;){* ?4 f% B2 Q% Q: c
if(istrin>>csym[2]){
. Z; Q3 M( I3 m( I2 K; g switch(csym[2]){
4 \5 x& S3 j7 J* }! t case '(':) h" q) Z; }' f" d7 r
if(!csym[1]){nLevel=0x100; nERR=1;}else
" o; E. v) X' G' b if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 {' c8 P7 J& D/ b: b* e else{nLevel=0x100; nERR=1;}
8 O/ h, f9 p4 W+ [' E* g% T break;
0 ]4 Y( U$ F! s" k case ')':" s0 H$ u& R, m" y; O, x! }
{nLevel = 0x100;}break;5 j+ ^# q( H& P. x. O2 o
case '+':case '-':case '*':case '/':% \% {6 n; a; A* e0 A* w3 ]: e
{csym[nLevel++] = csym[2];}break;
9 x, C0 Q% J$ v, K1 y. D0 I case ' ':case '\r':case '\n':case '\t':continue;% M8 h% b; D& T4 l2 w
default:
+ ~0 S7 i0 F8 l! H$ F0 j {nLevel=0x100; nERR=1;}
1 z# J F* p9 Z. L* _( Q# K. U }
+ @9 x0 K% ~! i3 T if(nLevel==0x100)break;
$ r' Q0 [* ?- ^4 l+ Z- j5 z1 S% f3 n4 Z if(nLevel&0x10 || istrin>>t[2]){: @. T) T, y: y% d
nLevel &= 0xF;
; `# ^7 N, ~* J9 U F if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 `9 l0 N j9 P2 K" x3 _ if(csym[1]=='*'||csym[1]=='/'){
/ d9 [+ Q) A1 Y2 b0 N% A0 H GetExpValue(t+1, csym[1]);- _5 }3 \" }. `
}4 V7 W* F* f: D9 h
else{7 H" ]: _+ D' _- u* \- ]6 X
GetExpValue(t, csym[0]);
- ^# H- R m% K2 d- H5 w. l t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 ^9 s1 u) f1 v# m: ^ }
6 H" Z L, q. L% E3 ~ nLevel = 1;% ?7 P& Q; t, p& z$ Q7 G% z
}
7 G0 N- D U6 ^- O else istrin.clear();
+ x$ h' ?% [0 ~# B! z/ ~ }
9 p: W$ {# @; N- P$ l" z4 ] else{nERR = -1; break;}
& \3 J1 w7 V( c! U3 O' z0 f; ~* X }) t3 B# M& P3 p
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 f6 B7 x- |9 {1 `9 r1 b* l else nReturn=GetExpValue(t, csym[0]);& E1 m. w6 J% S( _" x
return nERR==-1?1:0; Z6 q% E) t' D' [
}}3 q% r4 J+ `* b1 _$ G
- c! I! g! B" W. U8 t5 s" A
% W$ ]9 W* z/ r; R
* k+ j: e; D4 e9 s1 {) a函数模板使用示例:! w; E" |+ m" t1 Z: D
在以上那段代码的后面加上以下代码:
0 }+ z, t, w7 o6 L, p' y0 ^) S( n9 G# `5 J! {3 j
( h* g: l. |- ^7 p. q! O/ V- Y
8 T2 y, u1 w! L( L
程序代码: 2 Z3 g4 u" d5 m7 e& u3 C
% `/ S% Y6 B" w3 Q" x5 R4 Q#include<strstream>
; Y) ~8 l) o( d D! Y1 f#include<iostream>* a. T7 c* c1 J) ~8 k/ ~
#include<string>
1 z* u/ h7 n. D* [. uusing namespace std;
( J5 @% a! l3 {# }int main(void). ~# {2 N6 c' i1 K4 m
{" [9 f! ^, Z5 t5 f& T0 X0 `# E
string s1;8 U7 t, ^+ C0 C1 [& `/ e; z3 f, c4 O
while(cin>>s1)
9 ~3 m% `1 R0 V6 ?6 S+ ~5 p2 r1 q {
1 W7 o5 `! u( h5 I& l: c. b1 Y; n. W istrstream isin(s1.data());; _+ S1 |$ H4 _5 a6 E. i0 X
double d;0 |! S0 L2 H. f8 A; M. X
if(fy_Exp::GetExpValue(isin, d))
( ~. S3 W; y0 N* c: D2 D; u* c {
( V5 e: c2 W) m, ? cout<<d<<endl;6 ?/ ?' z) E: p4 O' v2 P! {
}. V1 [7 X# O9 U: z- g
else
# z7 S; ]0 {3 _5 r# f C {: n1 `1 g: j% O$ h6 K+ ^7 A
cout<<"ERROR"<<endl;
1 W! |# F4 I# M6 i: P }
( w: z8 w' w: f: L# M* _6 \ }2 G" r1 ~0 d; g5 F0 u8 p
return 0;1 A, ?; W- R2 R: J) K
}
5 Q; R" J3 V X, @9 S0 g0 V( L. }; F+ B
9 s; _& X' h* h
然后编译执行就可以了(*^_^*)
: b# V# t0 w7 T5 c# c其它:TC++上一定编译错误,不保证在VC6上也能通过编译
' U3 n* V- I) N2 d! s6 D8 Q 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|