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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,( {& R9 J, g" ?6 d& f4 y$ G: i; c
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ Y' W5 R( D; Q( R5 O, w/ O
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): Y6 n% O" ] M9 Z- `, K6 ^; b9 y* ~
参数解释:( t$ ?4 F$ q' a9 h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流: f2 a4 B- x( H& d/ E
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) V+ `' z. N5 S7 k' x6 H1 G. Y1 C
返回值:
6 u" V+ j2 \0 V/ y" x2 |返回非0表示计算成功,0表示计算失败有错误* J" O1 W/ P- t- J. c' \; a
$ p6 M) F8 A& @$ B+ u9 W & t. y% M' M+ Q. l9 f; @) M
, n2 y9 d! V6 w/ K& _程序代码: , N( C7 v, q" A- G9 }
& C) q9 r3 _, W+ Y( C: h9 Tnamespace fy_Exp{3 k/ x- A( l* V9 l, F$ \0 P$ k
namespace {template <class _T>9 Z- O9 o) I0 K
inline _T GetExpValue(_T t[], char& csym){: K0 r! T7 n( M
char c=csym; csym=0;6 j( |/ t2 P0 {9 J
switch(c){
' a0 z4 L% s1 z& o! I4 b, o) u case '+':return t[0] += t[1];8 `6 T6 J" F+ p) A
case '-':return t[0] -= t[1];3 ~$ J7 ~+ }+ ~$ p4 O
case '*':return t[0] *= t[1];
$ h* G1 d4 H" W# ]% e; a default: return t[0] /= t[1];//case '/':% g/ l6 J- Z# d" z3 F
}
+ ~! f! S# ?9 s3 {' o}}
f8 p5 f; t( X3 _7 i+ ftemplate <class _T, class _Tstream>1 E/ d- g- }& V) N" L. j
/* _Tstream: inputstream, _T: get return value! A c+ A; C/ V' Z; E# C K
* Return nonzero if get value successfully */1 \/ v1 T% ~/ F
int GetExpValue(_Tstream& istrin, _T& nReturn){' Q- V7 g; ~9 v7 C
_T t[3] = {0}; //雨中飞燕之作! {+ h8 b' Y6 B, Z6 I- a6 @
char csym[3] = "++";
1 {/ O9 H, q6 c( b* L1 z int nLevel = 1, nERR = 0;
6 u- \/ @9 ?7 Z' b! D2 _. D if(!(istrin>>t[1]))istrin.clear();2 B, C u1 _( a# K8 Z3 t( h/ y
for(;;){% Q, U$ g- E7 f
if(istrin>>csym[2]){+ u# A" j$ W |# `5 ?
switch(csym[2]){
5 v& \+ i9 H1 W$ Q2 T! B case '(': r/ d+ J# |" v7 x L6 }
if(!csym[1]){nLevel=0x100; nERR=1;}else. A# O8 Y/ o# W5 q: N F: i
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
1 a8 k+ o: @. T2 M Y else{nLevel=0x100; nERR=1;}! ?& L) j: Y0 A! B( H* Q+ D' [& B
break;
/ h0 y" e0 o$ z/ X: c; d9 v case ')':. v7 c9 z: D4 K1 B. P. g$ t8 \. R' B
{nLevel = 0x100;}break;+ i% Z7 _* D1 }# f, k/ X3 J
case '+':case '-':case '*':case '/':) o( r& ?* l: a7 d3 g+ Z' u
{csym[nLevel++] = csym[2];}break;
3 T, f/ M( z$ b. \3 l& F1 ? case ' ':case '\r':case '\n':case '\t':continue;
. Z5 C5 C9 _& M3 u* p2 `7 n default:( H1 _% a/ b; T: U+ [
{nLevel=0x100; nERR=1;}
2 t7 l; K3 E& }2 ]6 o# a4 y6 C }2 X0 {7 H: r3 n& ~- S& v" C
if(nLevel==0x100)break;
5 g7 }4 Q, H& P if(nLevel&0x10 || istrin>>t[2]){) B" G/ x* c) ^; O
nLevel &= 0xF;
2 u& |+ Q! C: ~( d! C( Z, ` if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. s; ~2 t' I2 e# x. n- ] if(csym[1]=='*'||csym[1]=='/'){; R9 f8 x% z- n j
GetExpValue(t+1, csym[1]);
5 _1 o$ S9 @2 d4 H j+ h# | }
% S$ K' z0 I& ^+ h2 a else{
9 ]/ h* a) s) C6 {: V GetExpValue(t, csym[0]);
; |1 s* O& P# d1 r/ [$ x t[1]=t[2];csym[0]=csym[1];csym[1]=0;
2 U$ Y3 y j0 ] }! ^' ~2 o3 g: }/ Q
nLevel = 1;
4 X% [' s6 O* W% M }
+ h; Z( r( F; U( w& Y @ else istrin.clear();* G# J8 K& I) ]- \; K' g& e& L) i
}
+ `" h* O+ u1 a! ^ else{nERR = -1; break;}
2 `; ]4 ^+ f/ J! @+ d }9 G+ X, A9 h2 d, }
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. n7 P6 x! X7 B4 H0 ? else nReturn=GetExpValue(t, csym[0]);
5 n! I2 q9 U! { return nERR==-1?1:0;- Z+ w* x1 v% ?$ v7 T+ J, \
}}
~8 D& h1 E# E" y6 L$ S
5 c# B" p9 G4 k/ N3 e8 o
! b" L- Z6 ~# z1 @: K/ {5 Z) T! D) c/ [$ J# o
函数模板使用示例:
% n" a3 I( A' m0 K1 e6 Y在以上那段代码的后面加上以下代码:
9 h! a$ x! I; y- H+ G
4 y( n# A" o& {' H7 Y
7 f# B& M# O& u N4 \+ t, ?! \; P" q! T' j4 j
程序代码: ' ^& Q( g/ Q- _
- Q! w& Q) }0 \' E7 H* s) d1 N1 w$ U
#include<strstream>4 p8 H% L+ y4 P( w. k
#include<iostream>
, S$ j: \; g! K$ O/ X* W#include<string>
8 ?% J8 L- L; U% b# eusing namespace std;
9 I. O$ Z( _9 |int main(void)
. m' U' s5 E( i3 _{7 x4 q& i" ^, |7 g0 i+ }
string s1;
$ x( G9 O! L4 s# g1 F% a0 p( O1 m while(cin>>s1)2 [& W. w8 ]9 K, e5 B0 K J
{( m/ d7 [# N7 g+ t
istrstream isin(s1.data());: w3 b9 X1 X6 H6 V; T
double d;3 Y* w! W4 F1 V+ ^! o
if(fy_Exp::GetExpValue(isin, d))
5 Q! |. P" u! Z* d- c {: `; W2 e* ^$ X) {7 L
cout<<d<<endl;" t4 K. K, `6 @' ]* x
}
1 X# T: O: w+ Q( o else
* h% a, O7 f( \ {
( `5 @3 Y% E$ n( { cout<<"ERROR"<<endl;
) w6 V0 {& ]! f; E2 n' G }
) J# R1 L8 `9 [- _) n9 w }
. ^' c# t$ M: m' i6 o return 0;3 O! e7 U* ?4 }: f+ V
}/ G- u4 G5 k( C, F: d% v. C
, d9 H0 e3 F. F) N% j" `3 L
9 m; s& h) _8 _6 U$ i然后编译执行就可以了(*^_^*)
- \: g- N1 ]& v: `其它:TC++上一定编译错误,不保证在VC6上也能通过编译" D! S) w2 L( m' ?+ `( |
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|