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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,' _8 O3 d" c4 P7 g! S+ G3 [( M; g: ]9 D0 V
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式9 t0 X* D2 E: e; J& W
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
8 z# ^1 U) V4 K' o! u参数解释:
$ n+ {, Z4 Q+ H; L X% Pistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流. M$ J; Y3 p! B5 D
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
% `8 I+ s9 p: n9 f返回值:
; d3 S" J& }0 `9 u返回非0表示计算成功,0表示计算失败有错误
% V( N) u2 I! C# ~" ^% f2 v5 {& |. D
( }; Y, Q. B# h/ v" R
7 T) p' C' V8 u7 X+ ^! e& Z程序代码:
+ t7 l" C9 R, d7 k& C; R7 }2 I+ R1 {5 T, D9 d$ h3 w* e" E
namespace fy_Exp{; i! Q. X6 y3 `
namespace {template <class _T>+ I' V) g1 Q* t G9 T" M
inline _T GetExpValue(_T t[], char& csym){
* c3 S" U' B- _6 h- C7 ?% R char c=csym; csym=0;) ]7 ?; W( M+ L
switch(c){
3 O" q% s1 C$ b" n: r6 c4 Y. j case '+':return t[0] += t[1];' O% P* g. F. [/ n
case '-':return t[0] -= t[1];
3 ~% p- B ?7 n6 G2 a8 x: g case '*':return t[0] *= t[1];1 U, ?7 t/ V% V8 ~
default: return t[0] /= t[1];//case '/':
6 P' y1 B& u3 A7 u0 P/ M! F/ P }) [9 B! z4 B3 N$ h8 l9 f* c
}}1 O2 r& J8 v7 ^1 ^4 q: ` H, ^; D
template <class _T, class _Tstream>
# k) G6 h9 J( f. U, }/* _Tstream: inputstream, _T: get return value' X# M! A. C2 R6 ^7 K0 ?% b
* Return nonzero if get value successfully */
' p" ~* ? J9 |# {: @/ P! Eint GetExpValue(_Tstream& istrin, _T& nReturn){5 k* {) F) y* w2 ^* z
_T t[3] = {0}; //雨中飞燕之作
: k" c" @- m/ m: b0 c. e) R char csym[3] = "++";
, s( D) l5 O) V" Q5 j* ~0 C int nLevel = 1, nERR = 0;
T9 K; y. V" B9 C+ I! V if(!(istrin>>t[1]))istrin.clear();
8 R$ q; E/ t: m5 d for(;;){
7 i' `+ v( G' P8 E if(istrin>>csym[2]){
; T1 `$ y5 e; r( O- [ switch(csym[2]){3 f8 c! Y3 h* _9 G3 D" | a
case '(':5 d5 z; z# A' v, r0 K7 B2 Y
if(!csym[1]){nLevel=0x100; nERR=1;}else6 j8 M) J3 c$ ~; y1 E
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ c/ b [1 |# F, r. U$ k else{nLevel=0x100; nERR=1;}
; X2 n$ C. o N# J0 C {! I5 W break;' t& y) }+ Z0 D
case ')':
& w0 q* b. [( h9 | {nLevel = 0x100;}break;6 U3 y$ Y& i8 m; i
case '+':case '-':case '*':case '/':7 O& W7 M- X9 f d5 E$ A5 X5 Z2 |
{csym[nLevel++] = csym[2];}break;' G& X. N6 x/ p6 u2 t- L, @
case ' ':case '\r':case '\n':case '\t':continue;7 t- g Y1 e" e3 k& R3 E. u
default:
* |( e8 ~( s3 ~6 |1 W' y. y! `8 a {nLevel=0x100; nERR=1;}
3 G$ A( i9 [0 D9 g S }
' d! J! {* V& d8 K, l/ ?" X if(nLevel==0x100)break;# K, S' W( l: N; k1 O
if(nLevel&0x10 || istrin>>t[2]){
# V( z- }1 C" Y! f2 n1 U$ g7 w nLevel &= 0xF;
* I0 g; b4 ?, z: J: i* R if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 Z/ [0 F0 i( g8 ^ [) Q
if(csym[1]=='*'||csym[1]=='/'){
! u& w8 |# d* r GetExpValue(t+1, csym[1]);, ~/ ~) Z( O \4 ]( d/ P5 q
}
" d& H" k* J. d& E- n else{8 \2 L; T) @7 B6 n0 A
GetExpValue(t, csym[0]);) W: C8 s' ]& z
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ N' i' M1 w7 k, @: V8 F* L/ P }0 ~9 ?+ C1 f! E6 I, U% s; b+ D
nLevel = 1;
0 ?6 D/ c2 N6 B2 L }
( x! z6 A: w% g9 T2 [0 W- }( C( H else istrin.clear();
5 t# |$ K3 ^! q& z) n }4 V+ T) P6 h5 z4 X. s
else{nERR = -1; break;}2 k5 v; D. \+ e9 X! L3 |
}6 f* b) C' B0 X3 K2 N* }, Y* b
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( X3 t, E4 B# V# T else nReturn=GetExpValue(t, csym[0]);
: C5 |" V& ]8 I4 p$ E1 s. F return nERR==-1?1:0;
& i" Q u) t* r( e5 _}}* r; y* L; `& x6 ?( _ F
9 b+ m( E; R" f' {! h, o+ ~. w
( i) i) w! z, h. g8 T* p9 D
函数模板使用示例:
- B% A& u/ E9 k在以上那段代码的后面加上以下代码:4 ^7 j( h2 R# R9 P% { }
: k3 x* \9 a( K( H3 w
9 p3 V8 S* J: {: O+ g% d- v( G1 `) n2 q% @4 s, B
程序代码:
3 k% J* ]& Q& O
. {! z! w( G* d4 V4 I2 g#include<strstream>& k# ]0 |- V* v4 o( C* V) |$ E5 ^/ F
#include<iostream>7 e; E. M4 F# r* n% J4 z1 ~. e. y3 G3 w
#include<string>; W: ^1 P! x- R; x/ x/ ]
using namespace std;+ Z" e# ]& ?% q8 m- e( @1 l D9 n
int main(void)
6 W1 G f! ~" y3 d2 Z0 C4 B/ _: f% l{- h/ M; t* R+ a% ^* w
string s1;
* S/ N/ v2 g" x5 J while(cin>>s1)
! j7 {5 R" g& h/ P {
2 j5 j8 r* v/ q# b& I/ ?- ]9 f istrstream isin(s1.data());
' [, c9 K5 g0 Q. u( d8 r- I: ? double d;) r# ]. K6 V2 {
if(fy_Exp::GetExpValue(isin, d))! _. }" f+ g. ~4 P# A: P$ _
{7 y5 Y e V0 I- p; F3 H: s
cout<<d<<endl;" C. M+ r5 k: \# b& D
}8 ?0 P; K( J$ {4 R, S( s
else
( u0 J1 |3 U+ k0 P! H, G {( [% N% A! J+ _# K5 d4 R6 A" B
cout<<"ERROR"<<endl;
0 F; `: u; x! s }
1 k) ?& I! V" d( C$ T; }, b- v }7 B5 e1 M e9 P& J1 s1 f+ `
return 0;& ]( z7 ^' k% B5 m$ I0 C4 B/ Z
}
" q9 [. Z' K+ ]+ z' x0 |" l7 B% \7 H; x
1 h6 G" s. G, Y8 s% V& b
然后编译执行就可以了(*^_^*)
: ^: N" I6 {( k4 x4 @4 b其它:TC++上一定编译错误,不保证在VC6上也能通过编译 e" ^$ b2 G: m4 n4 w
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|