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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
8 C6 \, G h) R" n0 @; d2 N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& C( K: P' t) A# j$ N0 C: a只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' G3 }5 l& ~. @% ~: }$ l
参数解释:5 ^$ t* W* M4 K- s
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流. r" S$ k: [ v3 z9 E" z) e G
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 j+ i3 K _3 u* y: k. Z
返回值:4 i$ z9 F$ x1 A9 f3 h3 A/ v( s
返回非0表示计算成功,0表示计算失败有错误
) Q: G+ I" q/ o$ b/ q; Y$ `- X+ m
8 d0 ^3 c4 W- t; p0 ?
% M' D0 S7 A# K1 }, C. y% b V
程序代码: 8 v2 s9 j7 H. g% _' i$ o5 a
- Z* @& Q5 X! D; X# M, ~namespace fy_Exp{
7 N2 P: I: R8 I5 ~- lnamespace {template <class _T>
6 ^6 C8 o; {1 p) x. @inline _T GetExpValue(_T t[], char& csym){
! J" S Z" T6 G9 N" `' q# L' ~0 Q char c=csym; csym=0;: U5 t/ |: X$ W3 G$ W
switch(c){/ \7 s4 x$ G( a0 ^+ i/ c
case '+':return t[0] += t[1];
, V% F% N4 O S& o case '-':return t[0] -= t[1];
; m$ J9 V, ^! O2 h case '*':return t[0] *= t[1];
; U, r! G! \+ _* K: j default: return t[0] /= t[1];//case '/':
& O3 T. _* B5 p% v }% l- W/ ]' k* o1 z+ L; s1 H
}}* r/ f# X$ l/ J
template <class _T, class _Tstream>
9 F2 r {1 |8 h! l! \( x/* _Tstream: inputstream, _T: get return value5 Y1 S4 i" ~ K% q& q8 O" H7 j7 z
* Return nonzero if get value successfully */
! d k* R' r3 L: Lint GetExpValue(_Tstream& istrin, _T& nReturn){' d5 P( ]8 R1 l3 R
_T t[3] = {0}; //雨中飞燕之作
+ R- z; @/ L- V- n \; \/ H char csym[3] = "++";8 E3 H f0 O* d
int nLevel = 1, nERR = 0;6 L, s; l1 Z+ H, R/ ~4 S- L
if(!(istrin>>t[1]))istrin.clear();2 X* S$ u' C+ `' O1 Q
for(;;){
1 ?+ i8 B9 R/ j( `7 \ if(istrin>>csym[2]){
, H$ c6 a: }5 r9 O! y% { switch(csym[2]){
2 N$ x. {/ u. K4 u1 { case '(':
1 f/ c5 H( F) U+ R# c S if(!csym[1]){nLevel=0x100; nERR=1;}else6 S7 b( v& `4 F- P9 I) z4 w% x& |, {
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' ^/ ~9 j, `# X! g+ u& M* F4 \ else{nLevel=0x100; nERR=1;}
# m9 s1 [- \: h$ x/ i break;8 L/ C* `) x: G' c+ F+ _4 B6 c, u
case ')':
7 ?4 |% G9 }& Z0 J! K {nLevel = 0x100;}break;9 s7 _( J$ p; c3 R
case '+':case '-':case '*':case '/':
! L% A& c# P+ }) f6 o1 | {csym[nLevel++] = csym[2];}break;5 P. l$ y- ?* j$ b9 E
case ' ':case '\r':case '\n':case '\t':continue;
# ~7 U' m" Z' a" Y4 G default:
# b9 \( V9 o! N& N- A; L* u {nLevel=0x100; nERR=1;}! s5 y; o4 ~% u* T( G% _& a
}5 `9 `" k8 L' j' \
if(nLevel==0x100)break;6 C' O7 c& b0 W& a, u' N
if(nLevel&0x10 || istrin>>t[2]){9 X: a" r, }: D* w) A
nLevel &= 0xF;
' w3 @; z+ q6 j1 T if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}" x% ]; j$ n% n. L8 @
if(csym[1]=='*'||csym[1]=='/'){
! l v; O( I: y7 g. c GetExpValue(t+1, csym[1]);
6 i0 R7 O0 R; [ e }
9 }* `6 ?/ O2 ~$ p+ W H9 n" Z else{
7 g9 n! l2 z* } k6 h0 | GetExpValue(t, csym[0]);
4 ?0 ~, V4 a4 ]. u. _. q+ b- m t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 a6 v+ K* X% B6 A5 h
}& b: C( V5 x# E8 I. B" f
nLevel = 1;. \! B3 q; J0 G2 Y6 O7 l O
}
) Y$ q/ y6 y7 n1 D9 ` else istrin.clear();: i! T) w# f) p( c! V2 V2 b
}+ P" Z8 o' n( \+ T! U. D
else{nERR = -1; break;}/ D' o! C9 z) [% Z
}
3 j% j9 R9 e: G- r: e' I% r if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 l7 ~$ X) C% y$ a6 v else nReturn=GetExpValue(t, csym[0]);5 y4 p7 T! J8 ?3 p% Q- W
return nERR==-1?1:0;* n# p' B/ E. Y6 \ d) J
}}
6 q. z: M6 \: q4 I5 w2 J. r6 T9 |2 ^. i2 U
8 Q I- Q$ G+ u% z r( }
% q% m4 _- b+ j5 t [函数模板使用示例:1 m1 z4 ?9 k- d" A( w8 j4 G
在以上那段代码的后面加上以下代码:
5 b: `9 J+ z, S$ a* g$ e7 p0 H: p
/ I' g" ?) R7 Z8 d( i
+ @& C, n! Y# |1 [
8 V" f( d" t1 O程序代码:
( L) p0 _8 ^: r7 h
6 w" z' _2 A; M3 B#include<strstream>
2 w: S, h5 V+ U) t* O#include<iostream>4 n3 m* i9 ^. A( [/ P. g2 Y
#include<string>
) y- K$ t( C3 L- ~, zusing namespace std;6 s1 L+ z! a! `# w, ?$ e$ x
int main(void)
5 @9 m2 L" e, n, ~6 h: R7 a{+ w0 t4 ^" G1 X; y: G9 r z2 Q
string s1;
1 l1 U+ s" N% m% k" Q; K7 z while(cin>>s1)
' q9 O& H$ D4 t% a1 j8 g1 g, _+ p {' X) W! t0 y1 F
istrstream isin(s1.data());
& p2 O5 n% f( d double d;
$ F* ], F; I' X/ D' { if(fy_Exp::GetExpValue(isin, d))
+ n; L; b$ c: d- U" M {( v0 Y q. f' v9 j
cout<<d<<endl;% ~6 [, m* w$ g" N5 U0 J( ~
}, Z: {3 G% g* \/ i% Z! [' w- {/ h) o
else' m1 ?: A/ X/ y' y. c. o( V
{( Z, ^$ p$ |6 j, f" I4 P- N
cout<<"ERROR"<<endl; }$ {: G% [% ?% K; j
}
5 f0 r0 x/ u7 N4 Z: _- w" v }
6 `0 R% Q! k4 i. a0 k return 0;0 T) u3 U, y6 B
}
, R, _1 P* g2 b, x* c1 i6 |7 j$ [1 |6 d, R% l( p
" }- b; Q' P" N6 u0 y- Z然后编译执行就可以了(*^_^*)
8 ?9 m [% h& W+ h$ T) W其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 A7 ~ Y" R6 u. h3 c, f
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|