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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,$ x# Q) G. T2 o8 k' j
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ Y. n2 o; I# e6 s; B! y只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
, w3 j1 G5 m: e& a+ g- U2 T参数解释:5 L: |* q7 M6 X& R: y% o
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 q: A; p$ ^5 U$ `nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 Z* X6 E6 t9 w9 v+ y1 z; o
返回值:) n$ }' Y$ ?, W: C& D5 G
返回非0表示计算成功,0表示计算失败有错误
5 N4 H# c! T" H2 k3 t7 y# [$ i9 h6 s7 z3 ?9 U# g% H! w
( E7 [7 `$ ]% K. ]8 o. t+ H
% c# L q6 k, r1 n: [; d) v8 x: P
程序代码: 6 _/ T5 t0 I! K3 l6 y
5 V9 _; L" d( G! A5 s
namespace fy_Exp{) _; W) ]* ^0 w! j) w
namespace {template <class _T>- b$ @" e- }7 Y; V6 T* u* c; x' t
inline _T GetExpValue(_T t[], char& csym){3 e2 n% B) `7 E- G+ c! A
char c=csym; csym=0;! V5 x0 w9 Q7 {: h! \/ n
switch(c){' T3 u& X8 N( V
case '+':return t[0] += t[1];: [+ F5 \* R5 _5 I9 L
case '-':return t[0] -= t[1];
2 v6 ~' i2 y5 W" o9 n case '*':return t[0] *= t[1];3 v7 [7 I0 @! M% P
default: return t[0] /= t[1];//case '/':
- e$ r; u/ e" _3 S! U( `' E, A }: C; P. W! W9 l/ {7 ~/ z7 R: I# i4 t
}}
" @: v1 G9 S% y# x3 ^0 i! ktemplate <class _T, class _Tstream>) G; v2 t3 `) P
/* _Tstream: inputstream, _T: get return value
7 E. G) d0 ]- X( `! A" |* Return nonzero if get value successfully */: R9 x4 X2 g8 ]+ d9 \) R
int GetExpValue(_Tstream& istrin, _T& nReturn){2 t8 q* H* _# I1 K( |
_T t[3] = {0}; //雨中飞燕之作* k6 W. u5 J5 H* W9 k
char csym[3] = "++";
* f8 P' A% t/ U7 R3 J, c/ r int nLevel = 1, nERR = 0;
( Z) F; G2 v# R1 U if(!(istrin>>t[1]))istrin.clear();* E8 o8 w+ ]/ Z( E2 b1 n, {7 e! k
for(;;){
9 T+ ~; g/ a- X! O+ [ if(istrin>>csym[2]){
* _* S( _' v/ a4 l8 ~# v8 l) g switch(csym[2]){* x* S, q6 o: E! i, |* F4 v
case '(':. h2 {* Z! J. L! M' e
if(!csym[1]){nLevel=0x100; nERR=1;}else
6 e& n1 k3 w. I& e if(!GetExpValue(istrin, t[2]))nLevel|=0x10;+ }$ Q; s) r) @" {0 m
else{nLevel=0x100; nERR=1;}/ Z; H) D3 t* h$ y6 h! f
break;
& _/ h8 Z! @) F case ')':
) X: q9 @2 q* J2 H1 ]4 r# U5 v {nLevel = 0x100;}break;# y# Z! B8 F J+ y& k# n9 Q4 z& u
case '+':case '-':case '*':case '/':
/ w2 w/ D0 F7 s7 Z {csym[nLevel++] = csym[2];}break;/ R3 j" i3 \* R$ k8 T) R
case ' ':case '\r':case '\n':case '\t':continue;
, j: q& w q0 t& h3 s* e" I) R default:
+ j2 L3 e V/ T# @# p {nLevel=0x100; nERR=1;}/ A0 o5 _* z& b+ O3 }! m c
}
( O' }' r* \/ m& ] if(nLevel==0x100)break;3 U+ c) V; z- i8 k
if(nLevel&0x10 || istrin>>t[2]){
9 f. b V+ U8 W& _+ B nLevel &= 0xF;# t X6 g9 l; u4 `
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! n3 ~2 q; ~2 y6 B if(csym[1]=='*'||csym[1]=='/'){: v! ^3 A; E: U4 q( T
GetExpValue(t+1, csym[1]);( }- W6 {$ u6 y$ i+ r
}
' M& N) e6 D! o5 ~) ~7 ^6 x else{( J7 t4 Y6 x. S! N5 c, o5 p8 u
GetExpValue(t, csym[0]);
7 }' E% s- L' I& y9 d$ e8 i9 Q$ ~ t[1]=t[2];csym[0]=csym[1];csym[1]=0;) k# R+ h& z A: w5 d
}1 t. ?* ]4 [, k3 [" ^5 ~
nLevel = 1;# v% T# t0 n; e1 ^# \+ U# s& }& \
}+ T( |0 ^9 `8 t
else istrin.clear();
/ J3 N8 _! V* U6 { n% z }
9 W9 N& C6 F7 `. h& ^) `4 o else{nERR = -1; break;}
( R S A8 i8 L, B4 L5 o }
, {4 }5 k0 p, S" V, V! U* c if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 T+ }, i8 [* W j4 a
else nReturn=GetExpValue(t, csym[0]);
( c4 F7 z3 G: M; v return nERR==-1?1:0;
. M2 D* `5 P2 J, H}}: {) [! c* x! s5 m I h8 m2 t9 Q
4 N3 q7 @1 P: [, B! n9 j7 K0 e
0 k, z( G8 j: t! b" L* X
! E# O+ ~$ B* L# Z
函数模板使用示例:( V6 q9 F( U6 J, d1 k
在以上那段代码的后面加上以下代码: N1 ]- e( Q I! c
4 Q6 `/ }4 e$ g/ n
m4 X; S$ C5 z, @& ?- c
`3 Z6 H' \& N% E- Y程序代码: 0 v0 e5 e: H5 [
# K3 n2 O) z8 ~ i4 m9 [#include<strstream>0 `4 N. r1 n4 C& H( v
#include<iostream>
( a; N) t" J9 g6 i#include<string>
0 h7 J& G" \2 Uusing namespace std;3 q$ R+ t4 b) ~% B" O
int main(void)
8 T6 n4 F% w9 V2 h* S" u" U{( r( E) @9 M+ W Z
string s1;
6 f+ k, D* a$ N while(cin>>s1)
5 _. J+ F7 W5 Z( \) z {
+ Q/ U) Y1 ^- j u8 }5 U# X: o istrstream isin(s1.data());
6 _! A1 V$ Y* T0 t2 X2 ^ double d;
6 ~9 T4 x" b4 O4 d( y' X if(fy_Exp::GetExpValue(isin, d))7 m, m# Y: z2 B! |
{% ]$ G# E! G) [
cout<<d<<endl;
1 L: {' V* I/ S5 y( d D }, j0 W: Y5 g/ V& e P1 n! E
else
1 O( V/ c( K) o5 a2 {3 g {6 c/ e4 S2 N; N2 F
cout<<"ERROR"<<endl;. d& ^ o7 y3 ?3 S; ]! T! T
}
: q2 e1 r X# m# X- ]( p }! i/ t+ r l+ d- g2 D
return 0;! c9 ?$ V: T9 a5 Y) d& a; ^# u
}
& T1 p0 o( j! @+ }" x: X% T$ m% ~
% g& H e7 B* L3 w1 L% H3 a$ q6 Q5 b& s- G
然后编译执行就可以了(*^_^*)
- P) W/ S/ l$ G/ b# I% C* O其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 `0 e4 a7 v. D0 `# e* T 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|