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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,8 H1 j! J- s' C( r( u
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式 \4 c D6 O: }# X7 v# z" c6 Q; u
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); S! D5 t! N+ J
参数解释:* p0 {' N0 R G4 G
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流/ t' T" }+ t: ^/ C& G
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 @- g% v, e/ T
返回值:
h' V8 ? x( W) N, K; u返回非0表示计算成功,0表示计算失败有错误- ?+ {8 T! s ^; m0 i) K3 j; _
0 }5 p' Z$ P$ n7 A) _6 ]
, _ p4 \8 ^6 [" L+ `$ D4 p: l
# T, L1 o' }0 C& Y" ]0 I1 K
程序代码:
' j% C8 z5 C9 L2 B
$ i; \* K! i! N' Y+ Z$ f5 c. Lnamespace fy_Exp{
1 ~ r- K0 X9 V1 _namespace {template <class _T># R! L. t) g$ k4 d7 T# a1 V
inline _T GetExpValue(_T t[], char& csym){
4 ]& r( Z& Q4 u& U- @# k8 K5 ?: L char c=csym; csym=0;
8 Z: J8 Z* u& l1 P H switch(c){# _9 }4 M& f3 _9 y2 \2 x
case '+':return t[0] += t[1];! b; o1 X9 D" e" O& y! u
case '-':return t[0] -= t[1];5 i t% N* | G: [4 u9 \6 [% P
case '*':return t[0] *= t[1];
$ U3 j Q8 @" x0 q$ `( } default: return t[0] /= t[1];//case '/':9 B4 f& m! f$ F# E4 c
}- e0 o' c& p- L$ g
}}/ h9 N3 o$ c% i6 x: [
template <class _T, class _Tstream>" D7 ], y" w+ k8 V, `. s
/* _Tstream: inputstream, _T: get return value3 Z1 H7 C: Q; R. k
* Return nonzero if get value successfully */
# y5 N5 X0 j1 _int GetExpValue(_Tstream& istrin, _T& nReturn){
- _8 A- _( s9 c. t9 \. d _T t[3] = {0}; //雨中飞燕之作
& r8 N7 s$ U5 o$ p3 N% i- O& ^ char csym[3] = "++";% H/ v/ n: [9 a- k
int nLevel = 1, nERR = 0;6 P+ X$ P+ |' f+ E1 |
if(!(istrin>>t[1]))istrin.clear();
$ h& e2 u5 l5 g/ d for(;;){
, W" B9 v" K! X+ O9 C/ p. [ if(istrin>>csym[2]){
6 H4 a3 n" f: W switch(csym[2]){0 c6 C& x; @. L: B# N
case '(':
. T2 \5 C K+ ~* Q- \* H if(!csym[1]){nLevel=0x100; nERR=1;}else
2 ]0 A$ ?+ I3 W6 R+ R* y7 e if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
k, ~: z% U% I$ b2 p4 ^* m else{nLevel=0x100; nERR=1;}
6 M K8 f( F3 b R Q( ?$ m0 b9 P break;9 p$ N2 M( R5 Y4 e
case ')':
. p+ f7 o$ d+ W3 T {nLevel = 0x100;}break;
+ s' [5 c" G0 Z" _" A/ ? case '+':case '-':case '*':case '/':5 {" x$ e$ f k, f2 s$ {3 t
{csym[nLevel++] = csym[2];}break;
' u3 w5 @0 ~: `+ z& ^8 m9 P l: f: G. v case ' ':case '\r':case '\n':case '\t':continue;5 m9 \) S& P# v" _4 r. G
default:8 ? K+ z. M" C; A0 J2 J, g$ N% q1 g
{nLevel=0x100; nERR=1;}+ h( A9 ^, h, B4 C
}/ O, e. Q. J, F: x! `2 G7 q8 H
if(nLevel==0x100)break;
X9 m8 [0 T5 y; s% ^" C" c& B if(nLevel&0x10 || istrin>>t[2]){% M! N* c' e1 Z( r/ ^8 [
nLevel &= 0xF;
; Y) G+ w* _1 V/ X if(nLevel==1){t[1]=t[2];csym[1]=0;continue;} }$ j4 w6 N6 P: N! N5 Z
if(csym[1]=='*'||csym[1]=='/'){7 A: e/ |5 ~& E" c
GetExpValue(t+1, csym[1]);1 r, O$ T# h' Z
}7 k7 v1 ^3 h" r8 H* U2 M6 D
else{$ Y& M [) }$ u9 a' C8 t3 g5 e
GetExpValue(t, csym[0]);/ G+ _# @% @% O! N) k8 D/ e" ?
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
; k9 y/ Z9 t2 J# y$ S0 D6 u0 r }
& j, T* x; K7 n0 P3 M nLevel = 1;) a9 e1 b H2 _7 d+ M
}' M) H8 z% U8 h
else istrin.clear();
$ Y7 p6 s" z* O) B. Q8 V/ _ }
9 s' |( r# I& E9 }& `- N' K else{nERR = -1; break;}- D x* c9 T: z
}0 q2 G2 D/ g; S' R: u
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ l7 w6 L0 _9 E7 s/ W% z4 t/ a
else nReturn=GetExpValue(t, csym[0]);1 R$ R9 N, j3 {, ~
return nERR==-1?1:0;- H% |: k' k9 p5 h
}}% f+ P. a. l* I5 d5 v
' L1 X0 X: f4 J/ H
( |) D* r! S% {4 T3 v6 m3 H' ~
& u$ n, P7 P9 _3 f
函数模板使用示例:
* I, p4 z/ ?% F9 i7 I( Y& ]在以上那段代码的后面加上以下代码: d' g7 S/ {$ q Z, H' Z7 O
0 \5 ^( ? ~* U2 }# a2 L
, Z3 G3 x( b, H# _
7 Y+ R7 [# S0 H! @- i1 i M程序代码:
$ R9 A: r1 J7 f3 c0 \# G; T6 w; y2 S
& m, j% F) L0 J1 d/ i# q9 H#include<strstream>3 I) Y& y, F3 N% ]5 N" A0 P2 Y3 D" z8 v
#include<iostream>
8 H* y( _' P4 Q [( Q#include<string>
6 }. W. V! }4 D! V6 zusing namespace std;9 {* o( a; }( F' B0 d/ V2 T! [
int main(void)
" }2 `) ~* H+ [* k! Q0 s% w{
( |2 c3 ?' X& b7 B string s1;/ M, Y5 x1 w9 l
while(cin>>s1)
# ^9 b% F2 m% i0 T \/ u) ] {2 e T; h- ?% y6 w% }" I5 Y
istrstream isin(s1.data());5 M% E# S% l h% u5 d! S
double d; g3 V2 @5 ^! ^
if(fy_Exp::GetExpValue(isin, d))
- d/ |2 `9 k! O( S9 s {, D, h+ s* i1 l* k6 W% r; U' o
cout<<d<<endl;& N# R3 H8 z- K9 O. ~7 q
}1 r6 L h- ]+ m: P, ~6 W
else6 C$ K( p+ I4 `$ u
{( m# M, n* n+ [4 y
cout<<"ERROR"<<endl;* g% w* f, O# H, r
}) @1 j& s6 n8 o
}
3 k# |2 l( C( E return 0;+ @0 u' [9 F: A
}8 F3 d5 R" W( R# h1 i& N
0 I/ S* m# i/ F w I
6 G% r; A D2 F+ y2 D3 Z% V# t$ A然后编译执行就可以了(*^_^*)
6 `+ |" b" |; O1 r其它:TC++上一定编译错误,不保证在VC6上也能通过编译# x6 e$ n! `- k% Y0 V# J! Q. }" U' e. q
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|