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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,0 U) k t {, ~, g
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% l" k+ f# H9 _& q, H只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
7 R+ p1 ^" l& y* \参数解释:
# [1 ?9 P9 @7 _istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
+ |8 t: X& K- K3 }nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' G" u% H4 [; a) k9 l! |
返回值:
S+ G1 g" \/ B7 [) f. I5 O# ~返回非0表示计算成功,0表示计算失败有错误
' [+ i: a' n" E, D( `( w5 C# b9 F1 I+ C, e/ A
5 v( c2 K3 X9 T4 F
/ J8 g7 V5 Q5 ^4 q0 [4 l0 z
程序代码: + ?9 x$ O% U2 d
: n7 ~6 h& w2 p, B8 ]0 Q3 znamespace fy_Exp{
+ [: Z' E1 \; V8 pnamespace {template <class _T>9 u5 f& L; ^+ O8 p
inline _T GetExpValue(_T t[], char& csym){6 K. \' G. E% w; e6 P
char c=csym; csym=0;
3 ^# M, I$ t& D. e3 o4 ?& P* T switch(c){
- m7 X( W$ l0 p/ J+ N case '+':return t[0] += t[1];
% t3 _& P- P1 X3 j" Z. M case '-':return t[0] -= t[1];& z1 Q3 ]7 R: J9 b, v- Q
case '*':return t[0] *= t[1];
3 E$ [+ t, C8 \; r default: return t[0] /= t[1];//case '/':8 ?: v. N! O( h( O% V
}, ^1 x0 ` C! ]8 h6 a$ Z2 e u
}}
2 U9 f( }2 _2 L% f1 Xtemplate <class _T, class _Tstream>
4 x) Q6 D9 q( V4 Q% w/* _Tstream: inputstream, _T: get return value
6 u3 a/ s3 j b* ]6 q) n* Return nonzero if get value successfully */2 Y/ j# b( d& H; `- B
int GetExpValue(_Tstream& istrin, _T& nReturn){
1 A7 ]0 n- x6 U: m* y _T t[3] = {0}; //雨中飞燕之作8 v9 [; S$ N+ [3 C
char csym[3] = "++";
" i& ^. e& v- {9 T6 H; n$ T+ C* d7 v int nLevel = 1, nERR = 0;& ~! H, v8 R" ~1 b4 Y1 A- R5 Z
if(!(istrin>>t[1]))istrin.clear();8 P5 y% q2 ?* x+ n2 V8 I
for(;;){& ~# M! [+ _! ~0 B' M
if(istrin>>csym[2]){
7 q4 y3 s! J& f& w switch(csym[2]){
$ F4 m& `0 q/ a+ ^! x2 z* R case '(':* a. x: S! ?' p5 L, w! q
if(!csym[1]){nLevel=0x100; nERR=1;}else3 ] t3 L7 B5 w& B& T0 e, E, T
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;4 q: p$ ]. ~' K. N0 w$ `
else{nLevel=0x100; nERR=1;}
) r9 f' [6 g, y break;
% m" B, ?2 |$ L& i case ')':7 E4 L3 Z" k4 ]( C& a
{nLevel = 0x100;}break;, g3 }, L' J# O; w( A# P1 n2 Q6 K
case '+':case '-':case '*':case '/':
+ a/ \: b9 m* R- k! H( T {csym[nLevel++] = csym[2];}break; D5 S: @: O. [
case ' ':case '\r':case '\n':case '\t':continue;. w$ |, H2 W2 L3 \
default:9 W( F& S1 u% z+ S
{nLevel=0x100; nERR=1;}
" o! E4 M* a6 l8 x0 } }
7 o4 u Q+ w# C2 _0 p if(nLevel==0x100)break;
; ?+ T& z+ e* W1 [ if(nLevel&0x10 || istrin>>t[2]){
! S1 k+ U) V; C0 S+ E" w3 J% e) _ nLevel &= 0xF;1 f) u- P* M7 x4 ?" ^( ^8 w
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& {1 f6 |% \" A0 t+ P" W7 U& E
if(csym[1]=='*'||csym[1]=='/'){1 K& ?: l6 F( _7 ~
GetExpValue(t+1, csym[1]);3 s9 \. A& L" p2 f5 Z- o
}. h# T) i& [$ [8 R" ^. N6 t9 f
else{0 e$ H5 H9 Y% N5 \
GetExpValue(t, csym[0]);, f. W& `1 Q& ?$ e, b9 T$ M
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
4 [" o1 N) {# V+ E& }/ b }. \2 u' I x/ g& B8 ?4 G
nLevel = 1;
# J3 L' O9 M( F }6 z, t+ y( ]6 i: A; d9 ~
else istrin.clear();
& K( p# F7 s1 A; R$ s }
7 d+ h' u* A; ]% H) W else{nERR = -1; break;}$ {8 E+ S6 X: Z
}% X5 y: _( k5 M# F# z2 c$ L/ c
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 G0 d/ ^( h$ J J' s1 J; ?+ O6 y
else nReturn=GetExpValue(t, csym[0]);; {, _, V& j3 B+ r* f0 K' N
return nERR==-1?1:0;
% v- y/ o3 Y+ T3 I6 g- |}}
# C- f) m6 @ y7 D9 t3 f
: b) ]$ u1 K! x! N, {3 b* ]8 S5 t7 L4 {) ~. m: s) C% t8 ^7 k
4 R4 e, t& e3 h$ l! C3 `函数模板使用示例:1 f( f$ _# E5 ?0 k# b+ c
在以上那段代码的后面加上以下代码:
# D i( N; b' Z: m) W2 ]' [9 \
% {$ t6 _; }8 v" h! O
! s: P# P- m, |$ x8 D8 L( G. D' v- l- l5 I; Q$ u! h z
程序代码:
* g- ~& u6 [8 e( f% J( u: {# E5 f) ?) x
; L/ H4 h+ g1 ?' R9 I! x#include<strstream>& Z% O6 z. F( P& G
#include<iostream>9 i( i+ ]& A0 g
#include<string>* c4 Q# d7 v: W& Q
using namespace std;
- l7 \. b0 b3 X0 Zint main(void)$ Z, U9 U& f; k9 K3 C
{
3 M/ Z u, F! B: Y) ? string s1;
. F: f) C1 Q2 q! c* G3 k/ H while(cin>>s1)0 ^ Y9 F4 m% \% G! V5 W, q3 O" a
{
7 N0 I# c- [ R5 |" x3 s istrstream isin(s1.data());
7 o+ |8 s3 G' L- u r: O double d;
4 v" X0 R: q' r if(fy_Exp::GetExpValue(isin, d))- c, c2 g+ a- Q0 J$ ]' `
{
% B' i/ W# b3 s! n# H5 T cout<<d<<endl;. k! Y M! k$ c# ^( Q6 l
}- w0 E0 ]; A# o1 j: s" o
else/ m' ^+ h- f5 F3 l/ t( E% K7 n
{
* X, Q% |+ K8 \5 m/ f8 w! a- Q cout<<"ERROR"<<endl;# H0 F1 |& Z) d+ g, K! {# u
}
5 o+ m3 l6 ^# L# |8 h& l S }
- A3 r, Q& u1 l1 I( i return 0; u* e8 H7 O: L. U. W: k* H+ \0 o
}
$ l7 O6 y1 O6 c5 `; [! Q, g# B/ K! t% W) v4 ~
) [( `; E/ ~2 } Y, R# Y O3 B
然后编译执行就可以了(*^_^*)
( _( O& F& ]5 z4 ~+ S其它:TC++上一定编译错误,不保证在VC6上也能通过编译: l) U! B' `% ?7 }) a6 i Q
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|