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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,. R! {1 j+ y+ E" B
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& O9 a l: L5 j+ U" d8 O
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
7 z) [. ?/ s" D" ]4 C参数解释:( [# I% N# I" g" l
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流9 l0 B5 {' ?3 L( g7 ` A& z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 ^0 }% {/ |( p/ R- Y, D0 g
返回值:0 R1 |' B* i. n0 F- k; b* x
返回非0表示计算成功,0表示计算失败有错误+ ] y* j3 t/ s- `: @) T1 e3 N
9 b/ a* M8 t* a* g. }2 p
, z2 @5 |) }. G c" K/ W: V A* V7 C2 W
程序代码: 4 Y6 w9 R0 A ?0 o) u& ~7 ~
( @9 J; k, F4 C2 hnamespace fy_Exp{. b u' ]' A0 ?0 `; s( t6 x* n8 _* I2 V
namespace {template <class _T>
, _9 b H) U7 `; rinline _T GetExpValue(_T t[], char& csym){5 D# l, w. X) O/ M S8 _( j* m
char c=csym; csym=0;( _" t2 c; h4 S% c2 T' W4 X
switch(c){
1 R6 m* ^0 h, O6 L case '+':return t[0] += t[1];
" U. G( a' v: A @# [0 c" G case '-':return t[0] -= t[1];! ~% W& q4 Y# ~% h5 w/ ^
case '*':return t[0] *= t[1];! V: @, U, ~0 J. z
default: return t[0] /= t[1];//case '/':7 {) l8 A. H4 h5 f
}
% i* V! }+ W/ u, e}}) D) a: _+ d% P2 @
template <class _T, class _Tstream>1 U3 B! A6 e& u) J
/* _Tstream: inputstream, _T: get return value
+ T- P) X/ b2 c' X- r* Return nonzero if get value successfully */
, P, I; |8 O0 {# L" wint GetExpValue(_Tstream& istrin, _T& nReturn){! z& A; _ K2 T5 [6 b( M9 [2 r- C/ ]
_T t[3] = {0}; //雨中飞燕之作1 I3 }0 F) U8 I! x" [
char csym[3] = "++";9 L! c; I- A/ T+ j. ?; J
int nLevel = 1, nERR = 0;( x ^: n4 x2 S8 U
if(!(istrin>>t[1]))istrin.clear();) J/ W ~, A9 e4 ]# X
for(;;){
% t# i, O; M9 V9 p if(istrin>>csym[2]){ z2 z/ k# Y) J$ k
switch(csym[2]){
) {: ]* H, ~) j( P8 M case '(':0 T& ]8 J, P1 U1 _
if(!csym[1]){nLevel=0x100; nERR=1;}else
7 K$ R, r( c q E2 ] if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! s$ ]9 }5 H- E& J
else{nLevel=0x100; nERR=1;}' O9 K0 f) C; m" M) ^# R
break;7 m/ X, ~" o; z5 \+ |
case ')':1 q' n) t+ A4 Z4 `6 a: M- ^4 t5 f
{nLevel = 0x100;}break;
5 t! y, _7 S1 G, k& q* i, b" Q case '+':case '-':case '*':case '/':! Q. U4 j8 ?) U
{csym[nLevel++] = csym[2];}break;
+ ]# I7 m& c% e) A4 m( L# E: {" c case ' ':case '\r':case '\n':case '\t':continue;
( t0 C" x* \2 F3 K# T8 f0 t/ C default:) r. m7 D4 A: p1 \
{nLevel=0x100; nERR=1;}8 J+ y& T$ M" b
}
( k3 A6 _; v" v if(nLevel==0x100)break;
]: d$ Y& J J6 ~ | W$ y6 U if(nLevel&0x10 || istrin>>t[2]){
' q. ~4 Q6 k4 B) M5 r' Z nLevel &= 0xF;
) Y; \# F0 t5 K' g* G if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
( _, f* x- @6 E# j, R+ a if(csym[1]=='*'||csym[1]=='/'){
8 Z1 ^1 Y# v3 Z2 K GetExpValue(t+1, csym[1]);$ G% _1 h- u c3 y' G
}& `4 u; c0 _" T, S6 K
else{( s! i- B8 G# Y7 X2 V) K& j- X6 y# I
GetExpValue(t, csym[0]);
S6 N( c S! ~1 i t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" D# n: u9 }5 @ }0 ~6 n$ Q/ o* r' Q s( w
nLevel = 1;+ y& }) j# C8 S3 ^. o3 U
}
% Y8 e9 p2 H5 | else istrin.clear();
& a7 q5 c: Z# y5 y! I" p3 G0 I }( X4 ?# H- E+ s) p+ h9 d9 J0 o7 S
else{nERR = -1; break;}
6 W. k, e5 g. Y6 y) _2 H# b3 {7 p }
& j) y( i. ?) H1 ?& I if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);. q' x# ]$ y$ \. v P6 l
else nReturn=GetExpValue(t, csym[0]); |# c% q( N! W) X) u! t
return nERR==-1?1:0;7 V! ]& z' H% Q+ e2 _% p. Z, z
}}0 J: X* R/ f6 V7 z8 u& ]' O
" }( P h) O2 [% X6 k3 r
* B8 g5 O2 d, l0 j- N; X( n! N6 C
( z; A5 | R1 T! l4 Y1 Q函数模板使用示例:
" M. S9 b. D: v) ~; j I A: Q在以上那段代码的后面加上以下代码:
. T' [6 O' s! c# A0 W: A P9 K H0 P+ x: v- P9 a B( t) o8 M O
( k; ^9 V/ }% P' L/ ^! c0 b& |( n
" h# [2 {0 ]% u2 H程序代码: ( ~( R$ F/ j# i6 C! t( {3 D
- z7 ]: w4 y' z/ e8 N" ^#include<strstream>
/ s C ~7 ~! o2 T' q% @" B#include<iostream>: l/ v% f0 t/ \. K0 r: ?& i
#include<string>3 i0 T5 i/ ?" U9 o D; J
using namespace std;. Y! a" f O, p' f9 C: a
int main(void)
$ C z: H* U1 v* u u# ]' W{
: A" o' V0 |7 G& F8 J9 ?; j3 N/ `9 ~ string s1;9 Z- ]! C d. [$ \8 j1 E2 S0 ~
while(cin>>s1)
8 F' p. _& C4 A9 g+ X+ D) ]: O; c {
: \1 |1 T" }; H: X istrstream isin(s1.data());
8 {7 l" Q7 D$ S: v0 q% w$ x# b double d;" W/ g( Z6 h7 Q
if(fy_Exp::GetExpValue(isin, d))# O; Y; f6 x. Z" I+ f5 V% O
{1 h0 l T) H; a/ z, ]0 c: B" G
cout<<d<<endl;
4 o: {9 ~0 d* V- ~6 l' @# D; n8 Z, q7 [ }# k1 y5 ~; {! L9 [
else
% i" Q$ r0 e5 M4 g/ h& L2 T' g {
2 v _, b! u( Z cout<<"ERROR"<<endl;
4 J, F9 N q/ J, L: p# |0 H Z' N }0 j/ x# O( v4 R
}2 ^3 y: A! h# G$ e; x
return 0;2 i4 Z- @% U Y* D; C5 q' X6 u6 B3 ]
}
+ t, g% ]& W+ `5 g+ U" b! G$ S2 R* V7 f$ |/ u
/ s* ]0 @$ g3 R, ]( h* U然后编译执行就可以了(*^_^*)' h! e$ Y* H6 g* @
其它:TC++上一定编译错误,不保证在VC6上也能通过编译( ^# q% B, s9 s2 p4 i. B, [
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|