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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
5 J) k* X+ q! t: E一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) t8 g3 l1 f5 T) a7 g只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" z8 K, t, L" J' @' s参数解释:1 ]) i& N: X; a2 e6 D
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流/ i# b* r$ v2 @9 y$ e
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; y, M p+ x b7 u
返回值:, ~( [: X) R' D I0 o/ b
返回非0表示计算成功,0表示计算失败有错误
& H: f0 h& W5 `6 [6 Q
! g9 R3 v, j7 D/ h6 e 4 [4 h$ l. u7 }8 S# t0 b
+ w2 Q: d/ r" _8 n/ Z! u
程序代码:
o1 {4 z1 O( T# _) m b
8 w6 B" r+ X3 I* h. lnamespace fy_Exp{* s; a" o" H/ U8 a- w! I- L) y# C
namespace {template <class _T>
U* [1 o" e: o% m! |! b( Y Minline _T GetExpValue(_T t[], char& csym){
6 K% |$ J0 E' a a char c=csym; csym=0;3 b. e: ?. D2 Q( j v
switch(c){( r& R9 b& e- m5 j
case '+':return t[0] += t[1];
/ s/ H& d9 y" C7 A$ Q" d+ x8 T& W. w case '-':return t[0] -= t[1];% f' K) p& m5 ]4 ]$ h g- B
case '*':return t[0] *= t[1];
! X! c2 Z7 m* O. ~" @2 Y. ? default: return t[0] /= t[1];//case '/':
7 L( F* E5 c9 y# d" J% } }
9 m! F% g2 S! N% l& D}}3 P, W4 N* K8 ^' ]) J' u
template <class _T, class _Tstream>
+ p" Z9 v2 E* [) j! G+ p2 Q+ x/* _Tstream: inputstream, _T: get return value
8 G! Q0 t8 W! N7 R6 w; ] s* Return nonzero if get value successfully */. p! O+ d, Z6 k5 O; b2 Y0 V6 ], U
int GetExpValue(_Tstream& istrin, _T& nReturn){
9 Q- L: V: S/ k2 g, v) @ G _T t[3] = {0}; //雨中飞燕之作
$ ^ z% ?6 @: L: M* [0 s char csym[3] = "++";8 x% B) m8 g2 L6 k
int nLevel = 1, nERR = 0;# Y6 G* c: ]& M1 l
if(!(istrin>>t[1]))istrin.clear();
! {; ^, B# J* Y$ u9 x. j0 Z! m* k for(;;){
- e0 t3 G6 L& X" `0 U if(istrin>>csym[2]){
' b m& l. H+ V# ]0 i switch(csym[2]){
% v3 M9 ~3 s ], V5 D7 E case '(':; X* R. G& G) J' y' M# r; }% W+ H
if(!csym[1]){nLevel=0x100; nERR=1;}else+ I! z. J4 L b9 y A# y& K0 _$ \
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 t; s8 H% a, P8 o9 h* K
else{nLevel=0x100; nERR=1;}
/ T0 S- `8 m& l" L" d0 f1 ~) O2 _1 A break;) `6 P& g' b. o3 ~: S
case ')':; d4 @! N& l4 o. a3 D/ s
{nLevel = 0x100;}break;) f) W; U" `2 y2 i- y. f7 {
case '+':case '-':case '*':case '/':! S9 b y6 w! g- V
{csym[nLevel++] = csym[2];}break;, Z i2 c$ z/ v8 ?. O' ]* x( P
case ' ':case '\r':case '\n':case '\t':continue;$ I0 x I" ]. P4 ?7 L; h, l
default:
6 _3 y% o+ B3 n# G7 T | {nLevel=0x100; nERR=1;}# k1 T& E/ U8 A X+ T
}
0 ^& O4 ?9 c3 j) X; V- o7 s if(nLevel==0x100)break;/ } H6 a2 t4 l& i1 e1 [; o
if(nLevel&0x10 || istrin>>t[2]){# C# N: U4 B) d5 W5 E
nLevel &= 0xF;
) B! ]) d1 G) v4 p if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
( s ^ }' R7 F# S: F- ^ if(csym[1]=='*'||csym[1]=='/'){
7 \5 ~5 r% X1 M/ K- e GetExpValue(t+1, csym[1]);, l8 F, h! E" s- Z* ~) C5 K$ ~: g7 ~
}
8 r. b" t" h! \* c' s else{0 I- e$ U2 ~7 j( @9 P
GetExpValue(t, csym[0]);- f5 I) T" o0 J* y% m, n
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' r5 t2 O; X/ b }" U& ]! h$ K! A& k
nLevel = 1;
8 j6 F: y) P$ i) n3 E4 b& P }
; L S! q. w, \ else istrin.clear();
4 B; S% S# F g }+ n; I! F* Z4 j1 ^; r% b
else{nERR = -1; break;}9 w H5 n+ E0 t% r' C* P
}. o. o: b1 q, P- B
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 F( v; a) w$ |4 `9 M) h
else nReturn=GetExpValue(t, csym[0]);
- }- T( T$ k9 ]0 y% V return nERR==-1?1:0;/ n. ^9 H8 X) _9 d+ [
}} i& w) m1 u% q6 a/ E' v# z
" M7 E& l& O7 k
' _* Q% C k9 v# K1 i/ s
6 o0 E; y+ Y" ^. H函数模板使用示例:! p/ `) P/ D. P9 O- E+ A( M
在以上那段代码的后面加上以下代码:
* ~. H4 `* e) A. X! t$ o3 Z" B0 F0 O
+ v9 X5 `9 V7 q/ v 2 U, [) ]8 P1 q! m% E. @9 r
9 E9 C+ h0 W% y* |& d3 ?$ p' A" k Z) y- n程序代码:
3 S& ^9 ^; y6 l* f) M# k0 q& u( A( E: p/ Q9 T: X3 S/ h
#include<strstream>" y' d# l' |* u' P# ~
#include<iostream>
3 C# Q1 g! o' C/ C1 f#include<string>
" P3 l6 x9 N @! ~. Tusing namespace std;, I2 x3 y% U% d" a
int main(void)+ S/ _, B& j8 G& f+ b7 U) k
{
+ T# a" I+ w5 V# h: w" @ string s1;
/ B$ {! R4 Y/ Y$ w2 S% L while(cin>>s1)
} v+ c3 ~; X/ \2 N+ ^ {! `* b2 ?; T1 E9 l
istrstream isin(s1.data());
: }; b( E7 ^ A* U double d;
' e* O2 ]% C2 } if(fy_Exp::GetExpValue(isin, d))
) X/ R4 ]! i6 `; C) d3 ] {0 s% z9 ~0 \+ G8 z0 ]/ ?" C1 A/ r
cout<<d<<endl;8 c& I4 Z8 Q4 c: i) p+ y9 A4 r: Q
}
# I1 e# n* Z) R else7 o9 {" X' O' X( l# k
{
% k k7 f% [+ o' u5 I cout<<"ERROR"<<endl;
3 X* n. ~ m4 }/ L% j }" k7 v7 X( L4 h8 S
}
! @$ N; |5 R% w4 A6 ?, _5 @ return 0;3 |, l, s5 B/ d& N/ q" ~. B
}
% P7 d- A9 A5 H
) F3 J5 ~% c' W6 O# y" S+ r1 w" s' s" s$ y; ?: w. {
然后编译执行就可以了(*^_^*)* D5 Y y0 @& j: e- N% h
其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ I7 @2 Y4 o# ^4 [$ E5 u9 |
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|