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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
) t# T: ^ o+ p+ J [一个很方便的函数模板,可以并且只可以计算含括号的四则表达式 D5 o! S( K2 m
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 m4 k( v" F5 a4 ]% g$ c9 p3 W$ W* ^
参数解释:) _' J7 i! G% ?. K( l$ D& ^2 p& t
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 C6 ^3 n% W0 J+ V9 lnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" q; c# L3 I. v! p+ I
返回值:1 R) C/ P8 s, G, \
返回非0表示计算成功,0表示计算失败有错误
, T( ^* f0 d# J' V& C
3 K9 y/ h( L1 h o F X* `* F+ H . u! r- B' p3 V
/ ~5 j7 Q% Y, c程序代码:
/ u) g$ {' a: f8 g
) o+ K9 p: w d* vnamespace fy_Exp{
* V2 l6 ^3 w7 S8 B1 r! Gnamespace {template <class _T>
- K( m/ e, V4 x( V. d5 dinline _T GetExpValue(_T t[], char& csym){
' Z3 j- B5 C% p, |1 `+ f' z3 _! [7 X% _ char c=csym; csym=0;
( t3 \4 J# W; S0 N( L/ X switch(c){
) n5 t+ P1 |" L8 ]2 u# ` case '+':return t[0] += t[1];
( i/ L. ?4 G6 P, ~$ t$ O case '-':return t[0] -= t[1];& Q9 o$ t8 O; o* K" f; j5 J
case '*':return t[0] *= t[1];: Z3 H* p. A4 n! _# P4 R
default: return t[0] /= t[1];//case '/':
! l9 c7 B ]# m9 C0 ?0 x }! A0 ~+ |( E p& p% P z) G$ j1 g; J
}}: _& n2 D I# j3 ?- o
template <class _T, class _Tstream>
# l) ]* V' c7 Z: K* i$ x/* _Tstream: inputstream, _T: get return value
# o8 ]6 s: E. @7 N) ^: H: s* Return nonzero if get value successfully */& `* Y9 A+ Q0 g! j0 v
int GetExpValue(_Tstream& istrin, _T& nReturn){
% M$ O) s+ O# |9 l* C, {2 ?0 C _T t[3] = {0}; //雨中飞燕之作
3 ~" h; e0 [3 N* \" Z, D, F char csym[3] = "++";+ @9 |0 B: L# }) V# |: i
int nLevel = 1, nERR = 0;/ b2 p' a5 G( I5 d+ N- z7 z
if(!(istrin>>t[1]))istrin.clear();1 _5 `" f r& w$ D2 w
for(;;){8 b$ d9 p! w c# h2 b7 b$ e
if(istrin>>csym[2]){# q: u9 I, D2 A }
switch(csym[2]){
$ f t9 k# r4 u- f" N' | case '(':
6 b, K" H: x8 O" v1 o if(!csym[1]){nLevel=0x100; nERR=1;}else
' a+ E/ w3 ^8 `! E- R& b! e if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
6 g" e P) _0 L2 V2 O9 T/ { else{nLevel=0x100; nERR=1;}5 [. _2 h( P2 I( i, T$ d+ y) L( G
break;' b6 g9 g7 q, R, |- O
case ')':1 Q2 a" S: |1 Q- [0 o6 x O" T3 m- z: g$ y
{nLevel = 0x100;}break;
/ Y) K$ i8 \- L& `% Y, H case '+':case '-':case '*':case '/':
- R/ e7 d) e9 N7 T0 m/ z5 h {csym[nLevel++] = csym[2];}break;
* e( O0 {- D l; v7 x case ' ':case '\r':case '\n':case '\t':continue;/ j' {6 A$ ]% `6 }1 H& |# L) h0 l- _
default:' ~2 z1 z6 e0 A0 M4 Z
{nLevel=0x100; nERR=1;}: r6 g* u5 {' f G* I- ]/ Y
}
% m& N" N+ O# j if(nLevel==0x100)break;3 R% Z) u; O2 {0 k+ f" o6 r3 O
if(nLevel&0x10 || istrin>>t[2]){! C- Q7 v+ P# K# O
nLevel &= 0xF;
: J6 @/ R$ u5 d( m# ^# L' `' Y7 G5 p if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 c/ x0 D! ^6 ~: j) }( ^* F2 b7 E
if(csym[1]=='*'||csym[1]=='/'){0 r8 ^+ k! N' \/ c6 X
GetExpValue(t+1, csym[1]);$ V6 m f/ E4 x; c
}8 q% r' c6 q$ c/ s
else{+ W* Z# G- m$ v9 f+ Y0 t6 D4 v/ D0 m
GetExpValue(t, csym[0]);
5 e5 L1 j& Q) n0 }7 t t[1]=t[2];csym[0]=csym[1];csym[1]=0;
% M. l+ Q' e8 n# S$ o2 ?9 V }
/ X' T3 u3 n6 L0 `% ^6 m" S nLevel = 1;
- ]& ? c0 ^" I% t6 j* n: K }
$ m* }7 _* }" O* Y! }4 R) } else istrin.clear();
/ A4 e5 v4 y: N; v+ u0 x1 [ }$ l2 q2 c' m6 R; w0 l1 t+ q
else{nERR = -1; break;}0 w3 ~( {# a! P: n) \$ A% _, D' q
}6 \! g6 T+ t0 V* \& h' @& a
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 { E# {- k9 x: E5 D! I7 `
else nReturn=GetExpValue(t, csym[0]);% w) _( u+ @. G
return nERR==-1?1:0;
( S3 \" G( \. r# ~% n}}
0 r7 b- `" V: ?
, U% [3 q5 z% `$ H* {1 H; o. ^! r
! e3 Q0 I2 |9 o. `
. \5 r, X1 {& d D函数模板使用示例:
" |: P/ d* b* E, k4 R在以上那段代码的后面加上以下代码:; S' I3 h2 u: }% u' [/ u" I/ n
- K5 ?0 G1 _* m( {
) M! r- ^* X3 j# o9 L" D% }
- [2 A" l0 @0 t程序代码:
- W4 R# M2 [8 G9 E. Q5 O
3 ?9 S8 \3 i$ f0 B" ^& @, V#include<strstream>1 C9 e, {$ L5 U/ Q0 s/ M
#include<iostream>
8 t- V2 ?2 r* W#include<string>2 `' y9 y. D: m; g$ c# f; }
using namespace std;
0 J/ B1 s2 R/ E( ?2 sint main(void)
5 Q/ d y+ ]& P2 R5 G" l& N+ j{$ P0 I* H, Y0 ~2 X; n5 v, R) e9 J
string s1;# r* ^6 [6 S$ Q% m4 O/ B; a
while(cin>>s1)$ p/ N3 j! c5 j7 {* o! g
{2 ?) b% }. ]) H# a7 x* {
istrstream isin(s1.data());
1 Z( X8 Z4 I8 g double d;3 t9 t4 W9 x3 u" U7 g, D' k! A9 g
if(fy_Exp::GetExpValue(isin, d))6 l! f8 y* [, m }* R: k
{
( C) G8 S! q) ]& R cout<<d<<endl;5 E q: K$ Z- I U
}
3 S( y: K) q1 Z1 }# X' W else
H" p& h7 O8 ^& I/ p/ R* k7 l {
3 a4 ?; f6 A, C+ C6 x* C+ d9 g: x cout<<"ERROR"<<endl;
{& k9 k* J/ p7 e }
1 }; n; w& q5 R0 C2 R* i }
) `3 f; }8 g- v- w return 0;
9 @* c+ P; m$ ]2 _. x0 q}5 [( w- C: z( u7 X, u
: |& s" v1 M5 h7 V8 f" D$ d
6 u- ]' D% X }8 t: D" ]9 }% t
然后编译执行就可以了(*^_^*)
L8 m5 b0 a5 `8 I) `其它:TC++上一定编译错误,不保证在VC6上也能通过编译' B0 ^! |$ i' f8 T7 u
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|