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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,4 S: D4 w: O& `) X; P7 K- p
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! V/ J8 X; u6 \3 S0 b只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2 U' X9 P: N% {8 t/ A/ m" s
参数解释:
9 @$ Z0 H% L- {istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% a8 o' y& R* u. } ?) R# B
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
& O" s; h v& z4 A8 `, I$ y9 ]- u返回值:
! T% f( U- u [* i4 E4 z返回非0表示计算成功,0表示计算失败有错误9 Z3 X5 _9 B) W! E" X
0 `+ L1 \! |+ B9 o
8 Q1 E) ~% g: M9 q) g2 }+ ~# D3 d% |0 D! t
程序代码:
) r! }! [0 x# e" ?9 k& G
9 s' f! E& }& a* k0 Q* e2 \namespace fy_Exp{
3 K* Z" E7 \6 ~- Unamespace {template <class _T>3 f8 B% x7 L; N W1 R* g& K
inline _T GetExpValue(_T t[], char& csym){! i: S4 j# o; c, _1 K4 b
char c=csym; csym=0;
, `2 o4 u9 E% X+ L/ K switch(c){
# n% U9 ^/ e @9 M case '+':return t[0] += t[1];1 e+ T x1 k' L/ z
case '-':return t[0] -= t[1];/ m6 b" C8 H4 ~7 x. t/ ^- n
case '*':return t[0] *= t[1];
- L$ P) \, Y7 s# x: A# m default: return t[0] /= t[1];//case '/':
H% O# a3 K8 Z }
& w: j; Y3 E8 s4 D) |5 Q}}
' }2 t+ N) F4 S* }template <class _T, class _Tstream>0 c- f, r" m5 u" v& E( W3 _
/* _Tstream: inputstream, _T: get return value
8 F/ ~' s' h0 K* Return nonzero if get value successfully */
) O: M! V# L% L9 Q aint GetExpValue(_Tstream& istrin, _T& nReturn){
, `/ ^ n4 e0 _ _T t[3] = {0}; //雨中飞燕之作
6 P1 E5 t% U# m# z. _8 A# U* y! M' C5 C char csym[3] = "++";7 D) G4 Q, ]- Z9 n
int nLevel = 1, nERR = 0;
+ D4 e/ I& ~& b" M2 Y& V9 } if(!(istrin>>t[1]))istrin.clear();
- x4 _& Y o: ~4 I' @ for(;;){& D$ W/ B9 C- `8 w: X2 u/ u$ R
if(istrin>>csym[2]){- t2 Z3 E5 d4 {
switch(csym[2]){1 N- u* ^# k7 \4 g( \
case '(':$ g2 V1 y9 k c
if(!csym[1]){nLevel=0x100; nERR=1;}else5 M2 y# E: p* K" r
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- v6 J+ \! ^5 I4 R* q. W) ?: P$ m8 ^
else{nLevel=0x100; nERR=1;}$ Q0 h( M* a9 b. |& j
break;
u2 y$ l2 `9 v$ i3 z case ')':
( \0 d7 @; m. N {nLevel = 0x100;}break;
- p; o3 A% o0 [2 \5 o/ h l9 g0 D case '+':case '-':case '*':case '/':/ H% Y& R' z3 I2 P
{csym[nLevel++] = csym[2];}break;& b# f8 V9 f' L/ u! D
case ' ':case '\r':case '\n':case '\t':continue;
" E& |& l) |, y5 Q" z1 C0 Z! _ default:
+ `# t b1 Z- h3 D# l- \# J {nLevel=0x100; nERR=1;}4 L# U% ^+ t7 E0 B# @7 Z. U
}- J1 ` K/ R7 A0 h3 F/ F
if(nLevel==0x100)break;9 e: }# ?9 ^6 d# Y
if(nLevel&0x10 || istrin>>t[2]){
- r' g2 @) A4 X) o6 p) p nLevel &= 0xF;/ p, b& g/ {+ P# ^1 _: B7 C# V
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 D5 [$ B5 o% Q, ]& F0 N
if(csym[1]=='*'||csym[1]=='/'){# \6 O/ n/ r4 L$ l
GetExpValue(t+1, csym[1]);
' v4 R3 f: c$ L, ]1 q# {1 g1 Z } o6 } F2 ?4 Z8 l% D; W
else{
) u1 r5 d% m2 p$ O GetExpValue(t, csym[0]);8 F9 s4 Y, h1 |4 w+ M' e
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
% ^9 j0 U( ?. d0 ^) Y; k } H: \: F; Y, C
nLevel = 1;
! J; q- B8 g2 G' H5 l& D }
: R6 T4 K$ I' n: ~, } else istrin.clear();
2 D; a$ {4 w0 z5 G }
& X# ^& E6 u/ U2 |& i4 Q else{nERR = -1; break;}
: Q1 ~/ C7 Z9 A6 O: B. g0 @ }% W0 A! G, a+ Z* p1 W r
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, G( M1 p }7 E, ?" h1 f" O else nReturn=GetExpValue(t, csym[0]);0 q A8 @7 p4 ]# s6 X5 s5 d: Q
return nERR==-1?1:0;/ q6 q$ w& g' m$ P9 u; Q: n/ v: D$ p( J
}}2 a; X ]) b _5 ?1 t3 y( y C* Q
4 B" m, q8 l( j5 k$ L. `& ]
9 C. V! w8 Y9 x1 f+ ^' P2 K& n, U: y8 G9 p5 D5 d
函数模板使用示例:( W7 U( x( c' E" k- ~1 n
在以上那段代码的后面加上以下代码:
! ~/ u" Y8 H$ T1 t: a& l7 t, ]8 |3 r2 `6 a1 u
: T- [( M. J8 ?& B- B
" K% n6 Q+ Y' N- I% N' y: V程序代码: 5 m' t1 m* h- {7 X0 Z' D
! f6 \& E% X2 U+ |: a
#include<strstream>
& P ~9 U$ n7 t) g0 x! H$ M#include<iostream>0 C7 s" k- C, b
#include<string>8 ?7 U. J5 S: [8 C7 y1 [5 E
using namespace std;
) u* s" }" m7 H* G( q# I' Mint main(void)6 e$ ?/ e/ @3 x% [' M4 A
{( ]: [6 Q0 w1 i1 B* g
string s1;1 m4 U3 ]! K. l1 y
while(cin>>s1)
% m" S/ N, s8 S { r! ^/ M3 |- S6 [: \$ Y& C
istrstream isin(s1.data());2 k; W; R# e/ D+ [
double d;
; n' f9 f5 s! w) ]6 M. Z if(fy_Exp::GetExpValue(isin, d))
% c6 C- a7 q2 H {6 ^) j$ X. Z$ j1 G- W* I2 e
cout<<d<<endl;6 O7 q+ {0 J7 [
}3 H* ~& M6 D1 E4 [, t3 S3 k
else
( J; n4 W n5 j% n8 z1 Q2 Q {9 J/ {3 r0 z: }9 c+ ?! Y
cout<<"ERROR"<<endl;
+ E( p H% m. X" b: i }
# I u( G- W) l8 B/ a }
8 [ e; q9 M( S: |8 L1 B Y return 0;
% r/ p0 v2 \, ]# Y6 c) l}
5 ]2 G4 h- v- ]* c# U( B+ Q3 ?6 |' b" s: i& v
0 [1 a$ S& w* g) f% K
然后编译执行就可以了(*^_^*)
7 e; \% z6 b U# g其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% R3 O. M+ e% U1 f5 B8 ]7 D 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|