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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,* v% b% b# x: y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 {; x* T4 z! a# A' _只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( d% {" r7 i' f' R, l参数解释:# e) @8 R# ^7 R; W! }( j0 S1 O3 v
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) \9 ~& W4 v8 G4 h
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 ~1 u3 E4 R, h+ M
返回值:
6 c- @ d0 C$ t+ @" S0 J( U+ r返回非0表示计算成功,0表示计算失败有错误3 ]$ X" A8 `. N8 i5 d
* o0 Y: M4 D m j! ]; _8 H
! R( {' D/ A* V
, T' R2 Y( N& `程序代码: % W2 |4 j$ }& ? ^2 b* d( W
0 G! u: w& I6 V9 Z* h
namespace fy_Exp{% O" v& V* a, R% K, @$ t* o/ O
namespace {template <class _T>6 S% X, N9 r# K4 V2 m
inline _T GetExpValue(_T t[], char& csym){, q `' \" y" ^6 N9 y, M% N
char c=csym; csym=0;
% {2 M. ]+ s$ w4 C- |5 m$ Y switch(c){
# k5 G" x t2 M4 m L$ r case '+':return t[0] += t[1];
+ a( F* g) H& Y. \ case '-':return t[0] -= t[1];- b, ~2 O7 R' h7 w
case '*':return t[0] *= t[1];% H; T9 I; Q% E$ D4 B( y
default: return t[0] /= t[1];//case '/':" t- J, p. N) [2 ?: r% `1 g$ b
}
~! ^# X2 v, _}}
7 }8 w; F; c! A$ b& Ctemplate <class _T, class _Tstream>& D Y( V/ q* y) m, N* d' r
/* _Tstream: inputstream, _T: get return value$ P2 R" S5 N) [7 k, H1 |- V3 c) d2 F
* Return nonzero if get value successfully */8 b9 i) p; c. I6 E( J( D* @/ |
int GetExpValue(_Tstream& istrin, _T& nReturn){! J. s$ P; W3 _$ q0 L$ o
_T t[3] = {0}; //雨中飞燕之作% T. o# g: ^6 @) C5 h0 T% C
char csym[3] = "++";' F" |* \/ T, j" |! b9 R1 J8 C
int nLevel = 1, nERR = 0;% ^) t; a$ K [# I6 v/ E2 z
if(!(istrin>>t[1]))istrin.clear();+ o; [" a! w+ Q6 O+ d! m( ~
for(;;){& b' C! p+ A, `' x
if(istrin>>csym[2]){
7 a) K; x$ n4 e. G, i switch(csym[2]){3 }6 u2 I, l8 c" O
case '(':5 ]6 V6 `5 v/ h1 t! `6 A
if(!csym[1]){nLevel=0x100; nERR=1;}else5 a8 W8 x; ?; j: R/ A% B" L
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! v) s. F* g, B: p
else{nLevel=0x100; nERR=1;}
9 x m0 Q, @4 ]- T& E" E- r7 Z break;/ z6 S9 l! Q' S+ D7 B* I
case ')':: t* S8 ^, S e1 ]
{nLevel = 0x100;}break;& O$ d2 {* `% R' _* p
case '+':case '-':case '*':case '/':/ N( a; J( R* m2 ~
{csym[nLevel++] = csym[2];}break;
! F' t- u/ j, h: e0 K3 W" [, a case ' ':case '\r':case '\n':case '\t':continue;. ~/ O2 k* F2 } ?' z. `
default:/ n8 b: y4 q0 U$ E5 R8 k
{nLevel=0x100; nERR=1;}
; a9 V, J+ w5 e$ @ }+ ]4 s- P3 {2 P! c) K. ?) D
if(nLevel==0x100)break;
* |% O4 u& T% U: a3 P6 t o9 s if(nLevel&0x10 || istrin>>t[2]){
. K. E6 r. ] l0 m0 _0 q nLevel &= 0xF;5 [, i# r" a9 m; X, \
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" q c5 `: b2 g: p3 J if(csym[1]=='*'||csym[1]=='/'){9 @* k3 j) T% X+ U# t
GetExpValue(t+1, csym[1]);9 X: i, ]2 |# ~4 D
}
* |+ T# `) k% ^1 L. L/ C( s else{9 r6 e2 Y2 ]% v
GetExpValue(t, csym[0]); Q) @' e+ D* R/ \6 O# }
t[1]=t[2];csym[0]=csym[1];csym[1]=0;- V S' R. ?: C9 l0 T; [
}
E4 l$ A9 o, F nLevel = 1;$ c* o/ I/ Y1 [# S
}
: x7 N& Z. n. k else istrin.clear();
. s% I1 ?5 }+ W' w- R }
+ X3 T7 G( X/ l7 H. I6 ^9 | n3 [ else{nERR = -1; break;}: b' C* Y- E5 e5 ]9 L! Z! [/ k
}
& F! x5 F! B' b0 @" u if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 i$ {6 i$ D4 d) |& d else nReturn=GetExpValue(t, csym[0]);
9 D& W. z+ c, n return nERR==-1?1:0;1 z( M8 I0 f5 o4 ~1 d
}}
6 s/ @! q% X7 o' x0 Y2 v) w7 G$ |
! w; a: o3 b8 ?/ o$ `: [3 {0 e- _. L4 m( F. m) v
/ |8 F% Q8 m- Z- s/ {5 C2 ~% O函数模板使用示例:
2 Z$ i, q0 Z. a3 F& k" f; N# z在以上那段代码的后面加上以下代码:1 O4 W: I% ? ~
& ~& ~' n& I6 G( A2 b4 F9 B
3 _5 ~" E# C# J
M: A, Q" \, s% h程序代码:
2 n) ^. F/ m; c
m, ]0 D7 r3 l' U. h5 i8 W$ s#include<strstream>& b! r; K/ X4 q4 E; i c
#include<iostream>
- w3 d4 o) r) U#include<string>: b$ f8 d& g/ v! K1 }5 f
using namespace std;1 E# b2 ]3 B1 ^) H& n7 R: H
int main(void)( K! m3 a# O' }. R5 t. p, C
{
% j/ u4 Q6 w& T string s1;
; Q/ m9 v" k; I) c* ^ while(cin>>s1)
1 }: D& ?5 _# @7 `: F2 g5 X% | {& H, ~. N; F: w' ^3 }
istrstream isin(s1.data());
( `2 W2 |! v1 K double d;
5 f; w+ {+ q, w# ?3 m if(fy_Exp::GetExpValue(isin, d))
- T) c" s# Z# V& k. b: f/ L. Z {7 i# f$ d3 c# w- A# s, P$ \
cout<<d<<endl;+ O. I2 Y: G/ |+ I7 o
}
) d/ @$ V6 S" I- {) l6 A else8 k' K' M( N* p6 V& l+ H( g
{8 X* D- m2 O8 Z5 k9 `
cout<<"ERROR"<<endl;
; a, S4 |2 @/ w* i E1 _ }- s% N/ b I3 E" y
}
3 T& w2 l1 A& B6 ?! H6 m return 0;
6 H, U- ~5 {( b6 I7 |5 j/ x}( z9 i: ]% @ ?3 S+ \3 {
* @2 ?+ V7 L" L& g
2 T7 N, m' r, S4 v& s# o- [0 P然后编译执行就可以了(*^_^*). r% c3 k/ u6 n/ w1 F' Q; x. H
其它:TC++上一定编译错误,不保证在VC6上也能通过编译" L# Y' V. N/ ?- f8 m
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|