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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
; i$ s3 `& s! e+ `1 X8 \一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! U- |% ~$ k: i5 b' X只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)5 O$ y+ _7 T/ P k1 c# N
参数解释:
$ T6 j- O: p2 f6 p4 d$ z/ Distrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 _. @5 C0 @0 S4 f! w7 T
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ T v( _0 q% R1 n返回值:! M2 x5 C4 A# u5 ~
返回非0表示计算成功,0表示计算失败有错误
6 J4 m% W+ Q) W) D% j# K, E8 L
3 l& W" B" k2 [& m
8 m# D$ g5 h; ~ w+ N. t( x c! z# ?' `& q
程序代码: " ?# ?) W- B- W0 A& t* Y
, S9 d7 {# a" z: H9 j7 y1 R0 L
namespace fy_Exp{/ d% J; ~+ P$ K; V
namespace {template <class _T>) p' Y( e$ P0 r# N {' _8 V( U) e
inline _T GetExpValue(_T t[], char& csym){3 K8 q6 y; Z9 W+ z, M
char c=csym; csym=0;" U* _5 W; Y' h B$ E
switch(c){, k2 w) h; k3 v, T" ]3 [
case '+':return t[0] += t[1];
- U% z3 D% z2 a8 J7 p8 N6 b1 n case '-':return t[0] -= t[1];
* \- n3 S4 b# Z case '*':return t[0] *= t[1];
% d; f6 h7 p7 ?" z* |; w default: return t[0] /= t[1];//case '/':
* x' h0 j. l5 m( O, f }4 w x# B4 r2 x; q! n& ^% I6 ?" }
}}
* B; }6 ^% C9 k7 s+ Wtemplate <class _T, class _Tstream>
, E0 T/ j: Y0 c$ x3 Z8 A5 N/* _Tstream: inputstream, _T: get return value% z1 ?5 l1 |* n. _
* Return nonzero if get value successfully */: S# y) a5 _& S7 ?
int GetExpValue(_Tstream& istrin, _T& nReturn){
( U( ]( p0 J0 u1 x( n. H _T t[3] = {0}; //雨中飞燕之作/ R- R I# K8 }1 x
char csym[3] = "++";
4 ?! g6 E- v1 a7 T int nLevel = 1, nERR = 0;8 `; H) k* i, `. B. W4 G4 t, q
if(!(istrin>>t[1]))istrin.clear();
( j2 |8 p- S# L2 [' _' r( n& m; a" B | for(;;){* {* A& m: N+ Z/ b: P
if(istrin>>csym[2]){
7 Y6 N# _ ?. O* c- y3 [% G( ` switch(csym[2]){
$ s3 _+ Q# v/ l0 X. _ case '(':
3 q$ G* ]7 q; L' A! s2 E if(!csym[1]){nLevel=0x100; nERR=1;}else& d$ t- `, u3 p1 D$ Q
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: }+ h' z4 Z q* m/ U else{nLevel=0x100; nERR=1;}& I t% _: t- N0 x4 u
break;
& j+ G& e6 p4 y% O% x" v case ')':) @! {7 ]2 }2 V9 T4 l4 w/ U/ }
{nLevel = 0x100;}break;
$ m) v& ~# C0 {9 M7 H* l4 d# d case '+':case '-':case '*':case '/':, o/ n O0 H0 \
{csym[nLevel++] = csym[2];}break;
" f7 y9 d) E! q/ D case ' ':case '\r':case '\n':case '\t':continue;
& W# t. X: G9 A) k8 [* Z default:% |; d& Q& u+ {! _$ O& O
{nLevel=0x100; nERR=1;}) x" J l* i) L7 L2 V' F, D$ ?
}
1 }" a8 l& D! } if(nLevel==0x100)break;) g0 L8 z3 g. h2 p
if(nLevel&0x10 || istrin>>t[2]){% b+ O8 b6 T2 h) e
nLevel &= 0xF;; O( E$ s4 s" y+ x* D4 U
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- n) c% E a8 }% J/ T4 ?
if(csym[1]=='*'||csym[1]=='/'){
: c$ T3 R3 `9 R GetExpValue(t+1, csym[1]);# o9 X7 O. t9 a
}
6 G3 Y0 E7 j6 ^, R+ s else{
3 V* S8 p; T8 o" N; j: }8 { GetExpValue(t, csym[0]);
1 x# ?, v3 r, S S8 Y, S, E7 k t[1]=t[2];csym[0]=csym[1];csym[1]=0;
\2 ^! v" k- x4 z8 @( [6 o+ Z }
. R6 i: k6 o2 I3 {# p% Q7 J" [ nLevel = 1;
; v0 P+ V6 ~$ S# @2 s: C }
9 F s& n+ r3 \: u else istrin.clear();
0 m* d; F8 U) L9 Y1 o! D: S }5 z5 \0 H0 i% |' o" w3 |
else{nERR = -1; break;}
7 T8 U3 ?2 a, \! z }$ u" }- o) z% V# a' e1 @
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' t4 j7 g( f4 H& A: o else nReturn=GetExpValue(t, csym[0]);
: f& M/ _8 u, W+ f7 `" q# T return nERR==-1?1:0;- y/ ` z$ R# ~" i2 @7 G
}}
, Q( i, f& ]' Q6 I
' E9 ~' _" |7 ?9 U# F; j+ `& E: e7 P7 z' d( n! f# o& A% N+ K
9 O6 |* H% U% @. F: n* c函数模板使用示例:) T+ p& m( x) j4 _
在以上那段代码的后面加上以下代码:
9 B. I; _/ K% W6 g
/ L! t5 @) k$ @ 3 _; t4 w+ b1 G& {* b# F6 Z
$ s, ^1 d" z+ x5 N, s程序代码: * i% n; o: e4 e1 D$ J1 x) D9 ?
6 z9 C$ K( ]1 e* d8 P
#include<strstream>3 e* h; U% {, u0 O
#include<iostream>
# J9 [6 C- D% z) P# @#include<string>$ A8 ?* b. t, |" v5 z
using namespace std;: ]7 T/ n6 W0 N
int main(void)2 U6 x: [! [- V
{
/ T. K. q2 v# B8 i" S0 t string s1;
+ l$ y" |# _$ a0 R. `& U while(cin>>s1)
" j" ]9 B* u9 Z) c {
. J J5 t* {' F! ` istrstream isin(s1.data());
. ^/ D" |* G+ U6 A double d;7 j% p- J) i* {/ U5 T
if(fy_Exp::GetExpValue(isin, d))
_ _: K% ^0 E0 z! k5 S3 X {
! @' ?( m/ C- L cout<<d<<endl;' q; E( O) _2 ]8 v Q$ D. o4 P
}
6 }: w- U0 F/ c/ m4 ~ else: R5 K. n; J3 e, I
{
" m! u# m( K, c: T k0 O/ o* H cout<<"ERROR"<<endl;. ?' t }4 u" x8 G. T( t. U
}
( X* x6 x3 \ l' H3 y' w6 a9 P }( f) b# v, \& N* w, D1 i& T
return 0;/ I! F7 w$ b: Q# o0 H/ s
}' B; Q5 R9 l/ v5 f L" ^4 @$ x0 n
* E& J. ?1 v6 D' ]/ ~- J0 B% @5 l% }: a7 z; R4 Z3 [
然后编译执行就可以了(*^_^*)
9 `( \1 O, {$ n其它:TC++上一定编译错误,不保证在VC6上也能通过编译; _& C$ Q9 X. n/ M" [/ D0 l
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|