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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
8 o8 F5 D3 P( a) s0 d; ]一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% G( ]7 m7 I- e& O# _5 q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# v' {0 O0 ?' z8 G% L5 L" {7 P参数解释:& ~' C7 U/ S/ c* W! P( t
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
) p# \% ~1 j% @nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
! \. n8 v+ Q& X# K9 ^' C返回值:
! e4 X! r3 L3 N/ k' X! g返回非0表示计算成功,0表示计算失败有错误2 }+ B4 Y5 c( j, k0 F. m i' g
V1 s Y, E: e5 t4 K# n- }+ Q( x0 B 3 o* X- l" K' _/ ^- }5 S
E7 ]4 a& G' @6 R/ j! U
程序代码:
; e" |8 c$ G* c6 ]6 H& y
8 ~/ |+ r n" X# ~! qnamespace fy_Exp{
4 ^3 o5 P g1 u5 R- X7 Z. @" ^namespace {template <class _T>
" X* J- T. Y, B3 minline _T GetExpValue(_T t[], char& csym){
) j7 o" ?/ M" `2 Q char c=csym; csym=0;) [) [ \3 e2 ` p, w
switch(c){
) q+ W o0 Y( I4 ?- l0 `- S9 l case '+':return t[0] += t[1];. q3 V0 b% `6 s1 B2 } C
case '-':return t[0] -= t[1];
# o. j( L7 `9 @6 {9 ~ case '*':return t[0] *= t[1];
# e+ L0 I& `/ x8 e ]3 s; ^9 f% A( e default: return t[0] /= t[1];//case '/':9 q; W# V# X* m. Y
}5 ^+ a! R( n: I) K, b' V
}}
* K- Z1 H0 q$ K3 ] {1 t: \template <class _T, class _Tstream>
# i) q% ~6 g3 J/* _Tstream: inputstream, _T: get return value
5 A9 Z6 R* |. S( y4 H* f4 j* Return nonzero if get value successfully */
- O" N7 x6 q, h3 G% L0 V8 C2 Eint GetExpValue(_Tstream& istrin, _T& nReturn){! N( a( s( y8 F8 ]
_T t[3] = {0}; //雨中飞燕之作/ ^2 I- v% y z
char csym[3] = "++";" F; n: h( J( z0 D3 Z
int nLevel = 1, nERR = 0;
" a& [7 ?$ R8 a; K- x! J( h+ \ if(!(istrin>>t[1]))istrin.clear();: H G, Y" b; L
for(;;){
2 G: P# j# v3 Q- | if(istrin>>csym[2]){2 T8 C# J! R4 O
switch(csym[2]){+ e: n( ]# |2 I# N; D2 c( }- M4 y
case '(':8 @7 r- D! P. c0 _
if(!csym[1]){nLevel=0x100; nERR=1;}else
$ u3 r0 x- y* C$ `* j if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
& ^! P1 R* d( q$ J3 K. H else{nLevel=0x100; nERR=1;}
0 j, t& T& m$ F break;
, a0 O/ T4 V& ]5 N( r, w case ')':8 B+ w }2 }7 G9 S1 J5 f A
{nLevel = 0x100;}break;
( x9 G0 u9 }8 y case '+':case '-':case '*':case '/':0 h* @3 k7 t" T8 }' h V
{csym[nLevel++] = csym[2];}break;$ y' U/ r5 g C# G6 {* l
case ' ':case '\r':case '\n':case '\t':continue;
' U, D, f; J# \6 @* p; O default:1 M& Y+ r5 O+ y" E
{nLevel=0x100; nERR=1;}- h1 ~; l/ {1 y3 X- {) Y9 t [
}6 _! w3 _" u2 [6 I6 L
if(nLevel==0x100)break;
" {) z( w }& l( j' r6 P$ H! W7 a* P if(nLevel&0x10 || istrin>>t[2]){6 O% O1 t" B" }
nLevel &= 0xF;, C' M% \9 X- o0 e
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
' g& L2 P' n; H if(csym[1]=='*'||csym[1]=='/'){
9 N; B1 n( J b5 L1 u4 n GetExpValue(t+1, csym[1]); E5 z- ]4 s. y: d; v/ T' i
}$ ~ n, Y4 ^) E, Z9 {( ^
else{
$ W' Q& G1 d1 [# x GetExpValue(t, csym[0]);+ r- h( R8 y4 o" i
t[1]=t[2];csym[0]=csym[1];csym[1]=0;5 {; N Q F; E1 a
}
( ^- R& T! `9 Y0 p+ b nLevel = 1;
. ^) c& n- w5 E- ]6 ^ }0 q" F. {6 x; k0 C: M' }( R
else istrin.clear();" m- O4 P ^; F/ ~5 t
}$ m& M! j/ ]6 S' p. m( c% \7 g4 p
else{nERR = -1; break;}+ p! ^& N3 w- @0 l9 i$ o! j
}
2 w6 p" `2 |0 E7 n7 M; W' O, n if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 d' }/ O% @. A* C$ m else nReturn=GetExpValue(t, csym[0]);
) B2 p- i3 l2 G6 o. P return nERR==-1?1:0;
7 I* T5 o% a) h4 J" ~& P}}
! y$ T" ?# p4 X0 d# ]" P: {( M7 X1 S3 }. o# ]2 b1 S; X+ [
" o4 c7 n6 _* W, D, X( U8 r+ Q
' {: R0 T* ^( V) e
函数模板使用示例:$ U" M/ c- e, H; O
在以上那段代码的后面加上以下代码:
/ L- J4 X3 V' q0 a, K
( f1 L n5 N) J; E3 ]5 S: W J3 u, v) w' D ^' |4 t$ H# K
* M7 W$ K! r& V" ]$ R; o程序代码: & Z Q) t* K! F# \; n# M& \
" j0 x+ o- M! H7 Z
#include<strstream>) M4 N( x! H9 ?! f9 ^
#include<iostream>
' g' n9 _# ]$ Q; t$ s6 U#include<string>
: N+ S& Z! Z9 y. F6 f$ B2 {6 d4 kusing namespace std;3 w' J% c1 N0 R5 j F! [
int main(void)
6 W9 X5 K" X) P! m# R& V{
/ o1 w. V* K3 A/ w" Y9 u string s1;4 J* f' J4 ]2 m( p
while(cin>>s1)
/ i( P- S5 n7 q7 n- d) z+ V: K {: x7 h" u4 I' e4 b! t; [
istrstream isin(s1.data());
9 v. |8 r. t6 r9 o8 S/ v( V double d;5 `% |* D$ `) c; r
if(fy_Exp::GetExpValue(isin, d))
5 u S6 X4 M% J3 _' s! E {
$ F8 y$ V0 T; D( Y7 L6 ^9 C cout<<d<<endl;
+ w8 S( w' I2 Y6 |1 J9 K G }1 s1 e, |0 z1 Z& o6 K1 G. ?
else, i9 A! `/ e1 V& p) q6 J! M
{4 H8 z8 T: e: z9 ?
cout<<"ERROR"<<endl;
5 g u0 h" B" u9 ~ }
. F O; A- ?) P }
! g r, w& B9 | E/ S: ~; G return 0;1 n: C2 z3 C8 ~2 y4 L5 `* P1 [
}' H' @% G) B) n# r2 J' @2 {
b+ H7 Y) ~4 P& q
0 X$ a+ S+ t4 v0 b然后编译执行就可以了(*^_^*)
6 T2 _. s, k1 m& B1 }其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" Y* D/ n$ ^" ] 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|