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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
+ N& f0 N% w1 |" ?一个很方便的函数模板,可以并且只可以计算含括号的四则表达式, ?1 j! K+ x$ O# P4 _
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& @, t0 Z. g' g9 k( ~1 S- l$ ~参数解释:
- X z: d. g/ w) l8 W4 Aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流/ h; [7 j6 c. E$ E S# e& U4 L
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
r( S7 U/ Z( ?- Y返回值:
4 R7 p+ ^% y* [返回非0表示计算成功,0表示计算失败有错误
: B, K- z% J. k; p; l; J: C9 {1 E# D% N+ K: S
& Q# x4 r0 f: b( ^5 P3 b* B- q5 o H( n+ V5 d% i) J, \: t9 ]
程序代码:
1 f f0 c+ v! @6 f" {- P* Z% R2 N( K- `$ }, } g
namespace fy_Exp{: P* @/ @3 L7 K' _8 X6 z
namespace {template <class _T>
$ |. t0 r! W$ z) }( O# einline _T GetExpValue(_T t[], char& csym){7 L# j3 h" Y$ q
char c=csym; csym=0;
7 x. Z, ^7 z" j9 G% G switch(c){/ A% z. x* _! z; y4 C
case '+':return t[0] += t[1];
+ y$ u& [$ a* M$ S& g case '-':return t[0] -= t[1];
% r' W; }5 N; C2 X3 b' R case '*':return t[0] *= t[1];3 M$ T/ S0 k( r8 u7 j: |% [5 w
default: return t[0] /= t[1];//case '/':
) A7 U7 f1 e: a w. u4 \+ R O' h }
6 Q7 y$ g7 `0 ^0 V& G5 z4 z6 P}}6 w: D& m8 l8 q$ Q9 s6 Y' B S
template <class _T, class _Tstream>5 h0 |/ d9 ]* j
/* _Tstream: inputstream, _T: get return value
* D! R4 g7 [- `4 s5 Z* Return nonzero if get value successfully */
0 b) [# q, x# C0 Zint GetExpValue(_Tstream& istrin, _T& nReturn){$ P9 |" t" R" ~7 q) m# p5 I9 [
_T t[3] = {0}; //雨中飞燕之作% B" D% Z; V9 ? K5 S$ j
char csym[3] = "++";
8 o3 [4 i( n, ^# i* T int nLevel = 1, nERR = 0;
* Z" k; L$ b# t0 ? if(!(istrin>>t[1]))istrin.clear();
9 ?! |" |( u! U& b" G% c! D9 Y for(;;){& R& [- Y j4 C) W3 @
if(istrin>>csym[2]){5 Z: G' z9 a; c7 M& r
switch(csym[2]){
. p6 z! W$ c3 w6 K' x case '(':
- `6 Z* ^: X% k( A if(!csym[1]){nLevel=0x100; nERR=1;}else- A! C ?; H' S4 d! O# [
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
. @7 A+ }7 F( e% s2 Y1 P/ ~ else{nLevel=0x100; nERR=1;}* _- w* Y* v+ ]0 j4 F( C
break;. ]/ ~" H( n a9 i8 I2 p3 m2 P
case ')':
0 w# ? r0 v% ?9 K: V) Q5 s `& b) | {nLevel = 0x100;}break;
6 @5 ?+ F6 E0 x* R, O case '+':case '-':case '*':case '/':" Y, z: ~3 j3 I& q. D2 {0 l8 S
{csym[nLevel++] = csym[2];}break;
( b7 M9 Y8 A; b% @ case ' ':case '\r':case '\n':case '\t':continue;# n8 J! R% L9 g" s! V$ S
default:" }! C7 n3 s3 b( n, X
{nLevel=0x100; nERR=1;}! F( p2 R- E4 L$ w
}& i- g2 x# E+ O6 s. y% k3 [ T0 v# y
if(nLevel==0x100)break;9 E( @0 u9 l+ n6 `/ I/ [7 i4 i! p
if(nLevel&0x10 || istrin>>t[2]){
1 a* ]4 P! N/ n nLevel &= 0xF;
. _* A- G# ^+ W0 V4 a. j if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
% B" V' S! ^, `+ }- w6 y8 y { if(csym[1]=='*'||csym[1]=='/'){
+ e, [: u3 Q0 z1 } GetExpValue(t+1, csym[1]);
$ d1 {* ? z! m* c. J }2 h. ^4 e# r$ G" b: q
else{
# i3 }# `% Y* D. U% U GetExpValue(t, csym[0]);) O. V/ u& g* M! f4 u6 I
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
4 c& Q/ N" E1 G; O) T& ` }
4 [5 v9 r+ ^# d8 U+ b# X( a nLevel = 1;
s# Y4 C$ {0 f7 [ }+ G' \ }
! d5 d# o" g N- p! S& V else istrin.clear();0 A! k2 r* |# t, q' M7 J$ K
}
' q5 f, Q# |3 A else{nERR = -1; break;}
$ N8 S7 ]& u! B+ k" c( P a9 | }
/ ]8 s8 b% O+ c: Z if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 G4 K' m& U7 V, w4 |+ |! d6 A) d else nReturn=GetExpValue(t, csym[0]);
! x$ y9 X1 Z$ E b5 w+ c \ return nERR==-1?1:0;
2 l" \+ u* ]0 L9 n' d2 d" G A}}+ f( M/ M5 u- s9 q2 L9 P
- C( ^$ K' p' d- }8 G9 E
D5 b. y1 A7 o& M- n9 n( n& z; m0 h2 h. b* a# w/ m
函数模板使用示例:
/ \* U; r; U) h: V. j在以上那段代码的后面加上以下代码:
8 o! | \" _/ j. k- U
z+ G) m2 J }
" a( E r' @ ^$ A2 ?: O' a
3 I+ y' J% G* q: h4 O. I程序代码: 4 v) E' j' |- `/ }) T0 P
$ |" t- ^' G2 [9 E q( J
#include<strstream>
& R# T: ~5 h+ \1 v. l) k t9 j#include<iostream>& a& j1 ?! ~% w' U- R- V
#include<string>
3 d3 \) C) B$ l- T! m5 dusing namespace std;
* N( c+ M3 |4 W: g0 hint main(void)+ M& s+ W4 V! J- |
{
! S m3 V' {" d% v3 i string s1;
1 p5 W* U) v9 }/ z while(cin>>s1)
2 \7 X& s+ {) e4 i1 o) v {/ i, m+ J$ ~9 ]* _+ c; v7 E
istrstream isin(s1.data());
8 F( D8 p8 d- P& I: T! ? double d;
% r% R" y( m) B' }2 U2 n9 q3 K if(fy_Exp::GetExpValue(isin, d))
( ~, S% y# q/ P+ t6 m' {5 i {5 G' v6 m, X1 d3 d/ O4 Y4 A
cout<<d<<endl;" }8 `* P$ A$ z% B
}2 s5 E- s- _* F; s
else
. \% T3 J7 k: D4 @+ Y {) Y3 F% B. t3 @( b
cout<<"ERROR"<<endl;* {+ T0 ?- @0 _# }' N! a
}6 p, X! R$ q9 R4 c& [( d# T
}, a# q7 S* l# \6 e6 h2 W1 d' Y
return 0;1 A5 H+ h( z) u+ n* ~/ Q( M
}4 Y& O8 \$ w; l7 ]; Q/ u0 t& N' L
+ {5 }# Y3 L& k$ V' j
% _5 O2 _( ]% R4 e0 C
然后编译执行就可以了(*^_^*)2 i* Z2 b0 G' X) W
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
2 X" D9 x1 P' `! z6 H9 r 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|