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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
7 u3 m. `1 J7 U* L6 X3 H V" N1 b一个很方便的函数模板,可以并且只可以计算含括号的四则表达式6 X3 w! [0 U8 N) i8 D" \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 C0 `; L: V, [. j- w( L% @参数解释:! a0 L6 B+ P# K4 A
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 H% n1 k( W5 d2 s% \0 ^
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定! F* W5 g8 i) u. X# `
返回值:2 G& B$ X& v; C+ J+ w( u
返回非0表示计算成功,0表示计算失败有错误
* s, [7 M s2 L( m1 _9 o5 B
' r# X( ~. r* A6 K. F( m5 |* ]
0 N3 U0 v; ]' p0 a' `/ T0 R! n. U1 d! h6 E/ X0 P2 d4 a, A9 E
程序代码:
3 u4 G! T. Y$ V J# n- B) I$ G* B# ]
( e/ R3 d% `; k4 g& G( R0 Dnamespace fy_Exp{+ w7 a- |9 j5 G+ z% V# P
namespace {template <class _T>6 _) T. ^5 u) }1 a+ ^
inline _T GetExpValue(_T t[], char& csym){1 A+ @# o& |9 }% W9 J' |
char c=csym; csym=0;
* \8 D% p* r6 m1 n, z) P switch(c){! T* U# Z2 W: g7 i
case '+':return t[0] += t[1];
9 G- _9 A7 S3 x4 Y$ a case '-':return t[0] -= t[1];
' o: a4 ~" f6 I" B N case '*':return t[0] *= t[1];
, o) F% h/ J' Y9 y/ n default: return t[0] /= t[1];//case '/':
9 a6 Y+ p ~( u! U; W% C }
2 n& X9 R" j# y1 I/ G}}3 t( y6 N, R7 S
template <class _T, class _Tstream>
7 Q+ V0 |4 q- P( L" Q" q3 F/* _Tstream: inputstream, _T: get return value5 k5 n0 T8 E s
* Return nonzero if get value successfully */
; W- f4 r! J f! Gint GetExpValue(_Tstream& istrin, _T& nReturn){
6 d) F& m5 P5 I6 j2 { _T t[3] = {0}; //雨中飞燕之作
. z" d8 c; Z, d3 G$ e) Q char csym[3] = "++";
; Y( ]9 x( a$ E& _) t& V9 s# [ int nLevel = 1, nERR = 0;! d( `8 y) B7 }" ^, V2 `
if(!(istrin>>t[1]))istrin.clear();2 A2 m$ Z) k' C6 k3 ~
for(;;){; W7 A+ Z/ i/ y; J' d
if(istrin>>csym[2]){
0 ]6 S+ q% C! M1 h5 q+ G switch(csym[2]){* i- a* z1 Z/ m. a6 { g, s, s
case '(':
1 C/ M" ^7 F( @1 e, j9 S if(!csym[1]){nLevel=0x100; nERR=1;}else7 l y8 Z# b, e% J) m% k- V; C
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 Q% S0 x6 F, @/ c/ i: x+ `& A
else{nLevel=0x100; nERR=1;}
# Y" P& X/ D, p- d r$ u break;3 ^' b$ m9 d6 q2 M' _2 s
case ')':
" O8 t# X- V8 `! W* P( Z7 m2 e {nLevel = 0x100;}break;$ J0 l+ q/ J; t
case '+':case '-':case '*':case '/':
$ @. Y3 k& |8 U( ^, R {csym[nLevel++] = csym[2];}break;& b/ i3 I& C/ W; P, L9 M. X
case ' ':case '\r':case '\n':case '\t':continue;
& `( T/ r) h$ k9 Z- b% U2 ^ default:
* _: p) ^8 Q8 B! e. S1 i+ ^ {nLevel=0x100; nERR=1;}. v3 F* Z) \2 J s1 R. m6 O: d
}5 c# G% N( R5 ]9 [; T
if(nLevel==0x100)break;4 g/ {7 p8 ]/ P8 v7 U' f) o W# Y! J
if(nLevel&0x10 || istrin>>t[2]){1 t2 R5 O: w: ^; O6 _$ ]
nLevel &= 0xF;
& b) D- W( s( K if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! o& U7 @* e7 N; B. h
if(csym[1]=='*'||csym[1]=='/'){
- ~* [- h# `2 c GetExpValue(t+1, csym[1]);6 b& Z% X; g" |4 P V0 \$ h
}
- |0 u: v! ]6 o z else{- Y0 E: k5 t$ W+ o u
GetExpValue(t, csym[0]);: U8 O; Z+ {- o' {0 d" {
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 U( C* s s" O* g$ s, M }
* p5 l( \$ g+ I M: p nLevel = 1;/ N- D! z! C0 P" t/ F
}
; \3 p* p i y7 {- }6 k else istrin.clear();
' `" H$ l4 V8 A* F4 }4 f) c* m- c, z }
- a O N: I' K0 t A( A else{nERR = -1; break;}
. `6 {# b0 h& O" O& q: } }1 f7 b8 z% S3 y. m) l
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ v5 \" ^: m- A5 f7 l' B
else nReturn=GetExpValue(t, csym[0]);2 \' K) M' d' ~2 ?5 ]& `6 j
return nERR==-1?1:0;* @/ V( M1 v& [" r% o6 }
}}" K1 r \! _9 T2 N# E) Z, ?- J/ i0 B/ |
5 l9 o" J6 L# N; s9 B- {: Z
$ l$ u5 }& R6 ~' W0 r8 x \6 ?5 E- U- b& g; D, G
函数模板使用示例:
6 _+ W# p9 p, F$ p( k& o/ K在以上那段代码的后面加上以下代码:0 R' D% D4 F! g+ O$ v/ `( x4 s
; x+ f+ z9 w1 X! W; e6 M
2 y, w+ {6 S0 _/ Q
6 G' g' s0 Q8 l9 a% X! o
程序代码: $ \. j* Z) j& U( G
' C5 W3 p9 ^7 k. @* N4 \
#include<strstream>$ D! R/ n$ v0 |: z
#include<iostream>
. _$ H) U# k! g6 v#include<string>
! N1 v. N2 O2 susing namespace std;
& N8 e: k) g; y& i, Nint main(void)
/ P) W3 `0 i6 p3 G( }% |. l2 M{
+ M9 `/ t6 @7 |- `& l$ I, v string s1;* g8 i3 k' q% Q, `0 w! Q
while(cin>>s1)
7 N& E5 b F: ~5 W; i7 W {! p( r% D' F; ^) w0 e- C
istrstream isin(s1.data());
$ m. t" n# \' T! _% Q5 U double d;3 O9 o* p7 o% R" G5 R; j7 A* \
if(fy_Exp::GetExpValue(isin, d))
, b7 a) P/ i t& d {
* M. ^5 G+ A, @4 M cout<<d<<endl;
: L' }4 r+ `, H4 C' v i$ ^: b }4 y9 I- Q i; A$ E
else
+ \5 z7 w# P6 e: V7 L {7 {6 `8 b. P) w* R* M
cout<<"ERROR"<<endl;
9 W, q1 {7 f5 ]* g1 n2 z }
' F! G: P* T& `% C3 K& J8 q }
; X0 w/ w, X! I+ ]: H7 q return 0;; N; B8 t) U. {6 j9 J$ W! ]
}
% A+ F/ B0 G- }5 R4 A0 K
( ^- _, e/ h" e T$ s
* b% Q* m5 [* K/ O7 p% o然后编译执行就可以了(*^_^*)
* t0 \: v' q: `+ `+ c其它:TC++上一定编译错误,不保证在VC6上也能通过编译* d7 m: @6 y; ~3 i' v
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|