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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
2 b. p. b# R% i$ X0 K- ]3 ^一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' y; H4 |# b) J6 S$ k! O) v# n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! @3 U. W2 ?0 r9 \9 P6 k4 ]
参数解释:/ ~; O" ~: b7 I/ X( d8 y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
% {- u# n2 v) Z& a$ N& D( ^nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: U/ n; A# m0 E' Z" {
返回值:
% }2 G7 X2 U6 }9 e0 K返回非0表示计算成功,0表示计算失败有错误
^6 Y, t4 z6 |8 o
: q" i. p0 c6 |& q# U; G " Y( g p& e0 N# K- R
' r: F7 ]5 N# F! F! `3 G( O0 _( J
程序代码:
: n8 w, c* R" e% ~0 t% E8 b- b& l4 Y# l6 S0 u. y
namespace fy_Exp{
+ Y0 v) d5 ?+ y( ]! K4 w) x6 k" Inamespace {template <class _T>7 |" t- o6 i4 u: [
inline _T GetExpValue(_T t[], char& csym){& m5 i8 e. X) K! d4 e- h
char c=csym; csym=0;7 @2 v% N* ~) y t
switch(c){9 u3 C" X% l( s x
case '+':return t[0] += t[1];& A5 }* Y) n6 V0 i* I9 @4 ` g
case '-':return t[0] -= t[1];
1 {) `5 o2 e4 ` case '*':return t[0] *= t[1];
7 V$ E. b$ I3 c$ t# v default: return t[0] /= t[1];//case '/':' s9 G2 O, y5 Q* f, |1 A% i. r
}
9 m$ c) j+ t9 p8 ^4 Z% H}}
! M! z8 P8 e8 F' ~/ y$ {+ Gtemplate <class _T, class _Tstream>
" e m9 Z& n* f9 B# a/* _Tstream: inputstream, _T: get return value. ~! h4 i2 g' K! r
* Return nonzero if get value successfully */, C ^! |( V. m2 a" G. [. Y2 x
int GetExpValue(_Tstream& istrin, _T& nReturn){
/ {* P# A1 l' v3 R1 p _T t[3] = {0}; //雨中飞燕之作
/ \9 k5 q) ^$ O$ ?2 ~ char csym[3] = "++";
& N3 J& z- n' }7 } int nLevel = 1, nERR = 0;
, J: s+ T% ]8 `; {+ v0 @ if(!(istrin>>t[1]))istrin.clear();# Y: a: c6 k. L
for(;;){; I1 \5 l6 ^# }8 ~. f2 o! F
if(istrin>>csym[2]){: h. M4 \: r1 A% v
switch(csym[2]){/ m4 t9 M7 ?3 ]
case '(':
. [0 \) R- w% U% n if(!csym[1]){nLevel=0x100; nERR=1;}else
& F: L3 R0 c* `6 g5 q# U if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ X4 [/ x, R- t" H else{nLevel=0x100; nERR=1;}5 Z9 J8 t0 T9 Z4 |$ T9 ~7 Q- q
break;
4 _8 W1 f( @' i! {% u8 B. j case ')':3 H& P( p9 |7 \" A5 g7 K, g
{nLevel = 0x100;}break;
2 R3 H$ q' s" d; X, M5 ?& R6 r case '+':case '-':case '*':case '/':
' T; v, ~8 D0 g `4 C/ G {csym[nLevel++] = csym[2];}break;/ ^, C) O/ T, v( l3 b
case ' ':case '\r':case '\n':case '\t':continue;
6 W& K% k$ S+ |. _2 d' \* M- p- m8 J7 | default:
5 u2 |5 V/ J$ x$ r5 _ {nLevel=0x100; nERR=1;}$ m* Z, T$ A9 _/ h
}8 ^# L1 o4 O- w( j# w6 R! i
if(nLevel==0x100)break;4 e! j6 c$ H. @9 E) M8 j- \
if(nLevel&0x10 || istrin>>t[2]){
( p$ a4 i' g9 N3 v6 B nLevel &= 0xF;- h& { H* h* I& l$ U( y1 w
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, u5 k# G# t( {& t$ C0 t
if(csym[1]=='*'||csym[1]=='/'){/ a* L- n6 j L% J6 s
GetExpValue(t+1, csym[1]);/ y9 s( ~$ z, _- } j; e! ?
}) z6 g j) m+ a; o! h/ {% }
else{. Z4 p$ U8 \: a- n8 | \1 Q" ^6 R
GetExpValue(t, csym[0]);- G$ N" f1 B5 C% z& j- K5 |: |
t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 _. Q% O# y. `" Z- B
}- z, i( n7 {. Y. e7 E& t$ N
nLevel = 1;! r1 H$ \7 O9 M. H* ?, M5 \& W
} W4 I# Z6 q) V1 F: j' g
else istrin.clear();
4 C/ s: S1 [+ O }; ~8 U4 w* f) P4 N# x2 E
else{nERR = -1; break;}9 G+ R: S8 K! P6 K7 f$ I6 X, _
}
4 Z+ U! L$ e0 e: ]9 ^4 u# p9 ] if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 }3 B0 r0 I4 n5 W k( o
else nReturn=GetExpValue(t, csym[0]);$ E0 T U% \% W: X# o
return nERR==-1?1:0;
& Z5 Q& z' y# d4 `}}* N/ Y2 w' V' ]- j; F
' Z5 o* | x& ]4 F N5 D+ c6 i. d
+ `; V/ y; H8 l) r6 r9 [/ c; @* l! d$ |: j! ~
函数模板使用示例:
+ [6 [3 T4 L4 e; q9 T7 T在以上那段代码的后面加上以下代码:
) c5 a3 A: M: \3 V, K; f- l1 E+ p2 {! U# i" N9 {+ H( M. T; s0 K/ f
/ _1 j* l" l. s5 s Z
5 ~% ^+ S! a' F( K) J0 L4 T* v程序代码:
3 c5 d' S8 d2 f M" a' H5 G0 ]3 K Q
#include<strstream>
7 q) A3 X/ S+ V#include<iostream>( J2 C2 t R. }2 L8 h. v
#include<string>; V' y' R/ Q2 Y7 ~
using namespace std;" e. E( N' ^1 q ~
int main(void)
, n* I2 I" v+ F* ~' c' i{$ b- Z% B. S8 `
string s1;
1 G+ h/ F) R8 X* o* A$ Y while(cin>>s1)
, l/ v8 h5 u2 e {
4 e) _3 _5 @9 ^, r C istrstream isin(s1.data());
, [! H, J# u; t; J% D _ double d;
* g6 [5 V7 z0 {' L2 H4 K$ \ if(fy_Exp::GetExpValue(isin, d))
4 o8 T8 h, I5 S4 P' R. f G l {9 I6 C) T- q, }7 L6 ^
cout<<d<<endl;) u3 U# u i8 \0 a
}) \1 K$ K8 N& N& N1 o( W" K; C G/ A
else' o j- E9 v. t% R
{
; }/ G. P" I5 {0 r, B cout<<"ERROR"<<endl;$ H* c1 F) f0 B
}
$ J+ Q/ M8 |6 S0 r9 M# M4 L }: B3 ]8 t5 y' p# Y1 H. f; M
return 0;6 P8 b8 j/ s0 K" U o( |
}0 r; r, f. j5 E- a& m. q6 K" l
# X) r$ \- G' c! h
+ ]. l V$ A$ {" q" z! g
然后编译执行就可以了(*^_^*)
! y K5 w- Q& C" Y7 e& \" g& d/ l3 C其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# U H9 a3 g% C S( }$ ~& B1 e C 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|