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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
! j7 a2 C" q+ Y% P- y一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- b6 F; f- l1 a# I# D
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 X# g$ w: h3 Y' E
参数解释:* g/ e' V9 p0 v% }4 }; A3 T, ?) s
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* M0 }; A6 r8 o7 t3 ` h
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
, } ~" c" V) S3 Q$ f返回值:
7 H# q) e1 \3 b {" y9 z0 i2 X返回非0表示计算成功,0表示计算失败有错误
, C) z* n1 @; y7 W% w. n
- y6 x& O* V8 d; h
% B+ p0 K2 R9 u: L
v- [( q2 L; X" a程序代码: 6 Q# ]0 V+ `8 a s# Q2 U- @' j
/ a2 Z i; { a# B4 v5 v! ~% p$ Z+ g% H
namespace fy_Exp{8 t1 u3 C: o0 P/ p" a8 Z
namespace {template <class _T>
% g) e3 L5 d' X# y; Cinline _T GetExpValue(_T t[], char& csym){% \. W' E- ~3 M' r* X/ e/ @- N
char c=csym; csym=0;
5 C9 V0 R0 e, w switch(c){
2 P; k" o# C3 _$ v case '+':return t[0] += t[1];
: a4 W' @" D7 R6 c) g case '-':return t[0] -= t[1];; C' U* E6 y, P) n1 T9 z3 K
case '*':return t[0] *= t[1];9 [' Q4 n/ a7 q+ Y
default: return t[0] /= t[1];//case '/':
/ o- g7 k: @+ x" L }8 `# B, ^! O8 T. \) x
}}
) V! @' _8 u* r8 }( d3 j- v3 e$ `8 ~; o% ?template <class _T, class _Tstream>3 Y& y" T3 H, ?0 I' l
/* _Tstream: inputstream, _T: get return value+ Z4 q* t. f- o" h9 o
* Return nonzero if get value successfully */
2 X! G+ J5 C& i1 o: ?int GetExpValue(_Tstream& istrin, _T& nReturn){
( J0 u6 z( A5 ?8 d1 B% C% ] _T t[3] = {0}; //雨中飞燕之作
7 n0 D* v% D5 s$ L& a char csym[3] = "++";/ U8 ~% t/ x8 V9 H; w
int nLevel = 1, nERR = 0;% ]* m6 e( ^ V- _+ I; T
if(!(istrin>>t[1]))istrin.clear();0 W& E6 Q( G# ]: _3 R
for(;;){" l/ T$ O/ G% C+ b: b3 Q& |2 \
if(istrin>>csym[2]){+ k! @* ^+ v c, z/ e- N' }
switch(csym[2]){
5 [$ v8 x! F5 Y( E& o9 j case '(':, O' G/ N8 Z0 n& U6 ?8 K c! b9 t
if(!csym[1]){nLevel=0x100; nERR=1;}else$ v; ]7 ^0 f9 ~- }1 A
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
% y6 V" U# |0 h5 {/ X else{nLevel=0x100; nERR=1;}
( r: y9 f1 {% M7 J6 N% f" q0 i/ B break;* b) M7 k+ V6 E
case ')':) \: C3 L; k3 r9 i* l
{nLevel = 0x100;}break;% E/ T( \' ]! t/ E9 E4 k$ l
case '+':case '-':case '*':case '/':8 ?7 s, S1 j7 ~
{csym[nLevel++] = csym[2];}break;
2 M" A1 G2 G( x1 q case ' ':case '\r':case '\n':case '\t':continue;" {# R3 g, O" _1 ]6 ?) l' H$ [
default:
( E$ p* f5 D& d {nLevel=0x100; nERR=1;}
/ v7 @ u8 E8 ?3 d/ P }& \. F* ?" b) ?/ p; Q+ ?0 H
if(nLevel==0x100)break;
) D7 w! d1 X( Z; P5 v if(nLevel&0x10 || istrin>>t[2]){
0 b8 u6 o6 F: S: O- C7 m7 C4 M nLevel &= 0xF;
2 b3 m/ y# m. k P. y8 n if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# N# {1 c; M. F# F; ~+ j- D) R if(csym[1]=='*'||csym[1]=='/'){
4 g# t! N( m. [: P5 W3 H GetExpValue(t+1, csym[1]);
4 K0 E9 F1 R$ k }, b5 T3 |8 U; d: n
else{
+ k) p. M9 i0 G7 [ H! n2 v9 a GetExpValue(t, csym[0]);. O8 D: R) a4 y( q" f6 T
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
) \" P5 D: V5 @! S J: m- J6 [ }
3 I/ q" P5 E4 u$ { nLevel = 1;
) q2 E- a# N2 X- Z# r- y }
; |. P) F$ ~+ Y3 _( W+ w else istrin.clear();& ~6 g( K9 y* Z* N5 p/ d6 A
}/ u1 Z$ Q# s: h
else{nERR = -1; break;}, C0 Q% z" a U) c. F9 b' p
}
_- Z: R; E$ T3 b2 _1 p if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);& f& u/ Z, \3 R- \* [: k! W
else nReturn=GetExpValue(t, csym[0]);9 G7 |* K0 M9 n+ K1 u) s7 b% n
return nERR==-1?1:0;
/ C7 c2 k7 U2 P. B: l}}+ A8 C& O" x l$ s! t$ t2 f5 l/ T
! {2 s2 O5 G' K3 t/ u
- V2 u6 U7 Z8 Y( L
+ u2 z8 w2 G8 z6 n函数模板使用示例:
9 m6 V: \, x. k4 c7 G4 V在以上那段代码的后面加上以下代码:
. c6 S' } s/ a" J/ |( j8 I2 X- y- A+ h& u# I6 \
0 y, ?' y: C' p- [
3 I8 j g! |% I6 ?程序代码: ) E2 h( H' |/ |7 O- [: m9 q6 V
- U' F) g+ c4 ]6 y9 E#include<strstream>
- n6 b0 n: [9 m- f A! y#include<iostream>
/ r6 c, q" C' u) T" e9 m#include<string>0 ]( m( L& a) S1 Q, W9 a' u1 f
using namespace std;
, U0 \; R( N' Yint main(void)/ h" g+ V2 R- G. u( q
{6 V. x _$ _" T7 q o9 s4 @
string s1;( w9 h$ h4 a! z0 g9 R
while(cin>>s1)) ]/ O5 c4 \# u2 R, _- Q) ~
{% l! N. N$ B& K/ X E$ x$ Z
istrstream isin(s1.data());
s& x; ~ l* [! E) K double d;
& F: u2 |. W* v; T' A& o3 v if(fy_Exp::GetExpValue(isin, d))
8 `" _4 V! p. m$ t {
7 v, s& o5 ]$ I7 {" a cout<<d<<endl;6 Q) \2 A# K* |7 }* |$ U
}
# H5 K% d- |8 p3 P6 o9 U else
; U) P6 ]- K) x7 G1 ^ {1 q" ?, S/ h8 }
cout<<"ERROR"<<endl;
6 B7 s$ k8 ~2 I+ W: d }
: \, @1 \' G; \6 E }4 W8 w! x) _ `- A- }
return 0;. z& p+ a i+ C2 I; j
}
: O+ k- T/ @' B) a3 n9 j! d( a& r& h& |9 o) I. H. E0 [1 G
) [& U+ V+ c) E! P1 ^0 p, h然后编译执行就可以了(*^_^*)
7 _8 O$ ~, g' P+ W z# i其它:TC++上一定编译错误,不保证在VC6上也能通过编译( O, H' }8 @8 S; t" v+ H
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|