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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,; R) X$ f: l- Q: X; U
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- S) \8 A3 b' u- q: _8 T' R) n+ k: x% \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 G3 J: {' u6 ^( ~+ r参数解释:' p3 \3 Q) E+ D Q y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 F$ `& s) |0 Y" t/ g5 nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
' o/ G9 F1 ~9 I3 o8 E; [8 `) ~返回值:7 m: ?3 k" I% f; X
返回非0表示计算成功,0表示计算失败有错误& ^3 Q8 T6 K# d- t9 |, u6 ?4 x
* x& d9 _' _, u9 Z$ G U0 d
/ w" o3 R; K/ S5 a+ k8 r2 i, h' U! f/ h8 }! C
程序代码:
% V6 @8 v, l) N0 N5 d ~# F7 w( e" B/ K0 S) y% @
namespace fy_Exp{* a/ d& [% g. d5 z
namespace {template <class _T>
, Y0 `7 ?9 P3 d, x- ?inline _T GetExpValue(_T t[], char& csym){
9 x, |; e$ `/ e$ v- M. f* q) m5 {9 Q char c=csym; csym=0;! v0 T2 c% T6 C$ B+ g
switch(c){
$ _4 f' B! O3 U) K" \ case '+':return t[0] += t[1];
2 T( M) M; X6 m! O case '-':return t[0] -= t[1];
$ P% g6 j1 V0 }0 C case '*':return t[0] *= t[1];
% D$ B7 C9 G0 K6 u default: return t[0] /= t[1];//case '/':% h$ g/ k+ A1 h+ @! h) U; w
}
# `3 N! K& A7 J}}; {: d2 N; b% [8 I& d1 z
template <class _T, class _Tstream>
, `! O$ t: R$ U3 I/ o/* _Tstream: inputstream, _T: get return value4 |2 X6 I8 m+ m w4 S7 l
* Return nonzero if get value successfully */, p; @ ~1 t* u. Q
int GetExpValue(_Tstream& istrin, _T& nReturn){
1 E8 R# w& C$ j! U0 ]: I" d5 k _T t[3] = {0}; //雨中飞燕之作4 u) ?2 z4 {0 g" l8 ^2 U
char csym[3] = "++";9 M" @4 T8 Q5 o5 M' q1 V
int nLevel = 1, nERR = 0;$ H) J& z) ~6 N% n1 `
if(!(istrin>>t[1]))istrin.clear();
% L( z+ V. c2 y3 f9 S5 u; H& o% V$ {- i for(;;){
: p V4 ^3 b" w& o5 D/ V if(istrin>>csym[2]){
2 @# g; a! L% p- T4 P4 W7 h# a) {7 ] switch(csym[2]){
8 P' K9 C1 g9 J0 L9 B" P: j case '(':% |) J# e/ }. \. D d; c6 P
if(!csym[1]){nLevel=0x100; nERR=1;}else1 q2 D" s, N( A) |4 j0 N- W
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
. p, _4 K2 M# k+ s) a* ] else{nLevel=0x100; nERR=1;}; u: v# q) _ X; R( ]- i' u
break;4 J. V D7 E( p+ t/ G! J5 h
case ')':
^. D) U/ ^$ l. L. U' Y9 ? K/ ? {nLevel = 0x100;}break;
. e0 \+ V8 g, i* W: ~+ Y1 ~2 A case '+':case '-':case '*':case '/':: Q$ A$ ^, j1 k" t! a
{csym[nLevel++] = csym[2];}break;7 Y$ b3 D: I n. j; ]* m/ a
case ' ':case '\r':case '\n':case '\t':continue;
5 f; n, {! R+ y default:
/ K1 m; d( Y4 n6 u* r0 n0 } {nLevel=0x100; nERR=1;}
6 X; X2 R0 E& y }" @/ E+ W5 z6 y I! {+ D
if(nLevel==0x100)break;# \3 A$ t+ F; z, n8 s
if(nLevel&0x10 || istrin>>t[2]){0 G* k* W; r7 k+ j) y
nLevel &= 0xF;
' e1 H) c5 j0 V9 I0 }' L4 k; w# s- u if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}( l0 a6 t( ~" U+ X$ P
if(csym[1]=='*'||csym[1]=='/'){
" ]5 D0 l) `6 w( R9 a- o GetExpValue(t+1, csym[1]);/ j# _6 g; u9 `0 t
}5 C' }( N1 p6 }
else{3 |1 t0 e6 f( \! \) l6 E9 R
GetExpValue(t, csym[0]);3 O7 m$ j' R. _4 D+ m8 w! g
t[1]=t[2];csym[0]=csym[1];csym[1]=0;' R: {( t* e$ z! G0 e' x4 Q# n
}
- P/ X3 I/ c# K: B9 D2 x nLevel = 1;
0 f: r& b8 S* g/ m. `5 y! l }
) s4 U/ q4 G8 U1 n; H else istrin.clear();# V' d4 H! [3 J8 E1 B5 _% Z
}- v# h6 V8 y: D3 b0 s; l: X' j) Y
else{nERR = -1; break;}
+ ~9 R( U* h' [9 {2 y, Z" T7 P. q" @ }
h E2 N* e$ F3 v" _! r" k! D4 ]! G/ S if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);: H, @7 H+ f4 W- K
else nReturn=GetExpValue(t, csym[0]);
% [, Q0 L8 L& V- H return nERR==-1?1:0;
w/ Y; w3 H" O; i. o}}8 C; r2 }) f7 S$ w
' [4 B7 a+ g7 W1 b7 T' a- u- b/ N2 Z% ` x% a. P$ @3 e' p
: q+ N3 d" T0 V; l/ |+ o& g
函数模板使用示例:
6 t/ L8 Q& w* j2 L在以上那段代码的后面加上以下代码:
! G3 H+ H0 m1 k3 f3 f6 o- I4 b. R9 f: X! M
; a6 D% @) G6 e6 ?8 i
5 O6 R2 Z" N4 t I6 S$ | \5 V
程序代码: " Z" P) `" e: N% u; N. r
) S0 b( l+ K9 b3 j& Z v) }0 p
#include<strstream>
. G, q8 j. T$ H/ `) T#include<iostream>
1 x% m9 [+ P o4 i! [#include<string>
$ V0 }# V( K5 u* w; i/ I9 vusing namespace std;+ \7 F d/ Z# R4 {
int main(void)
6 j6 J! u3 [7 @9 P2 \. O" j" B{7 v! U7 S) i9 c; b+ y0 k* U
string s1;
# o( C/ P: L2 U. y* [2 K6 F* D while(cin>>s1)
1 Q4 h) S k! v8 y$ f8 D3 d7 a {
5 s) z' l5 h# n% b% t istrstream isin(s1.data());# S( c# ?. ~; I8 m! o M, ^8 R, P
double d;7 v# c5 D/ |- J. `
if(fy_Exp::GetExpValue(isin, d))2 k3 M, m9 o Z6 A5 P5 y) x) k/ Q
{+ }9 d# g7 R+ Z8 U# m, ~$ Y
cout<<d<<endl;+ u; E' R% ]8 _2 X- c1 _6 f
}; W) ^ w: _# u0 L
else
9 b& |% V; I/ C {/ |- m1 ~5 c' Y6 b& `+ s! N
cout<<"ERROR"<<endl;
2 `0 S/ j/ y& \4 z) K }
/ H) g1 H7 Q j- \' [4 U/ J/ r! d }6 r) w' t, H. G# y* f$ n3 i
return 0; U- I8 M0 e2 g3 u; c
}
: {* V/ }1 a# z! s4 Y& ^5 u7 q
3 f, V' ?* @ f0 o. z$ k& }6 O4 ?
. V0 O3 o3 a* B2 C5 Z6 K然后编译执行就可以了(*^_^*)8 N/ T8 p$ B- e4 y4 f9 i) @) ]# r
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
6 F3 A5 E; k, y- p# L S& }1 _) [ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|