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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,1 _/ l+ c% p5 _; C( O: g J1 `
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式 t9 W* r2 O* ~- K/ `. j7 M2 L2 `
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% q7 h9 H- f, f* U% g参数解释:7 a" b H1 k( l9 S3 q3 D
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
/ b0 Q' e9 I- M8 znReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定 T7 a! n0 g9 w
返回值:
# }( A+ x5 G* a- T' W1 o返回非0表示计算成功,0表示计算失败有错误% S" k, `, {/ j* f" y# P
/ @( t8 ~) X6 x2 c! @
& h+ O2 ]. I, e" g# T+ p) o4 I1 {0 K
程序代码: 9 m$ C- V- y6 ^1 Y: G+ Z5 Y% e
5 W( |% Q( S) S
namespace fy_Exp{' e5 D; ]- C- `
namespace {template <class _T>
1 Y* m' w3 O& W* yinline _T GetExpValue(_T t[], char& csym){$ ]3 I0 q3 n8 d1 K5 |9 T
char c=csym; csym=0;
7 N3 P' z7 H7 i; b switch(c){( I$ h2 k. m+ w8 F
case '+':return t[0] += t[1];4 q# V: z. y/ ?" @8 P; I
case '-':return t[0] -= t[1];
, x8 T, k/ u0 K; Y& | case '*':return t[0] *= t[1];9 l) w2 k4 G' F7 B7 U6 m
default: return t[0] /= t[1];//case '/':
: L+ _6 N1 a% U }
8 N+ D: f, @ T}}: N+ \- r }* J( [" x2 ^
template <class _T, class _Tstream>; G8 R# M' q4 M$ I
/* _Tstream: inputstream, _T: get return value- o( W" b, Q3 o6 G9 c
* Return nonzero if get value successfully */8 i4 ]& d2 S7 k& e( o9 ]. B8 c+ c
int GetExpValue(_Tstream& istrin, _T& nReturn){3 v2 L9 s- |6 y0 C* F! \
_T t[3] = {0}; //雨中飞燕之作* z8 _; p! t$ M1 K) ^
char csym[3] = "++";
% r7 M. g; C+ {9 a* C9 Y int nLevel = 1, nERR = 0;
5 |( `. S4 x( p1 L if(!(istrin>>t[1]))istrin.clear();
1 e y% X9 j& q( b/ N for(;;){
: j, V2 t* |( H" h$ W2 M+ J8 p if(istrin>>csym[2]){
7 q6 R6 P3 i/ A b switch(csym[2]){
9 ?+ K! a; e+ W; }; A H6 G case '(':) j) Z( q, Q$ \, r
if(!csym[1]){nLevel=0x100; nERR=1;}else
! F: d$ _3 R3 S0 x8 k2 q if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
! i/ m, v9 S3 @% N0 l& u7 v( Q else{nLevel=0x100; nERR=1;}, g3 D& X1 b& p4 ]1 @7 N
break;: F: I2 Q' ?; @9 J- Q6 r4 g
case ')':
; w4 g, k- o2 h9 z( v {nLevel = 0x100;}break;
; v% O9 c1 e' q* y: p' [5 D% A case '+':case '-':case '*':case '/': j0 B* h/ U, M9 I
{csym[nLevel++] = csym[2];}break;$ w: g# x) C$ P# M U$ i
case ' ':case '\r':case '\n':case '\t':continue;
) a4 d" G, _: L" |( O default:
! J: O7 ^" \$ y, {# A- @' E: X: D {nLevel=0x100; nERR=1;}
; T5 U9 g, e H+ S# ?) g9 H) ~' t }
0 R6 X% ? |: n if(nLevel==0x100)break;6 P/ b$ G; m3 r; j- H* b. I* ~
if(nLevel&0x10 || istrin>>t[2]){% {( x6 f L3 Y9 y+ {- L
nLevel &= 0xF;
" i6 s4 _6 W0 [. @9 T5 }* P b if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}1 `3 h' t% i6 l- n$ w, q" C8 |
if(csym[1]=='*'||csym[1]=='/'){
1 q- b) h; g0 \( W, n9 ] GetExpValue(t+1, csym[1]);7 X3 b {) C6 E1 |1 Y2 y( s
}# H' O6 F; t" L* f4 u- Z
else{
) W# d: X( w0 \+ K6 b$ y' I! A1 O GetExpValue(t, csym[0]);+ r6 z, ]5 t: `8 O4 V8 M! U
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ g0 F# R+ {- l- [ w% K }
5 a; L+ `* I: L3 R, n nLevel = 1;
/ w, b- b& l% ]: y0 w* m; \ }
2 Z$ ^8 _/ i/ g/ V# q2 z else istrin.clear();& J/ s! {+ X- ]' K' T: z: P# V# j
}
5 h; |4 _ t5 I0 [0 q else{nERR = -1; break;}
# n/ O5 O; v, n1 h, u: {! d }
, B- e( E; X' F8 H( l9 i* D' M if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
+ c0 m8 u, e' t5 L1 U else nReturn=GetExpValue(t, csym[0]);
1 ~7 L. l+ [, X I. o6 ] return nERR==-1?1:0;( J$ X) Y; n. R2 s9 D6 ?. ]
}}3 L/ ^$ w4 w+ z q& Q1 R! k
& j$ c9 D( b" O4 Q& ^/ t3 ?
( J: d' _; s* ~4 H, A; T; q
4 {- A" n1 \* S' c函数模板使用示例:% l* U" h# V( C# y) T
在以上那段代码的后面加上以下代码:
7 ?* b" x3 @ X z* t6 p e6 p, V/ T: U
. e/ T9 Y' ?0 @/ e( |, D9 N& I# `
p g9 k8 u. m, a( p Q5 ?+ @程序代码: 9 l) e' T5 @% k3 R) b; L4 p5 c3 J
. s* p1 E+ Q& k) \0 k$ R& x#include<strstream>6 H9 M% H! L% d5 Z1 P
#include<iostream>
9 e8 }- r: Y( \+ S& h#include<string>: U% e/ z/ }6 S$ H' x
using namespace std;
P" j x( ?9 a# Y5 r: m- tint main(void)5 u) \9 K8 R4 i
{0 v1 m0 ]) g1 F3 v
string s1;
& M7 H! k9 h5 G+ h while(cin>>s1)
' H% a: a8 W9 ~% @ {
6 }$ d$ g+ t0 b4 U" O- H9 ] istrstream isin(s1.data());- R. O# C+ \4 k4 O8 M
double d;
: E$ H% ?" x$ ~0 N- U/ X) o5 e if(fy_Exp::GetExpValue(isin, d))
; i; Z1 r' F9 v$ Z {
2 R4 n, ?# o% u; G8 r cout<<d<<endl;! g" d! B% v5 j' p) ?0 a
}( ^, e- Z/ i) e, f5 x/ U; {3 U4 J
else
& r/ q8 \( ^/ K( a+ `1 [2 p& Y# }, E {( b7 ]1 {* ?# \; W6 v( }1 F) g' d
cout<<"ERROR"<<endl;+ r2 T ?$ r3 i4 }
}% x& ]# B; h |/ O& x
}
+ x' }# g$ s9 X- C9 D% V( L: C/ g return 0;
9 B* R+ ^4 @* ?' w- c}
* ~8 v- S+ q( F8 |' m- j: E$ N N) J& n( P- F$ s* y/ j7 [9 I! }
$ q$ o) q* ]4 y* m. _然后编译执行就可以了(*^_^*)7 q# s: h# y9 G) q& F; K8 C
其它:TC++上一定编译错误,不保证在VC6上也能通过编译. K% s8 { P5 B4 ^' R
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|