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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
/ Z* F& E: Y( w( n2 V0 t% ~7 v一个很方便的函数模板,可以并且只可以计算含括号的四则表达式4 q: R6 N3 J$ S1 i7 k: y/ j3 r
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), Y+ u. e- L5 Z% y
参数解释:6 m) F- g" u( Y' T( _9 _- \5 t
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 a2 G' h+ m3 k
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 q% g9 T0 `' }' d! {返回值:9 `$ k! X" g' q( ?
返回非0表示计算成功,0表示计算失败有错误
* N3 N+ S3 x0 E/ g) l7 E
" N# I w5 T, k9 `& l
! s' Q0 @! c% X" f9 v1 R$ Z3 U
5 g( H. {+ Q8 c- k- b8 Q程序代码:
/ |3 _* j/ C0 l& a8 t& s
' S# \2 ?0 U7 \$ o, f$ @namespace fy_Exp{
- V+ e7 }% S5 l7 o, Q6 `4 Gnamespace {template <class _T>
5 E2 G5 h3 \4 M: X) E9 Ninline _T GetExpValue(_T t[], char& csym){. ?8 x/ e) Z) _: Z
char c=csym; csym=0;
5 e3 Q+ z2 f2 g* n4 s8 s" x switch(c){, x$ ^! c0 Z* Z, V/ Y
case '+':return t[0] += t[1];" G6 @' t2 A. n: u
case '-':return t[0] -= t[1];
( f; K% k$ Z ^8 U0 f case '*':return t[0] *= t[1];) p: v0 q& F9 \0 s" k. p, M+ z
default: return t[0] /= t[1];//case '/':7 [- Z3 G8 U L& E
}2 p# ~% r$ b; P- Z
}}- T8 @! M3 }$ L
template <class _T, class _Tstream>3 f6 E8 P8 U* v1 l6 ^
/* _Tstream: inputstream, _T: get return value- C' D7 b1 A' c
* Return nonzero if get value successfully */8 g% W3 y4 @ B' @ h
int GetExpValue(_Tstream& istrin, _T& nReturn){
3 g, ]9 S4 I0 ], m* v% } _T t[3] = {0}; //雨中飞燕之作
) `% x) u! p1 K; j) O char csym[3] = "++";
1 B* B+ e# H5 U+ h$ k9 d int nLevel = 1, nERR = 0;
9 \' x! H2 V/ `5 r3 a9 M$ ? if(!(istrin>>t[1]))istrin.clear();
. ?# M9 {2 @$ w y# m for(;;){
6 a) f3 ~0 O4 Q. O/ `9 n3 b if(istrin>>csym[2]){% ?3 ^1 R3 h; J. ~, W) p1 R7 p
switch(csym[2]){( ~* N+ ^+ L6 Y* x/ m
case '(':
8 i) H, {# t* j N1 ?! c" r- Q4 j( S if(!csym[1]){nLevel=0x100; nERR=1;}else- j4 E6 s+ }$ k8 V8 m- @
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- l3 \; V1 v% r- w
else{nLevel=0x100; nERR=1;}: ~+ S+ W a; y! {
break;
5 Z- d' z* \. f3 t# H( k* T$ j case ')':. m) p; N9 {& Q! v5 g$ e. ?9 U: o! D0 m8 ^
{nLevel = 0x100;}break;
9 g% f- E9 r/ M" K% f case '+':case '-':case '*':case '/':" |/ k! q0 @4 J m: Z$ U8 n: G: u/ z
{csym[nLevel++] = csym[2];}break;
' y- i2 I# C( N3 ~ case ' ':case '\r':case '\n':case '\t':continue;/ z1 b0 }. d( d1 C& c/ j" N* t
default:
0 @9 H n* H% D' ~7 y {nLevel=0x100; nERR=1;}
( i* X: S0 G/ n' W) S }; p0 N) P- u2 G; K- d, }) O
if(nLevel==0x100)break;2 r* ^4 _0 E. q4 X# }# z. c1 G* z
if(nLevel&0x10 || istrin>>t[2]){# Z2 J4 r4 X! P2 h
nLevel &= 0xF;
+ Y, J9 V& ~; x if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: h9 I$ ?7 q3 L# \, o9 d1 K2 T0 Y if(csym[1]=='*'||csym[1]=='/'){
! j* B7 n8 [/ W" S GetExpValue(t+1, csym[1]);
: P; @5 A6 l. V+ @1 C }! e4 z/ `. ?* H0 ` b _% n
else{' w, o( ~: ^% Q. w1 K! ?; D
GetExpValue(t, csym[0]);" m# k+ S% V4 K+ T' @
t[1]=t[2];csym[0]=csym[1];csym[1]=0;& ^" v3 N% @0 m/ J' h' G; O
}
, a, b# b1 j, ]' B# \* B nLevel = 1;5 D. E9 R' U ?3 d- r
}
6 ^; ~! t4 _; k8 B: G) Q else istrin.clear();
/ I9 K' x' c; @* O8 K1 t( U! a }7 R/ A, k, C* T4 z7 V% y
else{nERR = -1; break;}2 V" g! j; F* f) \3 |# v- U5 w
}( D- S/ [$ [, H: t2 A: ~9 G
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( v- G9 {+ v& O
else nReturn=GetExpValue(t, csym[0]); _* O. a& A# v4 ^5 j. x
return nERR==-1?1:0;
* B( n( A" b7 p9 Z1 I}}) w1 S1 C! j. c* L( n
" W7 ?. h$ W8 f0 y% Z, |$ X5 w$ I w1 T. y! ^
, [+ d* y) G/ l函数模板使用示例:& J! V; c8 D4 g1 G; ~
在以上那段代码的后面加上以下代码:- M1 y7 c4 U" k6 E, H
- z1 c2 S8 q( o! Z
" Q8 l7 n! K8 m0 ?( e
! N l0 D8 N }" E程序代码: + U0 C( O8 s7 t
r! S1 a2 S' N/ u Q
#include<strstream>
' a" X9 O, [% V+ K0 S#include<iostream>- A7 t9 x) F8 g Q0 j
#include<string>
$ { Z! P! S- X9 v+ _using namespace std;& H b% R2 o0 ?0 A
int main(void)7 I' j# t' y0 Z* C/ D8 ~* ^* R
{# Y8 J a& z2 r0 }5 j
string s1;
u- F, F% ]) w6 G* z while(cin>>s1)
/ Q& ]4 ~! }8 a3 t/ R/ D {1 x$ y/ s g! [ [/ c6 E
istrstream isin(s1.data());
4 Y9 I. u. o3 A& \( z* ~, O double d;
8 _6 x/ N) N/ q+ H p. b if(fy_Exp::GetExpValue(isin, d))+ e+ }; Y/ i$ g' g& ^
{
. D6 |) b- L9 x cout<<d<<endl;
- ?6 l) F9 K f$ c+ z" G6 Q! ]) A }! E# [' n: o; ^; N* X6 G7 g6 ~
else
0 B* J( |' D$ I8 A) j {6 {& M2 c6 m: H% k: |0 `, Y3 d+ l
cout<<"ERROR"<<endl;+ `) L% k& w: ^1 I' Q2 I
}6 K" _3 v/ K9 N" H0 ^! t
}
: R2 g& n% c3 T2 D) {+ O9 ]" X return 0;: ~: l( D+ B5 @* \
}. S6 I& y4 m& H+ m
, k/ x! V, K, p5 F& ?
# ]2 @2 G0 A, G# ], g然后编译执行就可以了(*^_^*)3 @* z" I6 v' c
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
$ H, U4 H# ^4 n6 w 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|