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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,5 n, v! L$ \. A1 R' B
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! y9 E5 {/ P( O9 d* ?) E* G, [ |# S
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 C& z2 q, L+ U Z& k8 f
参数解释:( `# `' Q% B b. V% H/ ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
! B1 q2 j5 T' h( ZnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定/ X! y" a. B# W- w8 s2 F+ ?" V- R' m
返回值:
) F$ i4 J0 L7 {, `返回非0表示计算成功,0表示计算失败有错误- h6 i |7 F; r7 n9 L: _ f
! C3 M: W4 Y5 c7 t5 M
" ]( J; T& Y( t7 @
! }0 b! k5 U+ S9 q8 a! O% I程序代码:
/ \1 X# [. Q* j+ R; y6 |. z! D. {7 Q" Z8 C' \7 j' B
namespace fy_Exp{0 S* q" C8 u9 X; D
namespace {template <class _T>
( F9 ^+ M/ ]6 x( _( c# h2 d7 tinline _T GetExpValue(_T t[], char& csym){
* f8 t: n) H" w! a char c=csym; csym=0;
3 u" b( K3 d" a+ T+ n* K switch(c){
. H; z( E" ?) V$ G6 M; M: ] case '+':return t[0] += t[1];
* }" i, C8 h @& V2 W case '-':return t[0] -= t[1];
' t0 t; s, m# {0 A6 \" w" { case '*':return t[0] *= t[1];* R" q }% Z8 b$ o9 f2 V
default: return t[0] /= t[1];//case '/':. k) k3 y) _3 d# w# p
}6 |, N/ V* D2 n( Q8 k/ s
}}# I; E0 R- e0 M; F" e
template <class _T, class _Tstream>2 Q+ c1 K. c. `' [! S, w2 r0 W
/* _Tstream: inputstream, _T: get return value* ^) l1 T( ]. v7 e, d* W; i6 I
* Return nonzero if get value successfully */
0 w7 b. W! \1 w* aint GetExpValue(_Tstream& istrin, _T& nReturn){) L& q' u3 C6 L/ B: `2 _$ a' e- U
_T t[3] = {0}; //雨中飞燕之作5 `2 i% L4 x7 b( L/ O D
char csym[3] = "++";
7 Z$ I# F& f& l* h& ? o; y int nLevel = 1, nERR = 0;
( F/ t0 a1 B1 a if(!(istrin>>t[1]))istrin.clear();
: ?& `4 }0 }& ^& q% m' ~( x6 r for(;;){
) A T! o+ s# f if(istrin>>csym[2]){
5 q E; z* Y/ M( I2 E switch(csym[2]){
: P- Q) n3 c3 a case '(':# i4 h/ c% { V
if(!csym[1]){nLevel=0x100; nERR=1;}else u" [8 M/ N& F" S" R
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 k+ M# F! E% t! X) x9 N, I# P' K
else{nLevel=0x100; nERR=1;}8 a8 z( B y4 X4 k S
break;+ d7 F( x8 @4 m# p# y% a( W% J
case ')':
' Q) B8 c/ u& b {nLevel = 0x100;}break;
# H9 A: M+ S! d# ~% {1 W' \* b6 r) D case '+':case '-':case '*':case '/':% k4 B& ]5 a9 B) c! s! Y
{csym[nLevel++] = csym[2];}break;, ^2 |: ^4 }; m. a4 e9 \( `3 r
case ' ':case '\r':case '\n':case '\t':continue;
! H2 o1 [1 ~4 Q ?$ b! V( t7 k default:
9 c( e! A/ V, Q8 W" Q3 J2 ` {nLevel=0x100; nERR=1;}- R* N6 w- V' J& A$ @+ b, a1 K
}1 t. T6 G: m% n2 @2 Q
if(nLevel==0x100)break;
; [3 r6 u' Y4 ?+ Q# x if(nLevel&0x10 || istrin>>t[2]){
% b2 P8 S& {1 P8 ~3 F1 ], D nLevel &= 0xF;
6 C2 s+ g5 ^8 b$ z" c. w if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. t( |2 Z' T9 ~) h/ a: M& s4 g if(csym[1]=='*'||csym[1]=='/'){7 o- L' A' |# c8 y7 L) {0 K2 V! P
GetExpValue(t+1, csym[1]);
* x$ W8 \0 R- T' v }8 T) [' a* L/ Q, K" u
else{; S% l$ f' F0 c' C
GetExpValue(t, csym[0]);
# {6 u4 Q! {4 |1 R$ K ]8 F) R, `: o t[1]=t[2];csym[0]=csym[1];csym[1]=0;: p4 a0 j( V% v3 B
}
8 {' O, C) p; c+ c nLevel = 1;
) k, Z8 ?$ M, x }
6 h: B9 r: V' p: U; \; q s. a% t else istrin.clear();
6 I7 i" s. c+ e$ `% W" F }
: y" J+ `& U ^2 }& M5 ] else{nERR = -1; break;}
" U0 ?. h0 ]+ f( m+ F }, a: o8 b; c, g4 I& c2 M
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);* J: T4 L. Z& e/ |/ y
else nReturn=GetExpValue(t, csym[0]);
0 d( a- y$ a( K9 v8 i return nERR==-1?1:0;1 C+ {" v6 F4 c S1 d6 R
}} s* W9 s3 x A- r/ i d
! U+ m! `/ m0 y4 E2 a+ N) ~8 x- W% \6 E. u7 R1 E
, a" I9 Q+ b4 C4 c函数模板使用示例:" J) T% b4 M5 u3 t0 C; O
在以上那段代码的后面加上以下代码:/ I. k/ ^6 R9 p! k7 M% Y
' B3 S& P" ~ {, E
$ Q# ^' |0 O2 o1 P' K+ ?: d
1 G1 c0 Q. X, ?# l- @5 ~程序代码:
$ C8 f n; I# G. E6 \ s5 ?) R. @% r& h, D( S
#include<strstream>- f1 ` M$ C4 }
#include<iostream>6 g6 h' r2 B& V/ t7 M( g+ q- P
#include<string>
, ]3 n2 `7 c. l' ^" R/ vusing namespace std;: e+ y" ~1 N; J0 z1 A
int main(void)
9 d6 Z5 e. Z: A- H! {. _{$ o! o* ~# |4 T, Z) X2 S+ ~/ |( x
string s1;
7 j4 p- S7 |- ` u. b5 o5 s while(cin>>s1)0 D& g' {: w3 ]2 U7 o6 P. ?
{2 n4 J) X! f! _, Z1 q
istrstream isin(s1.data());
- C2 u/ b# x4 O T double d;
: d9 W2 R! s. e% C6 q if(fy_Exp::GetExpValue(isin, d))9 G# i# Z+ ~( u+ c
{3 |0 S2 I# s; x- g# ]2 J
cout<<d<<endl;! f( m7 E1 z- L( e( l( I2 A1 D
}: t6 D* |' k8 O6 M9 ^( }; R' }
else
5 p; M* a$ j' s& q% x {
1 R, R8 _( G+ G s3 b, I' ? H& y cout<<"ERROR"<<endl;
1 y ^& R2 T1 G! z# S }4 @1 O$ x8 v& g! t4 F
}
L8 c7 E& f3 r+ w return 0;
9 F( z1 W. d& f9 _+ n% t" S}+ a8 k5 _4 L) a
/ B1 m4 W; X( c S) P; n0 w7 n
}% H0 Q2 [. C+ @' `0 [2 p
然后编译执行就可以了(*^_^*)
6 m# W4 \' P% S5 _) _ U6 @其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ |" O+ d6 N# u! I2 T' H; |9 [
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|