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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
9 h0 _9 @6 _) D! Z4 m一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# L% u2 N7 ~: h! j2 I/ P- i0 y9 R只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 i2 Q7 B0 m$ ?3 q2 k参数解释:
: [5 s. d& S5 D" S6 cistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流6 \+ G/ h7 S( l2 N, u4 a H
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. x+ J7 N1 D1 B" o! c9 n
返回值:
. ^/ o1 U* y: f% s5 s6 G2 @返回非0表示计算成功,0表示计算失败有错误* R: ^. y; f, @# T& Q
+ `& e% u+ k y3 \! n' j* e
$ o) G2 Z% T$ M; Y" X/ J: I- m- B. Z
程序代码: ! {- \ M5 L: [4 `2 U
" u- t2 u" V2 I& ~( \. ^
namespace fy_Exp{! [; }+ a+ B# J T4 I& Y
namespace {template <class _T>+ X: A$ b5 Q1 p; P8 ?
inline _T GetExpValue(_T t[], char& csym){$ V- ?/ q9 Y; Q
char c=csym; csym=0;
) `9 n1 \ E' B" T6 h switch(c){& m+ ~+ E; w2 e
case '+':return t[0] += t[1];
- M F2 L" Q* O- g' O3 n: T6 y case '-':return t[0] -= t[1];1 j% t: k& o9 v( i* t
case '*':return t[0] *= t[1];- B8 d& y+ @5 G/ P9 B. F
default: return t[0] /= t[1];//case '/':! P9 n3 T4 F7 l, J+ N, o
}) z+ o; t* d% a! N* S0 T# T& r: ^
}}* k0 h9 A* l2 |# G9 V! I
template <class _T, class _Tstream>& \% K# U0 z! R
/* _Tstream: inputstream, _T: get return value* O! w& K2 V4 d" d
* Return nonzero if get value successfully */
$ Q7 }2 R7 K" y1 W8 Yint GetExpValue(_Tstream& istrin, _T& nReturn){
8 K, k& _6 W, N) e, g9 X" a _T t[3] = {0}; //雨中飞燕之作
& \! f. N, f4 I- M; t, R9 J char csym[3] = "++";
* R: ~6 ?7 O9 y) l! m int nLevel = 1, nERR = 0;
# ]4 u! E/ |5 g+ e) ?2 O1 I# C+ Z if(!(istrin>>t[1]))istrin.clear();
' V! H9 V) b' p& \5 e5 N( ?/ x for(;;){) t4 X; U* D! G) k" @( k
if(istrin>>csym[2]){
# p& K+ F, ]. K* B, f$ \8 s switch(csym[2]){
4 ~8 n. i* W" \ J case '(':
! I' Z: h0 h: j3 f6 [& j/ }& [ if(!csym[1]){nLevel=0x100; nERR=1;}else4 Z; d8 h5 y8 N
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% l4 G$ K( c3 a" Z1 j' r
else{nLevel=0x100; nERR=1;}
6 z# `. N. @$ V. m6 o9 a9 E break;. d' M6 r4 T2 ]5 W+ U2 z
case ')':' k' N; D+ R* v) m( K' l5 Z! Y
{nLevel = 0x100;}break;( J: [/ }9 y: n% z
case '+':case '-':case '*':case '/':
* G- m7 g* Z4 ~; z2 X/ s {csym[nLevel++] = csym[2];}break;; W, z) B$ P" u% o7 v
case ' ':case '\r':case '\n':case '\t':continue;
" X+ k4 \% s0 f3 o, r% h default:
6 `/ F! u, _" ~ {nLevel=0x100; nERR=1;}9 a5 D! R0 I/ Z# y- i
}/ N$ N/ [% a+ j0 j
if(nLevel==0x100)break;3 @7 }4 M3 N* F/ f) n* J `
if(nLevel&0x10 || istrin>>t[2]){
' K' E$ x3 ?6 @/ H0 i4 _2 U! Q nLevel &= 0xF;
H( G. i+ J3 U7 Q( A- R5 J if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ G& k+ ?5 P. W; K$ L: ]+ S
if(csym[1]=='*'||csym[1]=='/'){" k( \, K5 X w9 L0 X. r: \
GetExpValue(t+1, csym[1]);
! ?, d7 G* a4 y* t( D; c+ o6 r }) ]" M' X! c9 J \- L
else{
1 a" M( P' O K" O( U- ~ GetExpValue(t, csym[0]);
( I1 O- ~+ j4 C- p2 j9 f6 @3 @ t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# X) @( \- l3 Q$ F$ c! g6 a }
' q& X( f. i* Z j nLevel = 1;
; Q# X% I, b) _* n }
+ K3 W' S' j: b: w( j else istrin.clear();8 N* x% o8 S' D, I- k% `# I
}& c# l3 j Y: @# i, l0 T& z
else{nERR = -1; break;}- n' L( R5 ^" P, Z& o# o
}* |6 q; f& C$ H* B( D; |
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 {0 F( E6 C- y& \, B; w else nReturn=GetExpValue(t, csym[0]);2 f/ l" ?$ v1 ~1 C
return nERR==-1?1:0;
# f. C' G* |' q}}& R4 g5 W4 M2 }8 D1 R0 ^7 s: `+ K
; M' B5 X9 V. X0 }" r! X$ `
5 c7 X, K& m; i. H
8 b3 |& v+ j2 P+ c3 |
函数模板使用示例:
- K6 w" ~: e1 q8 y }: q在以上那段代码的后面加上以下代码:
, J6 O9 x+ h' e4 G- [. a4 `" X1 m J7 h- ^
- R% |, O! M) M3 e9 ^& L
4 ^* U$ _) ]3 _+ k程序代码: 5 }( b& k: _! F( c& W0 a: H& R. }2 E% ^
+ S* l2 @4 x. ]# a0 q9 f6 u" l#include<strstream>& K2 V0 \; `( F) @; f8 w
#include<iostream>
0 Q \% P8 \7 F8 L7 E0 J#include<string>; j& i8 g( y- ]
using namespace std;
( T& I- E4 ^5 ^) c. P, C. iint main(void)
5 l" ^0 j5 ?% l+ H( _0 |5 q{4 l( O a( Q, b$ K! M
string s1;
1 r. P Q3 t* | while(cin>>s1)8 ^$ U0 H+ O) x
{
3 l9 R6 ^# Z$ J+ o" y+ O- c5 G istrstream isin(s1.data());' L. N: f4 L0 c) h; B
double d;
( p4 _( _; e0 m; V; N" V0 m, u3 q* t | if(fy_Exp::GetExpValue(isin, d))
: r# I- g E' E+ y# G {
- k) e# ? S7 H9 o cout<<d<<endl;6 a# d: d6 D, [; J# D
}( K! V* q' L# X8 H
else, r: B. E' u5 H/ A, }$ V! B3 k
{
7 g' O1 _: ]- o: g# q cout<<"ERROR"<<endl;' x, }( C( l/ ?1 @. W8 k
}8 p3 |* A4 m+ T5 ?+ R0 q3 a8 q
}6 P8 j/ T1 D. d
return 0;
4 F7 i7 _4 }- M9 J3 m* A' ^}
4 H$ \) K; j. [0 U7 P: N: [- l! T* D% f, H$ A" b0 p8 e
1 f7 a p4 z: s
然后编译执行就可以了(*^_^*)$ G2 }; H) ^* S" C; u4 E% |
其它:TC++上一定编译错误,不保证在VC6上也能通过编译) z5 P* B/ B- y2 ?( z
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|