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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
9 Z7 y. C3 H% h3 v9 i, |: B1 c# w一个很方便的函数模板,可以并且只可以计算含括号的四则表达式: K; ~* t l. L4 I. m# f
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)# O0 t1 m- p* A; d7 c& ~$ l
参数解释:
# _0 l: j8 m% C+ x U, \" qistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ w+ [! v1 h2 Z0 t
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# k( r/ v* @6 k5 Y6 X' A6 Y返回值:
! N% I" r- s) o返回非0表示计算成功,0表示计算失败有错误
, J0 I. R( I* u! {! G# v7 U4 c' `
' m: }9 c- t) d/ `- ^& E! V
( B4 Q4 e- `3 K8 E' k: y
程序代码:
0 A4 N4 v' u4 Z7 P& O* i
# k! r' ~2 f$ _4 _namespace fy_Exp{5 n" |' l2 ]- _5 e4 y; Z: y
namespace {template <class _T>5 i* P8 J; a4 e' R6 j; v
inline _T GetExpValue(_T t[], char& csym){1 Q4 B/ z! y" p( `4 h! k, @
char c=csym; csym=0;
q; ^# M! j* r. i$ x switch(c){
, y! B3 i' b6 M& r6 Z; t) q9 J case '+':return t[0] += t[1];) Q. E$ N( U; S! Q; I' u! O
case '-':return t[0] -= t[1];1 l0 {. c3 K" H# B9 b% E; o
case '*':return t[0] *= t[1];: w- N% a0 Y- ]# H2 m/ r4 T
default: return t[0] /= t[1];//case '/':7 @# \3 b' s6 i# C7 K
}* N, O0 k8 x9 W& J9 F
}}$ h& v4 I A& ] z! H" h! h
template <class _T, class _Tstream>
" h: ~" h, J- I/* _Tstream: inputstream, _T: get return value
+ U7 M& ^5 w4 \- Z4 e( _' {. V* Return nonzero if get value successfully */
( B% J$ w+ F1 a7 ~- Kint GetExpValue(_Tstream& istrin, _T& nReturn){
8 _. [: O7 u, @. L2 D: r- U _T t[3] = {0}; //雨中飞燕之作6 H" @2 M" I& j
char csym[3] = "++";8 R( [2 K! D1 G) W
int nLevel = 1, nERR = 0;
$ X1 H8 P# |; K: P) x6 m4 h6 ? if(!(istrin>>t[1]))istrin.clear();
- v4 d o: H f% z for(;;){ `3 e1 {* [& _: I
if(istrin>>csym[2]){7 V5 A7 N4 T2 H; A
switch(csym[2]){
, c& p! O$ v) G' |/ {$ j case '(':
7 s$ Q A# ]5 V* Q if(!csym[1]){nLevel=0x100; nERR=1;}else
4 V3 `8 E. z8 y8 J: d2 A4 p1 O if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: ~3 S) h7 M4 }9 k1 A
else{nLevel=0x100; nERR=1;}1 r U! r Z% N8 E& d- h" N2 l
break;. o! }. s+ s q( C6 d
case ')':
' @& k4 b3 O$ ]8 l9 W/ O {nLevel = 0x100;}break;
- ]/ l0 w$ f3 O. j& F case '+':case '-':case '*':case '/':7 H% v4 l* \" H% `' e( y' ?5 `
{csym[nLevel++] = csym[2];}break;8 F+ ]( B' C# J! o* _; e, a
case ' ':case '\r':case '\n':case '\t':continue;
% p: @7 |+ ~' ]2 t+ Y" l+ _ default:5 B5 e: B+ c N( m- p. {) F
{nLevel=0x100; nERR=1;}
. [6 K7 I" ] d) v% g }
: k. k9 k I$ |" W- | if(nLevel==0x100)break;5 F9 z) c' `, {' P: {! o
if(nLevel&0x10 || istrin>>t[2]){
& r, {9 N0 U6 { nLevel &= 0xF;
( r! N7 R( E) h$ | if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! p% a; \$ z8 n$ n! W if(csym[1]=='*'||csym[1]=='/'){; o) Z: [8 ^7 h
GetExpValue(t+1, csym[1]);
# D* i. a8 i) v# R" t7 @ }* `: J' B/ Y+ P) u+ o, Z2 J
else{1 g$ L& R; v5 n* V; Z
GetExpValue(t, csym[0]);$ }2 ]. S4 X8 g
t[1]=t[2];csym[0]=csym[1];csym[1]=0;! \( L1 o0 g* o, R
}
# b- e7 h' L: `6 B z" h nLevel = 1;) K$ j* K% i& w0 H
}
3 c6 M5 [" R+ i! a; ? else istrin.clear();
3 b) K0 J8 ?( y8 w4 O( u+ ~ }+ Q ^# [4 M2 ^+ g' `1 H4 [3 D/ _
else{nERR = -1; break;}. D& x5 g8 Q7 i% @% @" g
}
# z; Z& u9 ~# j8 W if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 s3 t/ E J$ f1 w) c( {$ Y
else nReturn=GetExpValue(t, csym[0]);; B0 C. X- g) ]8 c# k
return nERR==-1?1:0;
2 k9 S& `8 Q* _" m}}
0 D) h7 N0 |' w# Z
3 P& t4 k6 S! V" r1 z& P4 K' I# g/ }/ A
% C/ R: p; h6 ^3 B* ?4 ]
函数模板使用示例:% p% G% M& Q2 U" M$ V
在以上那段代码的后面加上以下代码:
7 V3 a* v$ M! O+ ~
$ M8 h( i; ~" m2 ~
6 k7 O; C/ l) t
: O& D+ ]* \8 r* r; U& P程序代码:
/ d; Y* U1 x& F( {' ^, f) E
1 j$ l+ l# V1 M {. v#include<strstream>
7 j) m# n, `% z2 V$ x( }#include<iostream>" F# H6 }& O( d
#include<string>7 m! L5 V5 N# P$ Y# ?1 L1 o: Y
using namespace std;. y* S% f3 Q0 {" u
int main(void)
5 K3 V0 c4 U* j( E6 i- H, X{0 Z' V. v1 V7 H0 T
string s1;
: H6 k( o |" i$ w0 U5 N/ e while(cin>>s1)
8 z# i6 C/ e: q: Q4 M4 W: g0 L {' D1 x0 D# Z2 f, P# Z+ k, Q
istrstream isin(s1.data());5 ?! e1 d8 v4 q8 `
double d;7 {( H( H9 ^0 I; P. E- p1 k
if(fy_Exp::GetExpValue(isin, d))7 |% {3 w6 B( k2 H- h4 ^
{/ R8 u% |3 W" o* V2 p
cout<<d<<endl;8 w, \0 ?5 O" q3 u6 ]8 a" {7 ` B
}* T3 B$ [. o% N6 ^7 ]
else
& k7 j& y8 d! f3 i1 c; b+ |# O {2 @6 j: C* V; m0 S6 w
cout<<"ERROR"<<endl;
3 m# ?! y/ _" v2 T }6 I0 R) _/ C' B7 F0 ~, ]
}8 z; K# w+ O% c1 }5 _3 U; P5 E
return 0;
# o. a: u8 V2 G) B- _3 J, K8 O+ V}( i7 K4 H8 {. o4 U. }) U
! }4 H- o% x0 }( N' t) g# F7 R( g! J" d6 K+ ^/ e/ J
然后编译执行就可以了(*^_^*)9 g* W: b0 ^9 f9 \: z& [
其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ t% s9 V6 r& {7 m1 B. Q8 }( Z
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|