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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
* g3 b- n; _; G. O) y: n; p3 M7 f2 [一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. r& |1 _' a% m5 j! a只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 }" O8 |8 Z6 G% ^3 P6 r7 f0 |: ]$ Q
参数解释:: w U$ u! i/ A7 r; T+ E
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
5 d3 f% W* q. P9 vnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
) W; s m! q/ g% \" [& M9 H返回值:
6 }" k+ k' M& V" x. |8 z0 A返回非0表示计算成功,0表示计算失败有错误
: Y+ o+ b8 m, ]1 k1 R+ L- R, v6 k( v( A: Q. V+ E
* G7 h( _4 y% L6 _* `6 I% S
, c8 \ a* g k' B2 V: G程序代码:
3 @1 l0 V6 n3 A& F
+ z# }% {5 U: d. A% i1 d% ?namespace fy_Exp{1 {( t/ S5 E/ I
namespace {template <class _T>- T* w/ W6 |3 \, \6 I
inline _T GetExpValue(_T t[], char& csym){
2 n3 b# j8 }" N% Y3 n, n char c=csym; csym=0;4 _% ?) M; S& i( J. i
switch(c){
6 k4 O V+ H# x; F0 }6 ` b case '+':return t[0] += t[1];' Q* e% S. L. w1 v
case '-':return t[0] -= t[1];
7 c5 b% I/ X4 M/ H7 w case '*':return t[0] *= t[1];
, ?/ a4 J3 }4 ^, p default: return t[0] /= t[1];//case '/':
0 [8 A( N& j; ?) v1 m& r' h }
0 m& e6 W) b+ k/ g}}
& o# C7 G. f- g' G8 c9 a/ S! Htemplate <class _T, class _Tstream>) U; K. J8 a! J
/* _Tstream: inputstream, _T: get return value. x8 Z; ]3 y; o. j& `# U
* Return nonzero if get value successfully */1 k+ m# \& c% U' x; b5 |, [) Y
int GetExpValue(_Tstream& istrin, _T& nReturn){8 ?6 I. v5 g2 e( }, T
_T t[3] = {0}; //雨中飞燕之作! _+ u# l; ^2 J! p) Z7 F
char csym[3] = "++";
4 W6 s. [' k$ I1 k+ Q int nLevel = 1, nERR = 0;
' u+ }& _/ j1 a! @) g+ k if(!(istrin>>t[1]))istrin.clear();) V0 [( |2 g' E. ?3 ~! d
for(;;){
. e9 k$ Z3 O* M0 j, y( v; p if(istrin>>csym[2]){* K* f( {5 i1 y- X
switch(csym[2]){; k" k+ b8 q% \: b6 @$ @: o
case '(':! [0 C# P! }# j$ T+ e4 C7 V
if(!csym[1]){nLevel=0x100; nERR=1;}else
/ H! T/ p* K; Y if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) n" J$ G' w* j W9 d; U else{nLevel=0x100; nERR=1;}
/ b) [! m, ` V& Z7 M break;+ r1 y3 R4 z" q% L
case ')':; L( X' R" V- E5 z+ m0 H1 e- ?
{nLevel = 0x100;}break;
7 I6 l. L% \% ?1 ]& W7 A1 k case '+':case '-':case '*':case '/':3 K! w- @" e5 R: J
{csym[nLevel++] = csym[2];}break;( J* B) `- q6 C* w! _3 S2 E
case ' ':case '\r':case '\n':case '\t':continue;9 v0 v7 F$ ]3 t
default:8 {0 R' M6 E/ r5 T* l! F% R: `
{nLevel=0x100; nERR=1;}
! @8 X7 e1 B, J }$ }; s% o" p% e$ s! q
if(nLevel==0x100)break;$ m+ x3 b. Z% N# G8 B( u$ {2 Y
if(nLevel&0x10 || istrin>>t[2]){
: l- y) W& f- U8 c4 y nLevel &= 0xF;
- g( B* n1 d. z1 o if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 c3 ^ l4 b0 r3 _ if(csym[1]=='*'||csym[1]=='/'){
% S+ @ B9 M" \& {; ^& y: Z GetExpValue(t+1, csym[1]);
0 f5 c0 z: N, H0 c+ G& t- h8 s2 l }
2 k& X* y" L1 ~ else{
0 s' X; w4 j* F( N GetExpValue(t, csym[0]);1 ?0 e8 a* i/ X
t[1]=t[2];csym[0]=csym[1];csym[1]=0;$ s% ?; s$ g+ C8 q
}7 _" [! n& O4 j" F: U
nLevel = 1;' ^& v. T" H( S
}
6 {) T% N" M+ `3 k4 O" q else istrin.clear();
7 R4 `% ~+ X/ r }# F3 n% P! L# P/ |
else{nERR = -1; break;}
8 d' w8 e: N& h' A' p# n }5 R4 K: v7 q9 k# H2 R: r! ^2 W
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" F& Q" R T% Z- b else nReturn=GetExpValue(t, csym[0]);1 s, d9 \8 l; m; |2 M! Q
return nERR==-1?1:0;6 w" M" x. n" {3 k2 B% [( `
}}8 ?1 \# i/ }: q _( z. m* c
& c6 N' m5 H* ~ u# z
& u2 c1 {+ o G% k5 Y7 P: e K8 V3 O& P4 Q6 x, n
函数模板使用示例:$ }( y9 ?& R5 I( e
在以上那段代码的后面加上以下代码:+ a. ]0 c" ~& q% }' b, F
r' X: Q$ z' n: G5 @4 f ) W d' ^' _4 l4 Z
2 k- M) ~ [5 e' y2 a" E& |/ r9 K/ F2 b
程序代码: 0 s4 _1 r! J) m! l* p
& v0 T- X$ U: Q9 U1 Y#include<strstream>0 H; N* h, F, w& [" y9 x
#include<iostream>
) ?' L$ C% K0 Q. ?1 c3 w#include<string>
0 f$ i4 d* J/ D" N K) X$ p& ]; cusing namespace std;% Y5 ~( K, |% d8 K0 u
int main(void)3 V9 j! p# x. s$ C0 h3 n
{" Y0 y( }0 E# w* V
string s1;' A! v0 p/ q+ [4 {
while(cin>>s1)
" J" N7 Z2 Z; }- p {* n) F3 A. V3 L3 K. y* H5 r
istrstream isin(s1.data());
8 [+ r0 s& ]! U; t) z( w4 `9 t) | double d;
& l) A/ o+ J$ R: I if(fy_Exp::GetExpValue(isin, d))
5 u- L. l' c: A% j; R9 | {
2 p4 {9 B3 U9 b. x- p cout<<d<<endl;
7 N9 H2 q" \7 i6 Y* G! X }
4 ^5 P2 O n1 d5 Q# `9 T6 k else
- \' `9 h1 J4 m( r6 ]; z! t2 h, T& @ {
9 z5 j) D5 [# E& `7 S cout<<"ERROR"<<endl;0 D1 r0 R- H0 y: g' |! h
}6 H! ?% S0 l* g7 N7 Z4 M4 l
}/ e' Z: P% k6 F9 ?, [
return 0;& j8 M% h% g' B5 V- g( \2 b+ c
}
8 G- M! ]& |9 X' T
/ a2 |9 t: {( U" e( E' L2 A) }, b/ M$ c
然后编译执行就可以了(*^_^*): Z4 n* D& a7 q3 Z2 r
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 D! I& [/ ~" Z* E% @+ U 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|