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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
5 Z" ?1 g4 @1 x4 \: F; E一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 _7 o2 X5 M6 n2 n- C% K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn). u; n" z1 {4 t7 J A
参数解释:
. B( Q$ e7 L! u8 H Mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
) Z# k. w. N( W& P3 hnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( r" p9 F8 u' e- ^ ^0 Z {
返回值:( t" w( T4 ]2 ~0 F0 P
返回非0表示计算成功,0表示计算失败有错误4 R2 C* Q2 M+ |
* f1 e$ a: q6 j
# x; j$ \1 P& p, I* F1 w5 D
% p4 B6 T* ~. M0 T* z. y! {程序代码: 3 F Z) T! O+ K. b. W8 w. v* ]1 C
( h' T* Z; W/ Z8 d' N" U0 V) `
namespace fy_Exp{- u/ D2 ?6 c6 O4 D$ o5 T1 i
namespace {template <class _T>
6 U9 M, r* t, Sinline _T GetExpValue(_T t[], char& csym){$ P3 l9 }% Z" t) R9 c+ u
char c=csym; csym=0;
! O, a, P' b/ ?( X' F1 b switch(c){, z3 _# s: o1 j
case '+':return t[0] += t[1];" }7 {6 v |2 g$ g
case '-':return t[0] -= t[1];
2 i8 E9 \' O' T4 r1 V% U case '*':return t[0] *= t[1];
9 Y2 q9 G! ]& C* I default: return t[0] /= t[1];//case '/':) S2 ] h- [/ S# O) v* a5 [
}; }4 h# t3 {; Z0 X2 W, ^5 j8 N
}}2 t" b6 b) m* M8 O- v/ r/ \4 Q
template <class _T, class _Tstream>
. w% O ^% k/ T" j& e/* _Tstream: inputstream, _T: get return value# z! _; {0 T4 ~) t( G+ V
* Return nonzero if get value successfully */$ U& k0 h. D6 O
int GetExpValue(_Tstream& istrin, _T& nReturn){( C/ [+ B1 b* C- s8 w$ u0 [+ b7 N+ l! S
_T t[3] = {0}; //雨中飞燕之作5 M2 f( Q, `+ w+ T/ F! C6 W; l6 K
char csym[3] = "++";/ a9 K: N4 t: R; z3 D; C
int nLevel = 1, nERR = 0;5 U, l$ ^7 J& y! B/ k) f. I
if(!(istrin>>t[1]))istrin.clear();3 ]8 E! h: i7 c5 |0 J q" z
for(;;){
z) d0 X+ W& m" {% @3 a0 O- w7 G2 Z if(istrin>>csym[2]){: Q! t- W0 q) x6 n; ~8 p- w
switch(csym[2]){
: z5 @! ^1 Z( [3 E case '(':5 l& k p+ P% G; \$ m$ y, s( y
if(!csym[1]){nLevel=0x100; nERR=1;}else, I4 L8 J: ~5 v1 Y+ a/ U
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
" t1 d* h) Z, J- u else{nLevel=0x100; nERR=1;}7 c U# j1 x! u$ _9 p7 n
break;+ Q# {, G P5 @
case ')':
4 a9 u6 g# w7 w$ e {nLevel = 0x100;}break;# y9 A/ x- b9 U" C1 u, y5 h
case '+':case '-':case '*':case '/':% d J& l) ~" r! ~; R
{csym[nLevel++] = csym[2];}break;
2 s. V2 i6 A$ l' C case ' ':case '\r':case '\n':case '\t':continue;2 t) ]; p! ]' Y! ]* K U
default:5 e: W# t" J" {& ?. n/ B: f7 V
{nLevel=0x100; nERR=1;}
# L4 g P! }+ `- G6 j6 ` }; T; l5 |% O/ Q6 G' w7 ~7 u* C6 f
if(nLevel==0x100)break;! ~, E* W8 i7 O7 T+ x! b
if(nLevel&0x10 || istrin>>t[2]){
0 F, e Q9 J% _7 c; s8 o3 o nLevel &= 0xF;2 [% S4 H: x3 W4 V+ k O3 m$ r) @/ t
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! r! O: D7 M0 Q9 f
if(csym[1]=='*'||csym[1]=='/'){
2 }2 J9 X) H1 L7 q: V GetExpValue(t+1, csym[1]);
% t7 x" }5 {8 F- W% e# T; E7 T }2 l$ j: j, K9 Y% M; D* G4 Z" p
else{
$ z ~' t3 X4 D: Q GetExpValue(t, csym[0]);" [0 B Q( ~/ ?( y% ?* C: }
t[1]=t[2];csym[0]=csym[1];csym[1]=0;- Z9 r% z3 ~& x: Q
}
1 w7 D1 W r9 F; B- C nLevel = 1;- q9 h' e% n4 I8 q
}
0 b" t2 q2 ?6 I V' t2 Q else istrin.clear();
% A7 Z0 F' l" I, G/ `) _% x" V }$ c6 C; v$ B! a
else{nERR = -1; break;}
) Y* q% ^. L4 N# V" w: ?1 B }% x8 a/ m3 ~% m. g
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
- c5 C1 I; \" p$ Q' w else nReturn=GetExpValue(t, csym[0]);: d# J C/ U; @8 R
return nERR==-1?1:0; ]4 Q6 }( f* x6 \4 v( h
}}/ A: B/ L6 ~! p7 E6 G
! l0 J% [/ S! n
9 i/ R5 X A( A2 Y
1 @5 g; P( |" ]5 Q6 p函数模板使用示例:
1 [ f: Z; D1 B9 w- r* a在以上那段代码的后面加上以下代码:
6 F: u& X! H& V6 Y/ ]8 c% f5 W9 m6 F
1 I Y" Z* X# P. ?% h) i6 s
2 f. R: v O, t" H0 h0 z1 I程序代码: * o$ w. K0 U$ s
. m- l5 R) @9 K( l8 b* h
#include<strstream>) M0 m+ d4 F/ S7 {0 I, v
#include<iostream>
' j; U( y7 T$ w9 T1 M) |7 X#include<string>
4 N( ~. r$ m3 rusing namespace std;
' Z) O+ x% [" v0 M4 o2 T5 Z' }! Q4 F2 gint main(void)6 b; Q7 ^* d: t' v
{- e9 I) y- a$ S$ o1 y w: W- Y
string s1;( _3 o; c8 U! G9 G. L* X# O5 ~) l
while(cin>>s1)
8 v4 a4 n; z- R" H5 f5 k* j {1 x+ b; H5 I. c
istrstream isin(s1.data());" U# v0 A3 S( x1 q' J
double d;4 Q" w3 B' A- V' k- y
if(fy_Exp::GetExpValue(isin, d))
' U3 B3 D2 n! b% y0 q {! ^& ?& r6 L. I
cout<<d<<endl;
3 M) q5 C8 R5 Z }6 S) {. _; s/ R3 ^0 n
else
" C) [& S; v) z3 T2 G% V; E {
" \1 T* Z& k8 {9 y+ J( ?" q' d cout<<"ERROR"<<endl;
1 X }; @5 Y8 z& a3 q; ~7 I' y }* L4 d5 g) c g2 H% k
}
$ V4 C& _, h+ ~0 S: n% } v% @ return 0;3 L6 T9 g+ C% S) {7 @# W# W+ D2 _( ^
}
3 `1 s! B- v, O1 A: }* L" h
+ d2 B9 ~0 M% k# U0 v4 S7 P% W! f- w5 o
然后编译执行就可以了(*^_^*)
0 H# F/ D" b5 B其它:TC++上一定编译错误,不保证在VC6上也能通过编译
. X6 w' H$ Z# l! g 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|