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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
& M% ]& E* e1 m9 j! Z v9 T一个很方便的函数模板,可以并且只可以计算含括号的四则表达式* P! F/ e! ?3 B! f* a
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): @9 `! c: [3 O$ J. q
参数解释:- @/ W$ @$ X/ X% a
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流$ ?! Y' d1 M/ c# N, j% e
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定 G6 t1 N& H5 v2 V& _
返回值:
. y i( ] H( i# I) d, F2 r返回非0表示计算成功,0表示计算失败有错误" R# c* u0 x. {8 D+ k9 h8 P
5 C* Y! d7 S& r% \1 u! | i% R 8 z* f8 E p5 x* H) I8 J0 I* F7 h
! K( [' ^3 ]+ @: F7 j程序代码:
+ h7 b' A7 y x" D% X; E# R3 \6 n) Q" c( }' A" o
namespace fy_Exp{) a6 A8 |$ h- d) V3 y. g8 l
namespace {template <class _T>
& Q" r# V3 j0 I4 C" P& f1 I6 g6 winline _T GetExpValue(_T t[], char& csym){
* D! D9 s* B+ V char c=csym; csym=0;; B$ A& T) N+ h5 w! w# `" p% O
switch(c){6 A$ E) `5 _0 V7 e+ ? @
case '+':return t[0] += t[1];
( u; G' n. ~& S# A2 n case '-':return t[0] -= t[1];& g& ?8 X+ U* w, D
case '*':return t[0] *= t[1]; h& ]8 ~( i; U4 S" ?
default: return t[0] /= t[1];//case '/':
% G7 l4 E' j! N! k }5 t3 w; t# b- R/ R" {( I
}}$ b4 i$ @2 U' t; o7 H
template <class _T, class _Tstream>' r( Q. h. }7 }, g6 }- {% e3 d$ a
/* _Tstream: inputstream, _T: get return value, X. H3 ]- L' b; x6 f7 C1 q
* Return nonzero if get value successfully */
8 s5 z/ ]& ~6 g0 Lint GetExpValue(_Tstream& istrin, _T& nReturn){; e5 l" J) ^. n# D/ ?& w# G! K* n {
_T t[3] = {0}; //雨中飞燕之作. R, c X) O' ?" g. C# ^! f! a; _
char csym[3] = "++";
& _2 v7 q8 g! I int nLevel = 1, nERR = 0;
3 v$ T& L: w. v+ z9 M. s if(!(istrin>>t[1]))istrin.clear();
, ], y& C8 f7 T! a for(;;){
8 A2 v* |- I7 C" E if(istrin>>csym[2]){
; V( z" K) T: V1 S9 B switch(csym[2]){
. Y- I/ l$ [; j/ }# x1 o. ^8 R case '(':
% H8 B! Q* o5 z9 i; h' J if(!csym[1]){nLevel=0x100; nERR=1;}else
! ]) {$ x% o s; O/ N# ]. `+ Y if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# K! n9 S9 h9 K1 o8 e) N9 z
else{nLevel=0x100; nERR=1;}
& g. ~, [5 M* ` break;
, p: X$ V, _, d( c case ')':. m+ h, o' o6 |: q$ C7 ~0 P
{nLevel = 0x100;}break;
8 ?4 j! i) H5 j( N case '+':case '-':case '*':case '/':6 r7 l" v. @( B; m5 x7 n
{csym[nLevel++] = csym[2];}break;: ^7 O- Y# d7 o7 o7 L5 _
case ' ':case '\r':case '\n':case '\t':continue;! ^. B! {5 q5 ?* q& B/ C r, c* H( |
default:
' i t0 h6 D: R, o* F0 B( H# f7 E5 | {nLevel=0x100; nERR=1;}
. |! I/ _/ V B! L }
: u7 W- D& d0 R: I if(nLevel==0x100)break;* p6 w* ?- g- Z
if(nLevel&0x10 || istrin>>t[2]){8 W. V* u. w( R# x. F% f
nLevel &= 0xF;& I, V9 [5 p. t& P1 L1 q, q5 w
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 |3 L9 x# C2 i( A8 b7 y# l
if(csym[1]=='*'||csym[1]=='/'){0 O3 ^( Q5 B. `2 d
GetExpValue(t+1, csym[1]);
7 K7 C _8 q7 P8 f7 R: w) b. s8 { }
s" }* K% I* E. {2 `$ N else{! R# X3 N( Z$ _' t' a5 q8 P! x
GetExpValue(t, csym[0]);
) x( g5 y2 O+ \; a" C t[1]=t[2];csym[0]=csym[1];csym[1]=0;
l2 c$ L; O% n$ H/ B }4 K. D% {; n$ ~8 W* w: C, @
nLevel = 1;
8 [5 g8 M; ~' q2 `# M) T }
% c- g6 W, e9 O& D" t; [ else istrin.clear();3 D* t- e4 d8 W _! ~, g
}
" l! h" S- ]/ s( Y* ?0 a else{nERR = -1; break;}
* [3 l& ~! ^) \! Z) V }0 H: j8 D Z& X0 N& K* Q& Y H2 N
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);. u0 Q0 G7 w3 l9 W0 n
else nReturn=GetExpValue(t, csym[0]);* R5 {8 r" |9 c$ J* v6 w
return nERR==-1?1:0;. g. r. L: N* e' X+ b# L
}}
s E' r- a2 _; R0 L C% c, E& h* T2 }1 R' K
2 e4 }! `8 g7 O
4 U& I( N- A4 W. c3 N3 r d# h
函数模板使用示例:
" Z) I2 u* n4 P; I在以上那段代码的后面加上以下代码:
3 ^9 i) d- t3 u, g6 t$ @% X8 `; X" f6 o
% l i3 m+ a6 u8 T: L- t$ l
/ w2 K! O; o5 Q5 e( Y4 Q程序代码: 3 O7 k3 G. n- s- ]& G" @& C [& Y
* s& W! a" \7 N8 @6 A+ U9 [" C5 n#include<strstream>
5 ]) N m9 k4 I#include<iostream>2 c3 t! h2 v7 b' j$ k5 ^7 Y3 |# C+ `" A
#include<string>! k9 Q5 B; k8 H4 O! p9 W/ F) P
using namespace std;: d3 j0 n- K: m0 Y& {) q, d& p
int main(void)0 m" c7 v8 b9 v1 E& i! p( b
{4 k; f" v% f' W; A! c" P
string s1;
4 j; N' e X3 J) h* g1 ^- K while(cin>>s1)5 h! [+ h2 X5 k1 m* L
{
. K2 _3 Y1 G7 O2 t' V6 H8 b& B' l istrstream isin(s1.data());
& y* n/ \4 V0 S8 F5 W; V double d;
0 O3 N8 k2 S* t5 D if(fy_Exp::GetExpValue(isin, d))
4 @. w3 _+ ^' q& ` {: o1 b% e0 u1 R, {, v5 S2 Y
cout<<d<<endl;
7 h- ~' m! r3 n8 ` }
2 X4 l* w$ t2 k* m) Y else; W" K/ `4 S2 a: Z* e0 |9 c- @
{4 h) ]/ z# n& \) p8 B; x
cout<<"ERROR"<<endl; y& P8 x7 F( \& Y4 b
}
3 c( R8 Z; L: ?+ L A2 j6 [ }, J' C" v, L, l5 s6 d+ B; {
return 0;; X( k1 q# k% c
}9 y% i' q$ V. |6 @
9 ?2 {6 X' ~* o/ t) B5 s9 A3 _9 F) B9 X# {# X
然后编译执行就可以了(*^_^*)
8 H+ w2 ^' I6 s, ]6 X- n其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! `6 R% b& b/ I, u1 P 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|