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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
& O2 H+ p$ `; V- ]; ?6 V一个很方便的函数模板,可以并且只可以计算含括号的四则表达式 s0 U0 u9 @" E1 O" \! ^" O# W
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 v9 Y1 p& _5 V x; _9 [. A4 a参数解释:. V# Y7 x% }5 P. o4 b3 K, T6 i
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 W) n0 E. \; g/ c) M; J1 T
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" Y- y W( x$ T+ [9 {
返回值:2 `! a4 g& x9 [3 g2 u4 @
返回非0表示计算成功,0表示计算失败有错误
8 j: e* M3 a' X
5 H0 E0 ^! P- O: `* @
1 l# _* R7 k% t& B- T. O5 _0 A# T- |0 C/ H
程序代码: $ r6 j. D6 |- ~
( _, @( h. s+ v" J1 F Pnamespace fy_Exp{9 f2 V" Z9 R) |/ N' K* Y: F7 |" A
namespace {template <class _T> Z! H" S5 z1 R6 _
inline _T GetExpValue(_T t[], char& csym){# H4 z. b7 N1 O" i. h& @
char c=csym; csym=0;3 @. t3 |. q0 D7 `3 c! T' w; B
switch(c){" {" k7 O& [4 I4 P
case '+':return t[0] += t[1];
m* Q) _" @- e0 f0 C case '-':return t[0] -= t[1];
6 V5 r$ u3 |5 I* c* }# I case '*':return t[0] *= t[1];
# x; G; i" \: {% ~ default: return t[0] /= t[1];//case '/':7 }; D/ p9 f8 b$ Z) O
}
- a6 K% V9 D& [4 x- J& U}}- P" @9 W+ b, d& L
template <class _T, class _Tstream>. G' D% e, Q0 [% T2 [3 |
/* _Tstream: inputstream, _T: get return value n4 N/ c: g/ P
* Return nonzero if get value successfully */! N& n" u% E: @# Q
int GetExpValue(_Tstream& istrin, _T& nReturn){
4 o" B2 R5 v6 \7 o$ \. G _T t[3] = {0}; //雨中飞燕之作# e1 i" f0 a7 Q0 M/ V
char csym[3] = "++";
7 F4 q2 Z' B' Y: ? int nLevel = 1, nERR = 0;
2 E1 Y! {( \0 z( Y# }6 ~% p if(!(istrin>>t[1]))istrin.clear();
J3 F7 P5 ]8 i for(;;){
- ~1 G0 [8 |) B$ D if(istrin>>csym[2]){
- f; R" ^1 m* c5 x( d- M" { switch(csym[2]){. Q) I8 r8 M0 {- o+ [5 k& K" n
case '(':, i2 v+ {( B% L: i) k- q/ D
if(!csym[1]){nLevel=0x100; nERR=1;}else: y0 B2 y6 B. f# B
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;$ E. `! O+ K8 l% j, J* }0 R
else{nLevel=0x100; nERR=1;}
! s) j+ `! _$ p break;3 ^' g) j) n7 {& v' ^) ^
case ')':; b8 E5 V( O7 t% z3 L
{nLevel = 0x100;}break;3 @8 K2 M. A& c0 n$ O4 z+ K9 T
case '+':case '-':case '*':case '/':2 U0 y$ F0 s, X! c; }; J
{csym[nLevel++] = csym[2];}break;
/ }8 @$ j) K2 B9 A& m6 ]& K6 O7 v case ' ':case '\r':case '\n':case '\t':continue;
4 J+ e' T. e7 J$ t4 x default:
+ P! e% a0 b0 ^, l) O2 f8 j$ [ {nLevel=0x100; nERR=1;}) X) w! P+ V# U3 E' [3 S. V
}6 X- B8 K! S4 I/ h+ S; b
if(nLevel==0x100)break;$ x: a+ o: Y* S Y; Y; ^3 m8 [2 b
if(nLevel&0x10 || istrin>>t[2]){" z; |- m+ P, ]
nLevel &= 0xF;
- G9 h, \" T" _, E8 A$ G2 X% J if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 S/ e9 A1 y5 u1 |/ O3 z) C if(csym[1]=='*'||csym[1]=='/'){
7 I& n2 Y, V' c* P$ l8 D0 g GetExpValue(t+1, csym[1]);! v* A9 J* q/ U: N% \
}7 {( \* i. [" _) d0 m3 Q/ b
else{
/ l7 `, z' _2 i: v$ x2 r* n GetExpValue(t, csym[0]);: m5 L; p; g. a1 Q; F ]
t[1]=t[2];csym[0]=csym[1];csym[1]=0;' c5 e/ F8 W S# i- ?
}
( U9 [- v% B1 F3 A nLevel = 1;" ~- H( W8 M {# p
}
1 M: q; f! m+ ], r) t3 ]2 u else istrin.clear();
# ?) R+ { x& Z+ ~8 s$ M }
! V' n+ f. M8 M, r/ b# Z. f* u else{nERR = -1; break;}" N. [* w4 f8 l
}8 Z* f' S) H0 S% B* l
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);: A$ V: g" i- T, a5 _2 c8 A0 U
else nReturn=GetExpValue(t, csym[0]);" X7 ?: M+ t" W+ W' b
return nERR==-1?1:0;
8 i* n+ U& u5 O! s}}' m1 f% S, |, q* P) @! O6 H) f
9 i+ j* d* ^5 z. h G& R: \$ o
% m: g# x/ w% w q" x- m1 F
0 }( ^/ B j9 q函数模板使用示例:" g+ |4 y l7 ]+ ~: [" |$ p! x
在以上那段代码的后面加上以下代码:( e B' Y* h( G& S1 ^
* b: R( S) {* o; R" N
4 K* p4 b' `( ?- n9 s( n
& ?9 Z! z7 o" V. Q程序代码: 3 F6 P8 W: q: ~: }
, H' q! V( a( }5 t. ]. Z#include<strstream>
0 ^2 w* B/ \% |# V% F" Q* \4 e#include<iostream>$ j" J" L& [+ C2 _9 e2 t
#include<string>
4 ~! s( K; K' Q' [5 L3 [. ]% A Q% pusing namespace std;
$ e" t3 T X; v$ z% u- E1 Dint main(void)6 q+ z' v) [2 Y9 H4 q6 n
{. V+ d) b) ~# u8 G7 `
string s1;
, j$ l' r v( q while(cin>>s1)
6 A0 o4 a# h, Q+ S+ k {
/ \! f* U- q5 \ istrstream isin(s1.data());
" ~: G3 O( X K) e; n; _ double d;
2 U6 s v- O. N( w* G; B" N5 C if(fy_Exp::GetExpValue(isin, d))1 k z% d$ l, c1 F' O* h9 A$ k
{/ O+ i% I1 o& F0 ]: r6 A# @/ X2 v3 \2 d" W
cout<<d<<endl;
) W) O, H5 q& Q7 s( Y2 u" N }, i4 `. e4 O1 n7 C
else& u0 Y* P1 U% [
{
# y" S9 D' G {& @+ w cout<<"ERROR"<<endl;
0 X" Z" @1 A9 Z( M }: M3 R+ d" \& |# _5 R
}. ]1 D" e% n/ R- l7 E' W1 l
return 0;
4 S) G$ M# h& w, x}
5 K" f' n% Q2 L& @2 L5 G9 o% A* \5 X! Z% a( Y# ?4 F( D' B
+ E/ [8 x C1 @' D3 z$ x然后编译执行就可以了(*^_^*)
) H+ Y. D- ^ D5 B其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( N3 ?0 @7 z' Q( v& e0 r- J 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|