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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
' M0 N- ?$ O. |' B& R* [( V一个很方便的函数模板,可以并且只可以计算含括号的四则表达式5 h4 X [* h% C$ H$ D. f+ p* e
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 N- L4 ?& `/ `' \
参数解释:
6 p1 |* b5 b- m2 Mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& y4 ], w N% t' r0 GnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: a$ n6 E, D4 M, K. ]5 Q8 a返回值:$ S0 G% d& i, s: R
返回非0表示计算成功,0表示计算失败有错误
. }: T1 i$ D1 h0 z$ l4 y# ^
. [9 e( O+ X5 W4 z. C : {% E- C* D3 n7 F( b: k7 d( H
, `6 e9 I- b2 M+ A* n程序代码:
% ~, s; S T$ u& d4 ^' A0 j) A
: x; `8 R' W# G) S. p" Z- Fnamespace fy_Exp{% R9 K9 p/ }# P+ Z
namespace {template <class _T>: n5 M- ~ @! S9 i! i2 M* E3 t7 y ~% {
inline _T GetExpValue(_T t[], char& csym){: D5 q" ?, f; D: r$ c5 r1 N) W) R
char c=csym; csym=0;
& X, c7 [2 v, p# { switch(c){' ^3 \5 E2 I; f4 j+ Y
case '+':return t[0] += t[1];6 G; B# q1 V" |( s
case '-':return t[0] -= t[1];* @; j& t, Z5 _
case '*':return t[0] *= t[1];
$ l8 z0 ?3 Q. I$ r, J" D4 _ default: return t[0] /= t[1];//case '/':6 O* [' K, x2 S. e) D9 d; E( ?! \
}4 I7 C+ [ {* Y0 N$ Q$ h
}}
/ `5 b) E& C' gtemplate <class _T, class _Tstream>
9 `- ] j* ^. z' B/* _Tstream: inputstream, _T: get return value
* O3 _+ Z1 |; t/ L# d3 r5 n* Return nonzero if get value successfully *// m0 e) w3 j( i4 e4 U( A
int GetExpValue(_Tstream& istrin, _T& nReturn){
! J( L1 R3 b8 P, n) j$ o; S _T t[3] = {0}; //雨中飞燕之作
4 a& L$ m1 D4 G; S9 W5 U) ^ char csym[3] = "++";3 {0 R/ V/ `3 M* p7 E8 T4 X( }
int nLevel = 1, nERR = 0;' T# g3 u3 Z* \/ b, y; w2 ^
if(!(istrin>>t[1]))istrin.clear();2 ?9 r8 h) R o( I5 T. l+ f
for(;;){
: M1 l2 S& }7 ~8 f- U if(istrin>>csym[2]){4 A: S& x' d0 E: ^$ Y8 i* A5 I2 R
switch(csym[2]){0 a9 j/ n3 p; k5 J
case '(':) q1 l9 h+ L/ V- }9 w
if(!csym[1]){nLevel=0x100; nERR=1;}else6 q9 [* c2 c3 D2 \; k6 ?
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ f0 W6 m* ~) _ else{nLevel=0x100; nERR=1;}
" {, d3 S( z- z4 }' a7 l break;3 U& Y- [$ r( W, L
case ')':
# z' Y+ Y$ p8 b/ H% x2 b {nLevel = 0x100;}break;
" q1 {: C9 h% ^ case '+':case '-':case '*':case '/':
+ O" }5 }" w: h- s4 A& V {csym[nLevel++] = csym[2];}break;
7 { z$ h+ w; K O" n case ' ':case '\r':case '\n':case '\t':continue;8 u7 R# F( R; v8 `
default:9 U) r& M x" W* ~' `
{nLevel=0x100; nERR=1;}
7 y" W' t- D7 Y% D }( h& b2 H8 V0 a8 E$ _) u5 J
if(nLevel==0x100)break;* q# n3 s; W& u
if(nLevel&0x10 || istrin>>t[2]){
0 k+ G; X; q8 z! Z1 t4 ? nLevel &= 0xF;: L8 X. V# [ R+ v7 |
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
% @( x6 g& I! w if(csym[1]=='*'||csym[1]=='/'){) U9 c8 \" b8 B5 i1 e( a6 r' J
GetExpValue(t+1, csym[1]);; R7 N& J. ~* r, {
}
- {& H2 R- v+ i; @( u else{
' y" g" S& v+ M O, L# K GetExpValue(t, csym[0]);
) ]! K* |( h5 z% t7 k b t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* ?% k. ]: R- |6 [* s8 j }2 x+ Y$ X l' {. G
nLevel = 1;
0 K/ f* s* l9 D' a$ q }
# _0 z5 H2 l; y" m: |! o/ h else istrin.clear();
, ^- n, |( G$ P; f }4 z D& O% {! ?
else{nERR = -1; break;}# {. h$ G7 x( x% A! O5 Q% r- q
}
2 R% s/ W1 ~+ X% Y" ~" w$ N if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 A. K# O& H9 ~& P& W. h4 [8 v4 d
else nReturn=GetExpValue(t, csym[0]);) W# ^& q# g7 C( j$ {
return nERR==-1?1:0;& _6 Z0 m* o% W' F8 K5 ?
}}( m# C# o& _) p9 B0 i7 J
$ J! _) k6 |7 [
8 Q& \: l- c( n# S
( n/ Y1 X. e! M) Q% i函数模板使用示例:) b* i8 v: d1 K, a+ @
在以上那段代码的后面加上以下代码:
2 E- [; @7 L4 ^# ?1 g; `1 t' m3 i T0 k* a
@' x. N `8 N6 u
& | D, r4 h- A! W
程序代码:
1 v0 Q2 C' y& w+ W; f; Z- t7 W7 q5 S. `- J9 m" @
#include<strstream>+ Y3 Q5 i$ h, J% t
#include<iostream>' r# `0 x! a* K, e
#include<string>
+ @$ S* F1 v: vusing namespace std;/ j8 H, a: l* ~- K* L4 B
int main(void)8 t3 x, p5 ?- d& I: r( x
{
; a. e6 o* ]. j( E6 f! h$ N string s1;
$ {9 F$ v% o' D0 k while(cin>>s1); V. a4 i* B$ E) @7 r# P" s1 `
{9 w( X4 ^( B% `+ s, {8 d9 u) l. y
istrstream isin(s1.data());
/ I2 R( {5 s; A double d;
5 W9 P! P% c0 h! D) [# A C if(fy_Exp::GetExpValue(isin, d))
, v8 p5 n$ a* t$ P {5 K: u3 D( Y/ k* q
cout<<d<<endl;1 C; L. @3 \) x# o
}
5 h4 }# C0 T% g; N else7 l& I( {9 C3 f: ^$ f
{+ l! {9 m" R5 ^% e
cout<<"ERROR"<<endl;& Z7 y9 _2 `* h. P
}8 @6 `3 i2 e7 ^, P+ g
}
. [3 z7 B( H+ W" \% p return 0;
( T N! r2 B1 Q2 T}
) A$ F0 l5 I; Q: J4 u7 Q
5 @! q7 R/ z( O$ g( k6 c) ]- w2 R- `1 ~' m6 S
然后编译执行就可以了(*^_^*)* g& v. B1 N: X3 U- E0 N
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! P) Y9 F: C$ X7 ?; H1 g4 |& } 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|