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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,/ P& u6 z( k/ w
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式. Y/ ~0 P. S$ m8 W! f
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& B# K% D+ b% G, m* R参数解释:$ K5 o# X/ P- ]9 m3 o5 m; W9 q& V
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 }. P& ~3 K% _0 D
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ v: }6 e; q' e0 R0 @8 @6 Y" p9 i$ J
返回值:: s8 S+ F+ a! k0 M F5 h' F
返回非0表示计算成功,0表示计算失败有错误
' a" \% w! w/ m# p
$ U2 ~8 H, X4 i1 Q3 V- b
! y6 J3 ?6 M4 t5 _1 N- F- Q0 `; B1 M0 ?2 F
程序代码: ; j$ {6 Z% S% q8 T
' i& Y c$ y' q' i1 R7 w: Y
namespace fy_Exp{! ~5 h4 ]+ P3 D$ X% O2 n
namespace {template <class _T>0 |" w9 O; M g
inline _T GetExpValue(_T t[], char& csym){' q/ f% q+ }% D" x5 J
char c=csym; csym=0;
/ @" f4 m- x8 O3 J9 s# n switch(c){
% h$ I2 v- S; E case '+':return t[0] += t[1];, J3 S4 N0 ^* U9 h% C' x
case '-':return t[0] -= t[1];
1 m. i/ c" k0 r' ]1 W case '*':return t[0] *= t[1];3 ?5 C0 G2 u, f( s4 Z7 C1 q8 H0 \
default: return t[0] /= t[1];//case '/':( U- M+ _5 B7 }6 q
}2 I7 m6 R$ }" l" s7 L, H
}}
+ ^. N% [) V1 I: w7 ? s6 Mtemplate <class _T, class _Tstream>8 }5 Z5 F0 a# @% r5 Y: Q
/* _Tstream: inputstream, _T: get return value
' Q/ B' k- G! ^* Return nonzero if get value successfully */
6 G4 G, r* x* k3 n5 E& W- Kint GetExpValue(_Tstream& istrin, _T& nReturn){
$ b5 ^/ j5 z- H q! B2 N) Q$ w _T t[3] = {0}; //雨中飞燕之作
$ r# I0 g) K; y( Q6 [% @+ w char csym[3] = "++";
/ G" ^2 e5 y" s( y: |: a: Z1 Z int nLevel = 1, nERR = 0;
4 Q) @ K* v+ w) R- n) U3 t6 P9 O2 P if(!(istrin>>t[1]))istrin.clear();
4 a7 F; N& B" d" ~4 c3 X+ C8 ^$ k for(;;){
1 v4 o/ ?$ u# k% \" ? if(istrin>>csym[2]){
) R$ F/ ?- \' G" L switch(csym[2]){6 l1 [! c0 b8 r( Z' L0 u
case '(':
% g+ ]: W( }2 {: B, H" Q) g% N1 H' t if(!csym[1]){nLevel=0x100; nERR=1;}else
4 ?$ G$ m8 B7 h# g3 r E if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 U1 `# {4 n8 e( V; h) P% P% ~" t9 F else{nLevel=0x100; nERR=1;}
& n' y8 O5 V5 u' L* ` break;
* Q$ w; C& j8 _$ \$ P4 [: Z case ')':8 ]. C3 H1 C! g; q
{nLevel = 0x100;}break;
1 P1 d* U6 G$ f0 H7 T case '+':case '-':case '*':case '/':
7 r# B, Q5 ]- x6 Z7 w& p {csym[nLevel++] = csym[2];}break;7 c- _5 ~& k/ i8 \7 L4 p: \
case ' ':case '\r':case '\n':case '\t':continue;2 }4 a. R. l' s$ F- i) M7 w
default:
3 U/ K7 V- t5 V2 i9 E {nLevel=0x100; nERR=1;}3 U+ {) o( _! n$ b8 U$ B
}9 t) D4 D3 u" J4 E
if(nLevel==0x100)break;. P' a; R3 b! y6 E, _# H" e* f' p
if(nLevel&0x10 || istrin>>t[2]){
" B3 J5 J! Z+ V n5 s$ O" I3 L- l nLevel &= 0xF;4 J G- G7 N* |7 e3 L" |1 n, W5 E
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}6 q0 z8 t: u% l1 v1 H
if(csym[1]=='*'||csym[1]=='/'){
7 S0 h Z& [* \6 D GetExpValue(t+1, csym[1]);
$ P1 h4 C n7 e- y" e: r/ ~8 X) A }
n, ^# l: y) K1 f3 r( K3 Q7 Z) m3 b else{
8 `* z' Q% {# W2 Z3 c$ L GetExpValue(t, csym[0]);1 W& N0 t$ n) G! v
t[1]=t[2];csym[0]=csym[1];csym[1]=0;! q; [2 K" s6 W3 F3 x2 k
}( [# J8 D$ f2 l8 u6 z
nLevel = 1;. H: E7 H9 f6 Q# F' F5 }
}7 \, {7 J+ q# ?! N! A
else istrin.clear();
& I8 S5 i! W/ [8 X% c) M }0 q" W& H- r( p$ m$ y7 |/ z
else{nERR = -1; break;}
5 [1 l/ M W p! b! g, l }. K8 B. w( s& s8 L! S
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 k# W) }1 O+ z+ }
else nReturn=GetExpValue(t, csym[0]);" u6 k, O& ?3 i0 ^' V
return nERR==-1?1:0;
4 Q8 R7 t8 }) |' N}}
" r4 I# i" V( l2 J6 I+ f1 P- p3 t. y5 P
+ [: a9 C- d4 y( T& J) k
5 `4 Y1 s9 b% P9 Y4 F8 V' _; w. S* V9 D, g4 @" k5 ]6 i% v! I
函数模板使用示例:! n/ S1 t# F: ]% C9 s" r1 w
在以上那段代码的后面加上以下代码:
: y2 }! x6 Y3 n2 M- }3 x. ]6 I0 a- f/ z& Q9 x# T$ Y
+ W# `% v* k" Y4 A
9 G2 h0 W; w; H/ Q+ @) r程序代码: 6 m& |/ M- H; `+ \ \4 j
3 \; x7 c& c! @
#include<strstream>. W+ t) M& `/ t3 j& B: H' ]
#include<iostream>' M1 V: {' }1 n" v: O0 S- t
#include<string>
1 N' \) V, f: `* ~" v3 h3 m% wusing namespace std;
" D4 m3 H/ T9 x$ [+ dint main(void)' G# v2 {0 p; C* M* |. i
{
3 j& y1 E- c+ v) v string s1;5 K& s6 P( T0 y' y' m4 i
while(cin>>s1)5 j% j+ b, }1 m# r# W: n. m
{
( Q A" p& m( u m4 T istrstream isin(s1.data());
8 E4 X0 U+ c+ ~8 T( u% w. x1 @ double d; `. R- n7 a2 V; \& G
if(fy_Exp::GetExpValue(isin, d))$ Y% ^/ m5 R) g/ l' ^
{+ o1 h: b6 |0 y% _: }- ~
cout<<d<<endl;
9 C8 u! [; ~: n* y& w; a$ K/ `# H }! s3 P6 ^3 X4 } o0 \7 s! x: D
else6 X' U; x/ i# L& b
{4 X6 |, `& P3 c( u9 e: F% t9 \
cout<<"ERROR"<<endl; j; T9 {) N/ L- g! F L8 M1 R
}( L4 c' B+ ^9 X/ G
}7 d: l" A7 G9 x$ B
return 0;7 H' f/ U: r7 k5 D; v
}
_' f8 D& d. g U
6 ~/ C- ~9 Z2 }5 }
" G8 ~ I. ]1 K, `7 S' u然后编译执行就可以了(*^_^*)3 t; H$ U$ P8 N M, P0 p3 I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ }0 C3 H7 O& `5 `, ~ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|