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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
3 R. d0 d9 o" i7 B. V% ], a/ A一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) f& B" I& U- B U6 ^+ m. {0 l只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
+ J, a3 G2 g. ^; N) H W! p参数解释:/ q# R) v( f4 X) P- r5 h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 f2 d$ Z& P. W/ V0 anReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 `, F& X4 \! w+ p6 u* o返回值:. U3 l3 i$ y8 a: R) J/ ]
返回非0表示计算成功,0表示计算失败有错误
0 S0 D) A3 @5 y% M
9 t. Q y4 I1 h* g' Z3 T/ `9 A
( b( b5 s, L2 m5 }/ E
( a1 B9 p, v6 h7 P& f程序代码: : ]0 D; @# ?7 [# j
# s- v2 j6 x) c( i6 w; k% h2 cnamespace fy_Exp{# c' a' M, _1 y0 I
namespace {template <class _T>2 X: L6 Y8 l0 g' ?$ _4 S* Q- q
inline _T GetExpValue(_T t[], char& csym){
/ M9 F* u4 k$ Z L, ] char c=csym; csym=0;
$ A% J; O7 e: [4 u- L) g* T switch(c){
* e3 A/ r1 H& I+ y- D case '+':return t[0] += t[1];
0 t% Q* s" }, P" t; t& D* ] case '-':return t[0] -= t[1];. r4 @ @9 q9 p; k
case '*':return t[0] *= t[1];
E( \* U- J8 @ default: return t[0] /= t[1];//case '/':! h9 c, }9 N$ X: w
}
a5 V' H. w( f6 {" r5 b. N! C# P}}
( {# R- _) P& b9 p2 ~, ^3 Utemplate <class _T, class _Tstream>, `8 S) B) Q3 V
/* _Tstream: inputstream, _T: get return value; N; F5 [+ C b$ i3 g
* Return nonzero if get value successfully */* R7 ?/ H* c& \+ p X) D
int GetExpValue(_Tstream& istrin, _T& nReturn){) e2 g8 z- U! Z5 ~! t9 ~5 P7 H
_T t[3] = {0}; //雨中飞燕之作
+ R) |) G: Z& z+ F- N- s* k& x$ m char csym[3] = "++";
" J0 t( t3 h3 \: } int nLevel = 1, nERR = 0;
: g8 Q1 W0 d5 I8 l: |. {4 o0 w7 R- I if(!(istrin>>t[1]))istrin.clear();4 \) v( K# C& s5 |
for(;;){8 U; r# d2 }! }. s( Q! @9 o
if(istrin>>csym[2]){
/ M/ t4 t H! @2 O1 m switch(csym[2]){
, l7 B- G8 z" j5 F4 s# K case '(':" `% B& z( p$ @ A" X+ _4 J" o' b
if(!csym[1]){nLevel=0x100; nERR=1;}else7 u) A/ U! J2 k) _* K
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) {) q% O. o, D9 B8 N else{nLevel=0x100; nERR=1;}
# U8 U- j( x" }) S2 `' c break;
o' A+ E' s2 j; G, a8 e case ')':- S* m2 ?6 Z' O
{nLevel = 0x100;}break;* Y9 P1 Z2 h7 T& m
case '+':case '-':case '*':case '/':
6 e4 }0 v9 Q8 Y- I {csym[nLevel++] = csym[2];}break;
* G% c( R. d1 j2 n case ' ':case '\r':case '\n':case '\t':continue;$ L u3 A e4 ~. t
default:
( N1 U/ t B6 { ^$ { e9 I3 A {nLevel=0x100; nERR=1;}
# D# W# S* z x3 C, I }4 j4 [+ W% O6 @- v" S. s
if(nLevel==0x100)break;
! q# A3 [+ P' E- q8 M/ @ if(nLevel&0x10 || istrin>>t[2]){- @$ s( x" X' [. l/ J/ ]1 N
nLevel &= 0xF;
9 b. v8 |$ X! U2 H: B if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}/ m% z3 }0 ?. p7 P U
if(csym[1]=='*'||csym[1]=='/'){5 `" T$ y. q7 E1 A! C4 w
GetExpValue(t+1, csym[1]);
) L+ u7 O5 o z$ f9 m) T! C; h }% `0 P0 b' e/ M* y! ~% ~" U" Y
else{
: ]. e# l# h1 ` GetExpValue(t, csym[0]);
: T! Z7 K1 A; v$ q$ P) S- Y7 q t[1]=t[2];csym[0]=csym[1];csym[1]=0;$ p# W4 ^$ d! o7 t/ j& H5 E
}
6 I# Y& P- V( c nLevel = 1;3 o! p) t" b; w
}- O$ f- o5 U! C
else istrin.clear();
) r5 _) H/ P* O# a; l( N }
}1 D+ w* `$ p3 p1 ~& T o. N else{nERR = -1; break;}! l8 W2 z8 c4 j5 l3 E8 Y) q$ k
}
; d. r0 G4 |* `9 ]1 {5 @ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
% b6 S/ Z. C- c3 P, D else nReturn=GetExpValue(t, csym[0]);' \3 `( ~2 F4 |
return nERR==-1?1:0;
' [4 m8 h5 U4 V2 Y}}
8 H: X) P' y5 x( X, I q( `9 b/ n* g- ?9 ?) n
5 b' Z4 V& X/ o9 k) D/ e
$ Z4 J; W& i n3 I( k+ {# _+ v函数模板使用示例:
9 t' F7 y( A8 N/ k6 |在以上那段代码的后面加上以下代码:$ ^: `. C3 k* D' y5 u) [3 K, I
5 p" L' _3 u( V. l: I# M( ~* m & D0 B1 _6 V$ }) X t
7 J( x$ G& @( |. \- G
程序代码:
0 Z8 @& d8 t2 Z* F- o; d7 l) Z$ \1 \9 @
#include<strstream>: b0 y1 j* L4 S* H: l
#include<iostream>
6 E/ c9 w% ~4 r! }% n. K#include<string>
, m- ?! t7 {8 s' Zusing namespace std;
( ^! S( j% V9 `int main(void)* [1 J% }' a& B
{
: y6 [0 w! o: {* Q4 L; }) u string s1;
: f% s; X* P6 r/ r6 s1 c while(cin>>s1)
- j M4 ]; E4 Z6 m. B, o# g, d {
l* a- h) U5 o: W. M3 D( N; Q2 h4 O istrstream isin(s1.data());
/ p( ]$ I% ^3 j( r double d;
; H- j* q" C7 J7 T if(fy_Exp::GetExpValue(isin, d))
: J: c8 v) U6 s3 z/ y* f9 P& ^ {5 \/ h1 o, X4 r7 m5 Z& ~' S4 o
cout<<d<<endl;
1 r4 A! S, l4 e* N5 S8 p. U }
0 E. k* p0 a" N& Y' V( G else* a% X& {: d/ ~ z& \
{& U. x. z/ t, Z) r7 G
cout<<"ERROR"<<endl;2 s9 Q& W8 Q1 N0 ^* W; {+ a9 V
}
/ p8 p# y1 V+ w6 R+ x } i2 F& r3 B( _' a' m
return 0;
! [* `; o8 i+ A! J% A& k+ P- ?2 l7 I}; b9 i1 C+ N& [6 R% @* _4 {
* a" N& ^- a6 _6 a! C
: O" { z! u i9 w2 G i. {) N然后编译执行就可以了(*^_^*)
: S) e! o8 x. N1 L. L& M$ w5 @其它:TC++上一定编译错误,不保证在VC6上也能通过编译, U2 w1 \: X$ V4 q
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|