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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,: W S* _5 g5 g) R" \
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 W9 w& y9 g# t; o只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. O' b$ a: z, {1 K8 i) n参数解释:3 B5 W2 o" N, r9 [# k ?
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流: A6 }, b. G% Q; m0 X" n
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 Y$ @) J0 Z9 l+ B* j
返回值:& E: `) Q1 W; r$ B0 Y
返回非0表示计算成功,0表示计算失败有错误
" ]4 @1 _' j& y) H8 \; r8 N/ V) G. \! J- d# u/ Y4 F
. x" O/ l! }3 Y% n& z4 E
9 g: m4 X- Y. p# f) C& j7 P+ _
程序代码:
* Y: ]0 U3 i$ ~7 Y. M1 y* N* O A! m" d
namespace fy_Exp{
* Q: l- F* E$ Z) rnamespace {template <class _T>
+ T6 |4 \, c0 C) L1 Minline _T GetExpValue(_T t[], char& csym){3 k- N! R, T$ j; P8 u# w
char c=csym; csym=0;+ s* v6 B$ M( p; J* K; G
switch(c){
' O+ Z3 j9 |. i8 L$ A case '+':return t[0] += t[1];
& \0 _! \* `( D5 x case '-':return t[0] -= t[1];
8 A* j5 ]9 K" Q; c case '*':return t[0] *= t[1];
! f1 G8 h, ^( L0 A& ~0 p default: return t[0] /= t[1];//case '/':, U% g# y3 h4 k
}
% z! p* l' O+ m7 T) J}}2 I5 Y4 y' y& f. p* t
template <class _T, class _Tstream>
2 I1 C8 }2 y4 k* R; N3 r o/* _Tstream: inputstream, _T: get return value9 i; [/ y) v% c$ A8 n/ z6 A) t
* Return nonzero if get value successfully */. E: F4 N! B! A( J+ a
int GetExpValue(_Tstream& istrin, _T& nReturn){6 K0 X6 L6 {- I5 l5 M$ a
_T t[3] = {0}; //雨中飞燕之作
' N5 c b1 _2 S" e' N, g8 @ char csym[3] = "++";
5 U0 L/ Y; h5 \0 e int nLevel = 1, nERR = 0;! S& ]2 ?- O( Z# s0 q7 \$ x
if(!(istrin>>t[1]))istrin.clear();' o3 Z) [8 v' w% w) ?
for(;;){8 ~- k- }9 X* i- L/ }: s
if(istrin>>csym[2]){. ]: _" h. x! |0 F, H
switch(csym[2]){2 @& q4 s) {. v
case '(':: o" O( R$ O! \# g2 H
if(!csym[1]){nLevel=0x100; nERR=1;}else8 t. W* q, J$ ?$ [" @
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
4 f' T, k7 K+ a* v- ^$ ]$ c else{nLevel=0x100; nERR=1;}
- t _, b7 e' L. M# w2 W9 r" X break;& W+ _' [/ @( ]6 H+ [
case ')':9 c' C3 b/ h/ S4 u
{nLevel = 0x100;}break;6 N8 d- R/ G" C c3 A8 @* u c
case '+':case '-':case '*':case '/':
t8 M" Y& X! n w {csym[nLevel++] = csym[2];}break;+ ~" P/ W+ z4 ^+ J& A2 L9 b
case ' ':case '\r':case '\n':case '\t':continue;3 s) I" n" u" j5 B
default:
0 x. m# a( L6 _6 h- Q+ k$ t6 p {nLevel=0x100; nERR=1;}
" l8 p% L w3 i. H: g3 R }
. F [: I: U4 C0 H5 a% c if(nLevel==0x100)break;- Q) T4 g5 z: B) v% p* e6 ?7 w- g
if(nLevel&0x10 || istrin>>t[2]){# O$ k' p2 F( ^; R
nLevel &= 0xF;. A3 q: M& _/ E7 r3 U1 V
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 i: c D# A4 l) r/ A% O if(csym[1]=='*'||csym[1]=='/'){- }6 }6 q# c# \' V8 r3 }
GetExpValue(t+1, csym[1]);
% m/ W% n4 n, \- l/ h9 O! x }' V" C+ Y5 z ^( X
else{. i4 U/ B5 x! q% S. Q& F3 E, S9 R, ~
GetExpValue(t, csym[0]);. w7 T0 m* x3 ~3 ~% l9 K. D
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 }" L% ~, X8 f+ k/ k9 A/ } }
- T: f% F$ u3 ?) R) r$ T nLevel = 1;
- X! `+ P+ K8 _- U) `) q }9 i6 @# b% {$ `: D; v; a# e9 V
else istrin.clear();" s" Z/ U5 n. X6 x
}
6 I6 T: x! `6 S h else{nERR = -1; break;}9 _5 m6 H) @: @$ p( [; a
}: Y( j4 H2 S' B$ m# L" I$ E
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( Q0 x) o/ e8 H% M: V else nReturn=GetExpValue(t, csym[0]);$ }3 G: H! e+ p* U
return nERR==-1?1:0;9 }' y. y1 \$ f9 f) i
}}
% G" ?) B$ W& R+ `3 ?! h0 I% ?2 v" H2 ^8 I" o
( J1 e$ W( q( V1 R3 x/ b
Z8 n( |3 B+ L% }1 }函数模板使用示例:2 a- i2 J. c& u# n0 e% \
在以上那段代码的后面加上以下代码:
1 Z8 h) Y% L t
- w! k( \, t9 v P 1 {. L5 b/ G `( {' r) w8 z* a
7 P: J" p2 ]& Q# R4 m/ \0 n2 n程序代码: k7 I, Z0 u- V9 s; u# g) ~. L
' O2 E/ Y7 K. O+ s. P' M#include<strstream>% B2 D) ]; W5 T* M. B
#include<iostream>9 b+ V. p7 |+ n7 s" n) o6 m
#include<string>
) t* |! P6 e: W8 Z/ i1 ousing namespace std;
, [) }9 X% `) E4 l+ wint main(void)
' E6 l* j0 v% b5 c1 q{' D w4 x8 [) Q" o2 u! \, w
string s1;4 h4 S" i/ I% {8 F z w
while(cin>>s1)
6 c! b: Q: P. j$ a' b0 y {
! x" }9 h# P( T# W7 g istrstream isin(s1.data());
0 s0 T1 |# O; A9 i5 D double d;
$ p" O' U% w( P( j if(fy_Exp::GetExpValue(isin, d))
) ?: Z$ g6 z f8 |6 z# R {
( ~9 c6 [" l2 g( G6 p# s cout<<d<<endl;
8 V9 O1 v' f" c! x- y4 z+ @ }) E: j1 w' ]/ j5 C
else
* s1 S" y. f8 ?6 ?% Z {
5 F. I. F' M# q" D cout<<"ERROR"<<endl;
8 b" ], w% [0 [6 ~1 G0 b" D }. i3 i, m* Z7 z2 z/ F
}
8 [0 p0 J* H% x8 M i+ J return 0;
8 d7 @+ C( G$ M! z4 R# Z4 H}5 t" x( i6 E0 e& V7 q
' {- |5 d3 ]( x* o. j
8 x" S+ @7 F, I4 W. [然后编译执行就可以了(*^_^*)
0 n- O. _" H, W: O0 r其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 H0 `4 M/ I: f0 x; C 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|