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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,( v3 ?" m' o# Y9 o6 ^
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' @& Z5 i3 G0 ~! a/ S5 w) J
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" K! p* J* \" p _+ e: \4 {参数解释:8 T0 x _3 ~ O9 H4 q0 U( X0 V1 L3 X
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 M! ~/ A) [6 m- w" B: X
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
u7 H9 {0 g2 u: B$ s1 T$ Y返回值:) q* F' S+ m: m9 I) l
返回非0表示计算成功,0表示计算失败有错误
g' k' d: Y: K# ~: e1 |0 ? g& X4 x! S1 I
# f X5 |2 K+ U) f
. E8 @' ?+ [' w0 g7 m) A: V5 E
程序代码:
+ W- r4 n0 p k! T4 T" K
/ q5 D' b- v$ ~8 q7 i6 \namespace fy_Exp{
! q. [9 C- N. n; _5 Dnamespace {template <class _T>
6 } p4 h }/ I5 W* o) P- Cinline _T GetExpValue(_T t[], char& csym){& V2 [! S' o) S; v4 [
char c=csym; csym=0;
: y Y5 E/ ?3 P" g0 _" v6 j3 m Y switch(c){; G: E) f/ X( L# |) l
case '+':return t[0] += t[1]; S/ E6 q$ A! S' K! u5 q' R- [
case '-':return t[0] -= t[1];! P+ ~/ H; S" b" k& T- ^
case '*':return t[0] *= t[1];
# j$ t! j5 y1 _( u6 t5 x default: return t[0] /= t[1];//case '/':$ {: c& a8 e9 ?# _! w1 D
}9 J& ^% n: p- F- ~
}}
) P) h1 a0 a$ u0 R$ itemplate <class _T, class _Tstream>
6 D9 @. b& g7 u+ M2 J/* _Tstream: inputstream, _T: get return value
2 \ }% o( }/ O7 U4 y7 ?" Q8 u* Return nonzero if get value successfully */1 K! u" v p3 d) G
int GetExpValue(_Tstream& istrin, _T& nReturn){( O& ]2 y0 d6 A* F! T
_T t[3] = {0}; //雨中飞燕之作
i( j" a. J6 j ^ char csym[3] = "++";6 J' R4 o* u' J0 K
int nLevel = 1, nERR = 0;, q: B# y) g3 f/ j' y
if(!(istrin>>t[1]))istrin.clear();/ G+ b$ D* Z2 R0 f2 @
for(;;){9 y% N, k5 c! g1 z, P) ?
if(istrin>>csym[2]){
2 k* u6 T( L6 J switch(csym[2]){7 s: i7 E5 B; M
case '(':& c8 J8 [$ h4 H6 B
if(!csym[1]){nLevel=0x100; nERR=1;}else
& R3 l; h5 i0 K* U1 H- H if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( a+ G) m/ @2 |
else{nLevel=0x100; nERR=1;}, n. L4 g! j" r" N- I
break;
. B7 u. S6 [ J1 f4 ]; a! q' O- U case ')':
# g; z g% W, E {nLevel = 0x100;}break;
& q, s: [9 `9 J& G case '+':case '-':case '*':case '/':
2 j; }, T6 }+ B* z8 v _3 Z {csym[nLevel++] = csym[2];}break;
% N' E: D% o4 M9 p' G0 c3 m case ' ':case '\r':case '\n':case '\t':continue;
* J5 ^* ^* y$ \3 O default:* n- b. m: t+ p. h* `+ A
{nLevel=0x100; nERR=1;} O t) g; ^/ S8 c+ ]$ ^) S6 t z2 b
}! A# r& |' k# N
if(nLevel==0x100)break;2 v. R4 i1 o1 _9 @' D( M9 {& S; d
if(nLevel&0x10 || istrin>>t[2]){4 T) Z' H3 \! K# i& l, _7 @
nLevel &= 0xF;
3 M+ W1 O+ {" x* ` if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}1 V. A8 b: _% I
if(csym[1]=='*'||csym[1]=='/'){
7 X2 D2 ^% m: c7 J; L GetExpValue(t+1, csym[1]);
; _( s/ Y; i5 K% X1 f3 [# K }
' r7 F; K, o6 \ I& j7 \7 p else{
2 g# A$ H" r% ^: k GetExpValue(t, csym[0]);
# K$ C5 f" \- S) z) S4 a) A t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 \& M7 P; r R" h7 K/ X3 x }! U% n& h4 c- q, L" `6 [) n
nLevel = 1;0 V" `: D- Q2 [; b
}6 M( |. v" d* r3 R! s- J: J7 y
else istrin.clear();/ O6 e# [1 Z6 U$ ?( x
}
9 m) g( ~1 Y* Q' t* n else{nERR = -1; break;}
+ [4 i% l9 u; w: Q& Q5 c( B( B8 V( } }) ]; h9 l" l3 C- ~
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
- {7 X1 r! ~7 q: m+ o( t) t else nReturn=GetExpValue(t, csym[0]);; U3 e( i" S1 T3 `
return nERR==-1?1:0;! X7 M4 ^: ]4 w. b* K
}}* ? m S7 T8 z2 V: W8 F8 i
" ?5 t! H# U7 N
' `4 E. u" A1 J6 P
- d- i: o" o$ O8 M+ E; h6 @
函数模板使用示例:
9 a) _) |/ D1 G在以上那段代码的后面加上以下代码:9 n* |& q- I. e$ m5 {
% ?: ~1 l! k# {/ a$ H0 T& @4 d
! o3 x# U" c& y% J: l
; J3 M5 m3 Z I- A! J, e( ]9 @, m
程序代码:
9 P5 c7 \& p8 t, {9 l* s( a- }- Z) f
#include<strstream>, `: J5 C N' Y5 Y5 r
#include<iostream>! `/ r! U# C; A% K
#include<string>$ v7 X! |. p6 D) I
using namespace std;
& x# I3 y9 y9 x/ ^# J% A, E0 _int main(void)
' J4 G2 H9 e/ N: p0 Z{
7 u- q- I% q! K) x string s1;' z* D7 B" [1 h" t" ]* g8 U
while(cin>>s1)
+ R1 M' Y+ Z. F; E( |5 l {$ @" `( O2 {5 Q
istrstream isin(s1.data());
: K* y5 ?4 W0 f7 D; y& u double d;
N0 V+ w4 A5 @, |, k# A if(fy_Exp::GetExpValue(isin, d))9 S" J) r' C0 Q3 b. M; X, u. {
{
9 B' ~' h5 {; b6 D0 v cout<<d<<endl;
D; Y- H2 k' v: T- k G7 j }
' H8 _! i3 Z) a) h- V3 b0 l else; h0 ^' t+ X( c7 B* r6 c2 A
{
% _& T% a, u$ }! Y& x W cout<<"ERROR"<<endl;- n. @% Y/ T4 h K
}1 r7 D/ F# x& Q% J- Q3 n
}
- s5 {$ x0 y+ f9 b$ E4 J6 T return 0;
* ]7 X; d: Z" E4 j; x}- t8 I+ Z$ J- g3 w7 n0 M
2 z5 A. d! _0 ^
* T' V s& S) U然后编译执行就可以了(*^_^*)+ ]( q1 [) E( f' u0 n8 F
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* P' X6 ?' P* x9 W- r, K 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|