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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
# L/ @0 p6 [# I9 u' a8 t8 ] W7 }一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ o# Y/ s8 O; p( |2 R只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. B' m* q: D0 T2 v7 R4 \% @2 M参数解释:, h2 K0 u4 s; C4 R# q- x2 g/ \
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
* K- u4 j$ ~# P* t& E+ ^% p, _nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 k: @- n' Z5 B2 x: R+ i
返回值:
* o& W( a: e; a5 v9 q1 |" I返回非0表示计算成功,0表示计算失败有错误8 x9 ^% Y% x: X; F1 H, {
: L7 O( j2 ^. b' `% g ) ]8 ~3 ^9 ^0 o9 t3 r7 N. b( B
, q3 `; \4 J& C9 K \9 e7 _
程序代码: # {2 `$ r! L; x
- D! i% ~! M+ ~) f5 Hnamespace fy_Exp{
2 M2 K5 P* p9 D2 R; L' k0 ?5 pnamespace {template <class _T>6 N* \. l9 p7 @+ U5 L
inline _T GetExpValue(_T t[], char& csym){ w2 b: v3 w$ Y: r
char c=csym; csym=0;. L! m% L2 Q8 z" h
switch(c){
m8 z% ~! P* K5 t case '+':return t[0] += t[1];
! e$ @/ q- f6 I' u% p% L, ? case '-':return t[0] -= t[1];8 O# w, X5 v4 _+ ^
case '*':return t[0] *= t[1];. o" h: o& F& g# D5 R+ B
default: return t[0] /= t[1];//case '/':9 D, L6 n! ?8 W% _
}
2 J9 X! N: ?0 k6 M( V}}
; M' Z5 A! v4 ~" X' z1 d* Rtemplate <class _T, class _Tstream>; a: m/ r e5 K S
/* _Tstream: inputstream, _T: get return value1 f6 Z7 g$ a! u% M$ d; T
* Return nonzero if get value successfully */
: T% U: ?( K& k2 j8 A4 V7 x* tint GetExpValue(_Tstream& istrin, _T& nReturn){$ V. I6 J# G# T
_T t[3] = {0}; //雨中飞燕之作0 m. o6 j+ d1 l0 e5 s; `, \. J
char csym[3] = "++";
4 U) Y7 L) I, _ int nLevel = 1, nERR = 0;$ E& I+ x/ D3 ~6 f5 j3 l; y
if(!(istrin>>t[1]))istrin.clear();0 S* T+ F# }! ~1 g# c
for(;;){
5 }# N2 l+ |# \4 ^6 i if(istrin>>csym[2]){( q G) Y8 g8 o3 \4 J8 h
switch(csym[2]){
! @ a- C0 k1 F& M8 A, `4 j; H# Y case '(':$ r$ s& m l/ d O& P
if(!csym[1]){nLevel=0x100; nERR=1;}else
C3 `$ |; D8 N( `0 ` if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% j/ O& G, o" z3 r
else{nLevel=0x100; nERR=1;}4 b" \; a) F, ~2 o! L( R4 v
break;
, ^8 v! u( M0 _1 k5 w: j case ')':
8 `$ K# D* @/ f( P* k& I; n9 _ {nLevel = 0x100;}break;
$ S! o4 d+ t- l: l case '+':case '-':case '*':case '/':( U! G" q+ u C; o
{csym[nLevel++] = csym[2];}break;
( I$ a7 V4 n7 j# ]7 r" N E case ' ':case '\r':case '\n':case '\t':continue;) H T/ l8 q3 `2 u
default:7 `: i- {- I/ F& r
{nLevel=0x100; nERR=1;}
# D7 c( L p" \5 q0 b! X0 D }
% I3 d+ m2 Q3 c8 Y: `& \' k if(nLevel==0x100)break;) c5 i4 |7 c* C: o
if(nLevel&0x10 || istrin>>t[2]){
' F. s& c' p9 @9 \5 B: M4 A nLevel &= 0xF;% p) j% n. u' \9 O3 M- x; N
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, p7 m. |7 L1 y if(csym[1]=='*'||csym[1]=='/'){
: s- o; b( m: |6 l& o1 L5 Y0 J. | GetExpValue(t+1, csym[1]);8 `% o. b- L3 R+ l, d
}: h- b# [* F3 @
else{. F6 X+ L; A7 C% Y7 R ]
GetExpValue(t, csym[0]);/ X; c& I' n$ o- @3 v3 M
t[1]=t[2];csym[0]=csym[1];csym[1]=0;' i. I$ F4 Y* m
}
8 o$ M0 Y ?0 y- h7 T" v ~ nLevel = 1;
3 z3 \6 o* s; ~8 X* x }6 X1 u, t6 ~" F4 i3 Q6 o3 d8 O. L
else istrin.clear();
" W* i, Q0 B0 _ }
$ ~/ V9 q2 y; o; G( r( z% p( g: q else{nERR = -1; break;}" Z5 F" b9 [; \
}
E0 z" H! S* k if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& N) T/ F D, c0 J. }9 b. K& c8 z else nReturn=GetExpValue(t, csym[0]);
" T0 z* O1 u7 g: ? F return nERR==-1?1:0;5 d6 }/ L4 S5 ~/ i6 U& q, S& ?
}}
1 u: ^+ j; }" F: ?! K7 e, X) d" I) O, I- G/ h: r" V! M! B/ [2 l
+ D* A3 _( w/ Z! i
3 L/ s. p9 D* N3 i H. J. S2 k
函数模板使用示例:
- ]: ?+ ^1 b3 T在以上那段代码的后面加上以下代码:
; z) X) y0 W2 Z2 m
" w; G8 w0 }+ E! B
# _; i9 b7 {5 _ M7 n7 X: Z4 r
/ K" r% {$ M+ A程序代码: . A' p+ T# }$ ?' W5 W; q
8 C* f! w+ v9 Z S3 V- n
#include<strstream>$ \0 z( a( Q }( {/ h# r- R
#include<iostream>7 ^ c& n; f5 a
#include<string>
" h) t" z& T a- r1 a: Vusing namespace std;! M$ E3 o' e8 ^& d
int main(void)
/ I; R1 q; C6 V* P a) `, Q{/ l: R/ m2 L! f8 i, u9 k/ G; o
string s1;# C1 M1 b7 j U' l8 B; S0 f0 ^
while(cin>>s1)- B* W6 u7 v( |6 D2 p! H" U
{7 u$ i9 a9 x2 a0 e' d
istrstream isin(s1.data());4 K1 |& R3 q$ r9 x
double d;
" f+ ~, |4 }, M% }# F4 S3 Q: r if(fy_Exp::GetExpValue(isin, d))
; j5 V) G7 J1 ?7 M {
- W& P% o8 \* I# E3 J" U6 I6 } cout<<d<<endl;
( P+ j$ N F' \! Y6 O }* ~5 ?' P( |' E3 f; i8 j
else
T3 l8 m4 G6 j7 X. \6 }: L {6 t5 j2 s* w3 t2 q
cout<<"ERROR"<<endl;
, v: s$ |" O0 m4 B }7 Z2 b G# x7 \9 h+ e9 j
}
$ h! ~* m4 R" N) l5 ~1 D5 ? return 0;9 c7 y/ L# u- b/ u
}5 u6 Z m. E0 m7 f; i8 S
4 r) P: w0 h0 z) `7 B
9 H& a1 c6 f& j! J8 i$ ]# @8 i然后编译执行就可以了(*^_^*)
1 W+ H: s( J9 e7 n O其它:TC++上一定编译错误,不保证在VC6上也能通过编译
2 r; ]. S& K0 G 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|