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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
2 Q4 _) j# w$ G( T7 f$ P; c一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' ?' T+ X$ e; z: R. _只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ D) x* a9 d3 ~) b+ i2 L
参数解释:
, F0 K8 J1 j' }$ jistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 j" E( F( |: w% I1 ^$ BnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
% c7 e0 I8 I8 d3 o& x返回值:" c H5 s* U, ^8 Z+ M% t
返回非0表示计算成功,0表示计算失败有错误! J/ Y) u' i! l# I
3 e. d4 {& D. Q2 A# l1 i
3 ^1 F) A) d6 G0 l9 u1 U' V6 [# }( r( _! F9 f2 Y
程序代码: ' x$ u0 L7 U; Y3 k4 ^8 P
& j$ V, }# B- q \$ ?) s2 Nnamespace fy_Exp{/ U u* B' |- `5 N8 S
namespace {template <class _T>, ^# y; m$ u8 ~; h+ B [ @$ F) ^: T
inline _T GetExpValue(_T t[], char& csym){! z3 }. s& a6 j- T, x7 o
char c=csym; csym=0;
8 U4 Y6 |8 _1 k4 L2 E switch(c){6 s( q$ U7 z3 |
case '+':return t[0] += t[1];3 o4 y8 {! y- w" E
case '-':return t[0] -= t[1];
/ Z, }9 V. a# L6 D% | case '*':return t[0] *= t[1];: P1 y% S0 Q9 z( U0 |, q
default: return t[0] /= t[1];//case '/':
) c- ?# @+ |$ P" i1 V# ^ }! |5 n2 X# D S3 Y1 u- `
}}8 |8 F9 p) m* b7 v2 {0 e/ h
template <class _T, class _Tstream>
! q6 ]2 o4 C6 |- P& ^: B/* _Tstream: inputstream, _T: get return value
' C* q. J! _- Y# o* Return nonzero if get value successfully */
$ k1 p* C/ A G) yint GetExpValue(_Tstream& istrin, _T& nReturn){
) n. D% m3 P: U" t9 S) i) d _T t[3] = {0}; //雨中飞燕之作
" B8 K( y# r9 K+ } char csym[3] = "++";
) I! G m+ ]3 n4 i# [( u int nLevel = 1, nERR = 0;
# I6 D/ Y9 x! t& \ if(!(istrin>>t[1]))istrin.clear();
; B; ?7 z9 [. x; X3 K, Y for(;;){- t: ]$ y# D7 r& L2 @+ c4 I+ k
if(istrin>>csym[2]){' s1 }; X* [ @; x0 f
switch(csym[2]){
5 Q4 n4 u# q: Y/ K case '(':, ?+ ~% V4 g, q8 I5 k- |; I
if(!csym[1]){nLevel=0x100; nERR=1;}else$ l2 [. ?& x& B$ J& e3 d
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
* ?6 C; v' B9 v, Z. G1 [6 u else{nLevel=0x100; nERR=1;}. F8 d# w; N! N1 x3 }
break;$ p9 K8 Q% W$ ]1 L! K
case ')':
) r" z" e: m- d3 x. g {nLevel = 0x100;}break;
- m/ O! {# v/ b6 A. F1 c5 z case '+':case '-':case '*':case '/':( L" o# R$ ~$ I- \5 n
{csym[nLevel++] = csym[2];}break;
9 {! ^8 T2 `7 G. B case ' ':case '\r':case '\n':case '\t':continue;8 l7 Y3 r4 h5 Q
default:
, e5 j; Q+ n2 z$ [: y1 g7 {. X {nLevel=0x100; nERR=1;}" H7 u4 h# P4 L* P! j7 H, X% `; F
}
" g) }8 V' g$ o/ U if(nLevel==0x100)break;0 [, G" L7 X+ u
if(nLevel&0x10 || istrin>>t[2]){+ ]5 A `1 X! g$ L% o3 g- v
nLevel &= 0xF; o! E& f8 O$ i
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; B: x. X9 H/ a1 |3 [( T if(csym[1]=='*'||csym[1]=='/'){5 J: Y0 J' k( p- `" `/ _% q
GetExpValue(t+1, csym[1]);- p3 ]4 C! ^/ [: k8 l7 `+ i
}
. n: {& m8 l' ?0 L else{
! \: f' b& V% ?3 N# m! T GetExpValue(t, csym[0]);
2 E. V x# O2 f t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& z7 D' d3 u% Y }
. g( J- q1 n( | L o nLevel = 1;. y ^$ m7 {9 s( u8 y$ P8 T$ p8 U L
}
7 u0 T7 R' i+ A3 P U/ ~ else istrin.clear();; J8 i, }) }4 {: c$ n1 o
}8 N+ h* \, M+ T0 o1 _' Y0 z
else{nERR = -1; break;}
; T9 X/ }4 h& z; z5 F7 b5 d! G/ b }. X3 D* {% `4 f, [" ~
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" A: @" O+ i% f1 S! T7 I) P else nReturn=GetExpValue(t, csym[0]);
( t$ v% O0 I- n return nERR==-1?1:0;
; |3 I4 Y |- L}}4 f$ C- ~. ?+ S) r
3 `: y( O3 M1 d' l5 t `; ]" a0 m1 @1 [9 j; b$ W4 j4 y' K9 B5 ?
+ i% N$ R3 i1 R& w
函数模板使用示例:
/ @0 h1 H9 y+ L, U# ]2 e i& p. C在以上那段代码的后面加上以下代码:1 R; O$ [8 A$ J# ?6 K/ j
) M& ^( N; z( z o# Q& U1 l( f, w* [
# i E/ C: n* [3 u5 F) _5 v5 E* M* k. r8 N
程序代码:
1 k: k! s+ F" K* P: h6 l' o
5 V2 e" }* F3 r) ^! w' @; p2 {0 N#include<strstream>/ J/ e- m8 f7 X& {
#include<iostream>
5 V# d w$ v& x#include<string>
) q) y) T: j5 G5 e% X: j' {using namespace std;
; v( h, T5 X0 } O! r; x3 Fint main(void)
8 H8 _0 I8 G1 U, \9 g{9 K0 M7 x9 p+ e$ V' t" @' Z
string s1;
' }% L0 A5 Z; l3 U! Z+ S while(cin>>s1). e4 G* s) q2 {! X
{
7 f" ]% a/ C# w istrstream isin(s1.data());
3 v, P+ i, y8 _4 Q9 o. E double d;, A6 y4 i" Q5 \1 D( r! |" p
if(fy_Exp::GetExpValue(isin, d))
% t) Z6 z4 u* z {
& n( B& h* v0 b$ v cout<<d<<endl;
" V; a* O+ G* o# V3 I }) }* ~5 Y6 E! _4 x: y# H9 |1 h
else8 D9 @, Q( L. A" L
{ O( v2 n P5 u
cout<<"ERROR"<<endl;
% v% n6 W* c: }1 M% x' | }
1 _6 U4 Y& K- D }
5 Y8 E5 P; E/ N return 0;
2 V2 `5 @: t ^% g}
" X! Q4 A' t1 ~, v. N7 I9 P0 r; v; d# x( @! R) [/ P0 H+ A
' F8 _6 j5 n# e5 a( r4 P. B2 X0 q
然后编译执行就可以了(*^_^*)
' B& |0 ~0 }1 C( ^其它:TC++上一定编译错误,不保证在VC6上也能通过编译- ^) `. o6 q6 L" T Z
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|