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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
2 N% X5 t( m' U2 ~+ I! P* i一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# D* D) }- l1 h) [! a2 O只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)# k1 i0 @0 N. c9 u* A
参数解释:' D- K" i4 D. A1 ]
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流 [ D. z9 L: V5 i- r# E
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
! [' D5 v9 `" O2 c% j9 t返回值:
8 k* r J" y o8 v返回非0表示计算成功,0表示计算失败有错误
2 a# h9 i, J5 a, c9 r8 x* {. Q/ P2 X4 _& F% R3 \3 V
0 ]" C0 h( i6 ~ t( B4 }8 {) z" h
9 Z9 a$ Q# A. o+ ?) H$ d
程序代码:
( |4 D- o, L0 a. l, Z% k3 d
9 N9 ], ?. J' E7 `3 G; X2 vnamespace fy_Exp{
s& {! W7 J9 h: |8 x8 pnamespace {template <class _T># q% U0 {# D2 H) ^
inline _T GetExpValue(_T t[], char& csym){' `# n' I5 F! R) d8 k
char c=csym; csym=0;
& R8 a ?6 a, a, ~( F5 i, R& K( g switch(c){
0 j9 b" u4 @( Q9 J& F1 d% h! `2 L case '+':return t[0] += t[1];. ?' X% k2 q" q
case '-':return t[0] -= t[1];: Q: \' t! j$ a7 Q7 \' Q
case '*':return t[0] *= t[1];8 H; p: ~* D& q* K4 {, P
default: return t[0] /= t[1];//case '/':
" M: m7 K) }* w, }3 B1 T }/ X( L3 w9 h7 w" Z! N
}}
4 A7 N$ X- @! Y& J/ dtemplate <class _T, class _Tstream>) a6 K% J, C9 u5 R# E/ ?
/* _Tstream: inputstream, _T: get return value1 O% C/ Y2 C( B6 l- V% A3 t
* Return nonzero if get value successfully */
: \. B( M) S" {int GetExpValue(_Tstream& istrin, _T& nReturn){: ^3 p6 k# o8 ]# @/ a# p
_T t[3] = {0}; //雨中飞燕之作
0 Q6 t: z f; r. L2 p char csym[3] = "++";( _% S' K4 }9 e1 y
int nLevel = 1, nERR = 0;
6 p. e2 E; {6 ?. @ if(!(istrin>>t[1]))istrin.clear();
, n" {$ v9 }7 N/ \ for(;;){; R: B6 n+ }( B; ]& j/ @3 Q
if(istrin>>csym[2]){
1 s& U/ {7 T/ @' h; j8 }8 f switch(csym[2]){ ]) L# s4 I: Z+ M
case '(':9 E2 Z6 O/ T( [: E h/ j& C9 ~
if(!csym[1]){nLevel=0x100; nERR=1;}else. f( @, V3 {+ q1 o! U
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: J$ m/ I' @& P* x0 U* J+ F
else{nLevel=0x100; nERR=1;}2 N, [' M' E( L5 K
break;
" [9 N3 D% i4 V+ c. o9 @ case ')':
9 Q/ z2 }; ?* N8 H0 } {nLevel = 0x100;}break;
4 t, b6 U" Z: D) L case '+':case '-':case '*':case '/':
! o3 |6 x( y7 J+ i h) |5 _ {csym[nLevel++] = csym[2];}break; z: w+ ]0 s( K, A1 c& p( C- }
case ' ':case '\r':case '\n':case '\t':continue;
7 p* j# z" ? |: g$ E default:
2 B( V- d3 [) D2 C7 U# ? P0 f {nLevel=0x100; nERR=1;}
. Z S7 b# k/ v% ~" V }4 \- r# |) |& F) I$ D
if(nLevel==0x100)break;
! @' Y% }" Y% Q! o; A) b g if(nLevel&0x10 || istrin>>t[2]){) w. C% G: l) P1 ]
nLevel &= 0xF;6 a6 b$ c; E& e% Q
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
/ b* }) I% I5 J! W if(csym[1]=='*'||csym[1]=='/'){
; l: [9 [# N2 B* q( n: |+ w GetExpValue(t+1, csym[1]);" a& [9 X& x& s/ t
}
( W7 m9 B7 E p5 T1 e else{
" Y- H, M+ p+ R GetExpValue(t, csym[0]);
) Z; H0 |) T p1 q t[1]=t[2];csym[0]=csym[1];csym[1]=0;; f# f+ X7 E6 J$ O+ G* o
}
, h; o9 [/ M1 m! O" ]/ U nLevel = 1;
L1 r7 m8 _- Y1 P$ R }, u8 q! c7 _0 j J+ F
else istrin.clear();2 l a3 z% \2 ^6 @
}
" D9 i( ^, A/ \" h' e else{nERR = -1; break;}4 i1 Q9 X3 L. `, a' C3 d5 |. _
}
" b2 n: V# [1 A# Q0 t! v if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
t5 S9 m f2 j1 f7 z" m else nReturn=GetExpValue(t, csym[0]);5 C: y7 b4 \1 t! {; Q2 m7 b& u; ?& c
return nERR==-1?1:0;
. P' m; M$ l' z6 U+ h}}/ s2 t, l& e4 l! D2 o
- A* Q: l+ e% m7 V Z
5 ^4 J) s' a9 L* A
3 g/ W; \+ k! j R: c" B函数模板使用示例:
; a, U7 T8 s' P# i: r% o0 ]1 z: C在以上那段代码的后面加上以下代码:
& x* @0 H8 C+ j; N: W V \ F6 S: w& `& j4 P
7 |- f4 _0 D3 `# F, {, Y8 t4 I
. h( U$ b6 T1 u; i" K2 V
程序代码:
/ \' |# f% k- A" G) V+ K1 I9 B3 i! {( P1 o) G; r1 V
#include<strstream>
3 ^# d( y3 w* k1 v6 \+ i#include<iostream>0 w& e& g9 ^. F. j
#include<string>1 U0 s7 t+ X+ z% R
using namespace std;
- ?* g Q. j/ g1 x$ q3 Kint main(void)$ `5 Z7 j" m0 J+ B- E
{+ ]. \0 }$ S) n; [0 `7 u Y
string s1;
* X# n) t' @1 N; I7 K/ m _: l while(cin>>s1) T" l9 R. I7 P+ d. M# _
{
. P. c, x7 ]: @( m! g+ ]( b4 Y istrstream isin(s1.data());
2 t; S0 m; G. A. J. l4 J double d;
8 q- i7 f1 g, P' }3 ~ if(fy_Exp::GetExpValue(isin, d))% d0 Z. H* b- @( [+ d" q' f1 }
{6 t$ q3 L5 _$ K
cout<<d<<endl;: B; t# x1 g: K& _ m7 [5 H
}
& v* q$ c3 d4 E c/ q% W/ j else) n9 E0 F, o8 \- Z; I7 b% i* b
{
# m8 o. S6 u. f: c* v3 O I# D cout<<"ERROR"<<endl;6 S9 F: h, R) @$ E& v
}
4 d d/ q N1 V2 o! U& R }8 N c! S' Y# T- `
return 0;, |9 D/ W2 L) G3 o& r% u
}
0 G) v& J, N. U- @5 d7 S& e- a' \
% z: c& H3 ]* K) q3 s
然后编译执行就可以了(*^_^*)
' `0 W* T4 k6 w0 _/ e; t5 Y其它:TC++上一定编译错误,不保证在VC6上也能通过编译/ q0 q- t4 L! X/ b, J/ m- O! N5 ]
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|