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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,1 K7 l% v+ B; l4 a" ?; `* I+ T% M
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% Q# R, N$ w8 ~只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% N/ p7 f- B6 G. p7 x5 {参数解释:; h+ M4 Z( ~. m& ]# J1 Y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
) K4 f% s# ]* }! h5 _/ ynReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定- N- \- m: X6 |# O1 ^' R5 A
返回值:! p; m4 X, K* [4 f% F
返回非0表示计算成功,0表示计算失败有错误
6 a% @+ { b. ]- ?, y
# V7 N1 W; x# X0 }( U- M0 D* B + f$ E/ ~8 D6 x3 b1 p. F$ I
! o% n h2 r' V0 M程序代码:
2 H4 h% q0 A% n$ j( x# e& p$ B0 F! X6 Q
9 o; S2 P p( x) Qnamespace fy_Exp{( O+ ^+ M: O) ^3 G; ^3 w
namespace {template <class _T>
8 r* x! J; b& \) `. v3 p& l$ |inline _T GetExpValue(_T t[], char& csym){
% d; ~: q6 j* V+ k4 l! p; ^7 C char c=csym; csym=0;: x" F, z3 \4 [
switch(c){& K$ t1 t$ J( v! [! [% d
case '+':return t[0] += t[1];
; t* M, j( K8 e. g2 R# w; D case '-':return t[0] -= t[1];
" V% [: p3 O) r7 u case '*':return t[0] *= t[1];
3 u' A5 J8 P$ ? s* } default: return t[0] /= t[1];//case '/':+ _+ l; i- t" Q9 l3 \ K! [# _$ E
}# |* V4 \) M$ J; w3 v U4 j
}}
% P8 e: l( Q" d0 Ztemplate <class _T, class _Tstream>
3 k8 k% m3 ^) q& x/* _Tstream: inputstream, _T: get return value% _3 D) O; P _# B' X% d
* Return nonzero if get value successfully */& t% p. J$ s) D* \5 q/ Y% q0 J
int GetExpValue(_Tstream& istrin, _T& nReturn){3 a/ O- [8 A }' V
_T t[3] = {0}; //雨中飞燕之作
3 M9 [" ]4 n- G/ [& e char csym[3] = "++";. i7 e5 `( r0 R1 B Z3 [
int nLevel = 1, nERR = 0;
* y# [( P' ^# X q# g. ? if(!(istrin>>t[1]))istrin.clear();
4 h9 {* A5 {' f) E: j: F/ D$ i for(;;){1 [* m& `0 H# x, ?4 A9 r
if(istrin>>csym[2]){1 S/ Q& z0 f& G: m3 Q: a9 v
switch(csym[2]){( X9 e3 P, d$ z; Z1 Z( C
case '(':, X7 Z! n; z9 t( a4 j9 l. O
if(!csym[1]){nLevel=0x100; nERR=1;}else
* x8 v5 {, ^1 M3 [% q5 b9 p. @ if(!GetExpValue(istrin, t[2]))nLevel|=0x10;. i0 l4 x" e9 x; W5 |& ~
else{nLevel=0x100; nERR=1;}
3 y' w/ o5 G( S0 V0 b break;
e+ R+ j- F1 }/ r" n! K case ')':
9 f: E3 I/ {2 @ {nLevel = 0x100;}break;+ d: z2 |/ |" P9 U3 g* z
case '+':case '-':case '*':case '/':, R) T2 o# J' m( p. O. k
{csym[nLevel++] = csym[2];}break;
5 }7 T Y. @: m9 w/ N7 ~/ U case ' ':case '\r':case '\n':case '\t':continue;# ?9 j, }, [/ y8 n. e
default:( \& a5 c" X: Q
{nLevel=0x100; nERR=1;} r8 e. e" o: s' }
}
4 ^6 T- a! C& ^. T* } if(nLevel==0x100)break;) M/ H/ }2 p X/ R. D' w
if(nLevel&0x10 || istrin>>t[2]){
2 E' G; ]& Q- U, y0 ~ nLevel &= 0xF;
" K& h( f) ?5 J. `+ o! | if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 V* t0 ?; L/ G7 y! u0 { if(csym[1]=='*'||csym[1]=='/'){
* e! {, r9 P2 U2 G" s2 M) d) s/ ?9 { GetExpValue(t+1, csym[1]);; J' ~% R. G6 C/ l- y8 ^, ~* w5 A1 p
}
( `" o/ I4 a& i1 j. \6 Z6 F else{
; }5 l8 x) n! a8 t8 b' ? GetExpValue(t, csym[0]);8 X# u' A( M" r6 j9 F3 K$ _ e9 E' U
t[1]=t[2];csym[0]=csym[1];csym[1]=0;) X; M1 Y+ | D5 V4 Z& L5 o
}+ l. l) [% u2 b# F
nLevel = 1;
. R& d2 \) ^0 z" F5 }4 p }2 ~! K' g6 }5 k! `4 ~
else istrin.clear(); D* H6 x9 _/ l3 N! V3 x9 J# `
}
) V. R( q1 ~7 |) M else{nERR = -1; break;}# ?6 L' W3 `& c$ a" z& m
}# D! a; ^! [4 s2 z9 X- ~
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: p3 _0 q( V C, E- C4 k: g' B* G: } else nReturn=GetExpValue(t, csym[0]);
) {) D* ?, J) R8 I: B7 J1 P' w return nERR==-1?1:0;
+ `" @7 a' w8 k9 e+ G# y+ o}}" ]8 Y( e# P/ d0 `. W
$ w2 |5 e. n& G& Q& c
# b! g3 U! D( X- O% _7 F
% k. H, m7 E8 [函数模板使用示例:2 L- p* u4 Y$ T; K/ p
在以上那段代码的后面加上以下代码:
G( {* ~# N; V" X0 |" Z8 T5 C4 m, e7 R% b
+ h* ^) n$ |6 F c# C1 z0 }* g3 c
$ p% g; h" E: e$ y% @程序代码: 8 ^" s* d- p' ^
! P" J5 l- Z- C9 z$ ]. f
#include<strstream>1 K9 F/ p6 g0 c$ q
#include<iostream>3 A9 m5 j% V, i
#include<string>
# O0 m8 [- ]* D3 Z0 V3 [& Eusing namespace std;
+ i' b9 c6 _- V( iint main(void)
. \# [& h% Z; s{
% ^0 P" v- g/ J& |- O& j8 k4 f string s1;
, F/ u& c B7 g& g* n- o5 D8 Y while(cin>>s1) W( R' Q5 q. S3 F& T( A
{1 i. z2 b( ]! W( e4 h4 T* a6 g" R( ]
istrstream isin(s1.data()); i( i+ e% d+ ^0 b8 B( G" F4 n5 n" l
double d;
^' C* P) P' F3 p- ?. P if(fy_Exp::GetExpValue(isin, d))
$ ~9 P5 Q- q: D, }4 W* |3 a; O4 ~ {
1 X. [9 u, A0 L6 J' M cout<<d<<endl;
6 o* A, E. H. m7 g( } }& j b5 D: @4 P J P3 J$ s% B
else) X% G( a1 ^$ J
{2 }+ d0 W# L/ g+ _6 ]7 U. U0 Z
cout<<"ERROR"<<endl;
2 s$ ~" ?5 L3 t, S! a$ C8 n) A }3 }) l; j6 S9 [# y
}
4 Q, q5 X( d6 K3 K$ n return 0;
N) Z( q9 k! Y2 [; m& T}
1 A' H/ A3 [9 ~5 X- `3 ?
& T+ o9 T1 J* H% `' r. e A
# x/ }1 B9 E1 s4 x6 q3 |" _然后编译执行就可以了(*^_^*)
9 n- F( x5 s. }4 \: o* Y其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) c- q2 h6 Z8 @# y. Y+ [ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|