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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,( q: E+ Y+ t9 D
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
- z! p" p4 u$ K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)8 P5 p' ^( L- I {; U) S8 s
参数解释:
/ Q5 z1 N( i: m: `istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流, }: @2 j) m8 u9 ~
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 u! E% ]' m, y3 n, R5 R# X% [1 q
返回值:
9 t) F* n* [ C返回非0表示计算成功,0表示计算失败有错误 u0 s9 b' b9 ?9 p. {" R) E
9 L! P. _) b$ c9 {2 Y9 B" h ; a+ \; V# \; W" Y2 B+ i0 v: P
- F; q6 K" t( ?1 S& J7 N
程序代码:
1 O$ j. ^, H5 V* U8 _7 C7 s' |9 _% e. x4 m; g( S% d0 \% F$ X& k
namespace fy_Exp{
, b# A6 ~) I8 r5 i2 P$ Bnamespace {template <class _T>
0 w4 b) |0 s) u; |/ O/ I, ?3 a) j/ Z& Cinline _T GetExpValue(_T t[], char& csym){* o' Q: Z. a+ ~7 O
char c=csym; csym=0;4 `" Y N3 j1 _
switch(c){
; o) }% h6 Q! E! q3 f5 T4 ~- j case '+':return t[0] += t[1];
7 |0 d1 m) R7 J- j/ P; @! ^: h! N) @' B case '-':return t[0] -= t[1];% r8 B; |' r1 x$ e N
case '*':return t[0] *= t[1];4 D' M9 j1 n4 E3 M/ U
default: return t[0] /= t[1];//case '/':* K9 _6 Z$ M/ `+ X$ P9 _# f8 _
}
8 W9 e" o0 a9 _9 v}}
9 d8 p: \7 u2 Z- h, n! P6 o: [template <class _T, class _Tstream>$ J! x" ?# Y/ @8 V4 d
/* _Tstream: inputstream, _T: get return value* G5 L' W% O7 F/ g
* Return nonzero if get value successfully */) M. r! V: L, _9 `
int GetExpValue(_Tstream& istrin, _T& nReturn){- N) J, A- x& q9 w! V; Z6 J
_T t[3] = {0}; //雨中飞燕之作
" x3 G, B; ]$ Q" Z char csym[3] = "++";5 M4 L- ], p w+ w! E0 J
int nLevel = 1, nERR = 0;
6 W; s( C' g7 c* a if(!(istrin>>t[1]))istrin.clear();8 ?3 }4 U) j& I6 U1 S% d1 L
for(;;){
+ ?; ^8 @/ n/ C7 T5 I/ g1 {# l" Q7 | if(istrin>>csym[2]){! s5 F' b+ G: A4 [1 N
switch(csym[2]){
8 K' o; k! A0 g case '(':2 ~5 Y' ~- o: Q6 e
if(!csym[1]){nLevel=0x100; nERR=1;}else
$ h! C& Z+ O* M) C7 p if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: e, I+ ]) J5 H% ?
else{nLevel=0x100; nERR=1;}
; u$ }9 f% X& e2 c! i1 R break;3 {% r2 }6 F( [/ w
case ')':
% H- Y: X0 N1 m# a P2 U$ V9 g5 _ {nLevel = 0x100;}break;
5 v5 a2 H5 f' R; K case '+':case '-':case '*':case '/': W+ G' f- j$ ^& p' g' i8 t# h
{csym[nLevel++] = csym[2];}break;3 S# q: E# u) A% a4 q0 k3 g
case ' ':case '\r':case '\n':case '\t':continue;
- I5 p3 f7 w3 k, p9 n6 o default:# T. ?. w5 Z' b# ?' T5 m% g
{nLevel=0x100; nERR=1;}
$ N/ L& W; {4 j6 E3 R6 ^6 |' O }. U0 O* E; ]+ {) v0 z
if(nLevel==0x100)break;
7 E1 W G9 _5 W0 B if(nLevel&0x10 || istrin>>t[2]){( j6 w. q' |2 C9 z" ^8 A5 y, S
nLevel &= 0xF;" m8 c7 s* ^9 z" }3 V
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 i; \. ~. I! \6 m6 s5 `2 T( \/ V- \ if(csym[1]=='*'||csym[1]=='/'){/ s6 T9 j2 J' s. D
GetExpValue(t+1, csym[1]);
) T1 \* |, b( ^+ O0 B5 |4 G) h }3 G$ m7 ~& w% k# s* m: W1 W% c
else{
6 i& V/ s3 b" S/ X$ B1 |4 \% X+ C GetExpValue(t, csym[0]);
2 \ E" t7 Z: @ t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 m0 @7 r( z0 W# b
}' E, s! M8 g- w4 |' n
nLevel = 1;
; { L( M# n _, i }' y% C) a) ]) L5 d
else istrin.clear();$ L k; n8 L3 X
}+ a6 j) }8 g" K# b# r
else{nERR = -1; break;}9 f1 Y. k7 Q7 u! n
}
. e2 n9 y" ^+ {( a4 {" p9 f1 o if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);6 [) `7 E- i$ F3 X8 ~0 C
else nReturn=GetExpValue(t, csym[0]);
5 h9 [" D' O8 c return nERR==-1?1:0;
! l& M1 i! J1 Z6 E" j3 e! i}}, X0 k9 g" N8 X0 t7 |0 j6 r* f5 u
1 z" K3 M; F: E4 d+ J7 X& V2 \% ]+ I" r2 b8 _/ x) a
7 e& m$ E) s; i9 V* \+ v5 T
函数模板使用示例:
- E8 S' }$ o9 e( k5 B在以上那段代码的后面加上以下代码:
8 n. u0 n8 C! E i' S) Q/ @1 |9 D* d! r# e' Y( O. ]( f
: J: n- B8 x, m% F5 N) Z( }) S
: ^1 A0 |; b$ c. n$ {4 a* H3 r程序代码: + Y+ g( R+ b6 x6 u
) }, r0 v- Q% A; Y! [: P5 ]#include<strstream>
2 d8 G- x! \& r#include<iostream>
p; A9 W2 u0 {- W#include<string>
, F7 I* D, }7 \using namespace std;; b) u: b) \/ ]+ i2 G. c3 e
int main(void)
+ ]" ~, d' r' P5 ~; G. O# q{" U$ K1 J2 Y7 R' X
string s1;
3 s" T2 H0 X( Y J$ g; c0 L' k while(cin>>s1)
' M9 e$ k' L7 z, u) ?- x {7 s; Z4 W9 N7 a! J
istrstream isin(s1.data());
: t) I# O( c. V% d8 l double d;
7 U# L" l0 h4 y9 C% H/ ~" N \1 S+ | if(fy_Exp::GetExpValue(isin, d))
0 p2 z3 b4 ]$ c8 E# g5 W$ l2 g {0 b# O% M5 [0 n7 C+ ~1 Z+ N
cout<<d<<endl; s" v( d) K% r
}
# c7 b3 f) E+ X! m# f2 O else. \1 ?) m/ S0 \5 n
{
: R0 Y6 x' b. V0 I H N9 R! E cout<<"ERROR"<<endl;, j y# R1 z T
}
" W3 j6 q! z6 t9 Q7 G7 ?! I2 q* h }0 [' X6 _; U! x/ C6 T% y
return 0;4 \7 d9 K( {5 a6 d' I6 m$ z
}
S7 q/ M' a* b5 {( S
, _2 P8 r6 t% h& O. d$ U9 ?: {9 s$ X- \9 W5 p
然后编译执行就可以了(*^_^*): N+ o4 z9 I4 J2 a+ A* t
其它:TC++上一定编译错误,不保证在VC6上也能通过编译. Y, U+ N' D& A: I/ W( n3 q
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|