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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
0 a: s+ q7 \2 _% r8 _一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
3 P; A' C# z5 J# y7 O1 `只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( k d* O( Q$ p h: n
参数解释:
& M+ z* ?, G. }# O2 ]istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
* \9 K+ c- N \, {" F) a" jnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 ^1 J" ]# N, ?/ o
返回值:: V1 d4 c$ c0 n9 |
返回非0表示计算成功,0表示计算失败有错误4 a4 }! w* P4 O. _( ~
$ I0 T0 m8 x2 e! Z- |
/ _) i, a, E1 M- D
6 \* U# a# P* p" ^) V0 O程序代码:
0 ~0 e4 ?0 v& C/ c6 F! M: M* q- x( p1 R8 \
namespace fy_Exp{) R% _. C, A! Y/ b
namespace {template <class _T>7 o8 e) y) `" E0 k4 f! \5 J
inline _T GetExpValue(_T t[], char& csym){# c/ p) h3 E, T! b( Y4 A
char c=csym; csym=0;. l. E: h, D; P4 u" h$ x# @
switch(c){+ {& B& c- p: A& O1 C
case '+':return t[0] += t[1];4 t; T( b$ b/ m/ n- J& A2 y5 b' M: i
case '-':return t[0] -= t[1];' ]2 o4 v- k5 k- O$ [1 v. b; E
case '*':return t[0] *= t[1];, g/ F+ X* m! P% Q+ U
default: return t[0] /= t[1];//case '/':2 Q! i! l" d4 g" i% f. S
}( j& p0 w0 P0 v) p
}}/ y% ^ X l2 l2 t- M' B3 E
template <class _T, class _Tstream># [: B& I' Y: l, [4 U- v
/* _Tstream: inputstream, _T: get return value
/ f. V+ V/ t; h4 o* Q1 E5 p* Return nonzero if get value successfully */6 }' Y# W, D: i" m* t: j% m2 K. N
int GetExpValue(_Tstream& istrin, _T& nReturn){& F6 ]. X$ _$ R$ A
_T t[3] = {0}; //雨中飞燕之作9 P- x) Q3 q9 ]2 ^) R# V
char csym[3] = "++";
4 D3 Y1 R+ C1 ^: [- D int nLevel = 1, nERR = 0;
I! M" k7 f: P& q% C if(!(istrin>>t[1]))istrin.clear();
7 u$ p) g# k% f8 h' I( K/ I8 G for(;;){. [2 j o0 ^* H3 W5 q1 h3 M( K
if(istrin>>csym[2]){" Q9 T' x) v* Z' C5 R/ B+ y
switch(csym[2]){
j ]# ?# c5 H case '(':' X/ v) _; M8 X5 T% g% e; g: y
if(!csym[1]){nLevel=0x100; nERR=1;}else
, S1 Z7 V9 A) n) ^- N1 C" I+ v+ _ if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# S4 f3 {+ p3 t1 q
else{nLevel=0x100; nERR=1;}$ [1 `" `2 S7 b7 U
break;7 U- }. t, `! R- m9 N9 E
case ')':# T( f% ~4 E6 Z: t. ?9 d
{nLevel = 0x100;}break;
4 H% J6 ?2 _0 r8 F. S. P; a case '+':case '-':case '*':case '/':7 g! m. }- h* l- s
{csym[nLevel++] = csym[2];}break;: X" h4 I4 k. Z7 l) [ Y0 _
case ' ':case '\r':case '\n':case '\t':continue;
3 W4 L9 V0 y* ~+ m default:
: k0 |8 G% d0 S1 r {nLevel=0x100; nERR=1;}! w- u9 v" X/ }& j
}
. ]& ^) }8 s3 x1 w) ~- A$ G" Y if(nLevel==0x100)break;2 {, g5 r* ]. ~: f, q9 X. u1 ?6 N1 U
if(nLevel&0x10 || istrin>>t[2]){
# M9 o. K! i- u7 w+ m nLevel &= 0xF;) I- A u/ y+ p
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
1 N0 R1 C0 G6 v% j/ M- K6 {; j if(csym[1]=='*'||csym[1]=='/'){; t, s N& `) O4 c2 u! P
GetExpValue(t+1, csym[1]);4 R9 @3 Q( w+ `
}) M p0 t; M0 m* I" i- x( m0 H
else{
& I" z$ R, q( |- p' m) N" u GetExpValue(t, csym[0]);
k+ f7 C3 c5 a% B" [! f; q" p4 g t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 F4 g* j e) ^$ @ q& Z }' N0 t8 @' z5 g) |1 `% J2 H6 p
nLevel = 1;. d& y4 m. U! x# J; P
}
1 o9 G" b) ^8 M1 r" x else istrin.clear();
: }+ y8 `0 [9 r9 ~4 z' p/ t6 d( u }
/ {0 w! d: c, a+ y. U: y L; m else{nERR = -1; break;}7 M: |* R8 n# y M9 c' K
}/ u7 G: ^2 r! ]* j3 p
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
+ C3 D' u+ P0 x) L- D) C; Q" L else nReturn=GetExpValue(t, csym[0]);5 c0 f) ~3 z& w; l
return nERR==-1?1:0;
! [5 L) X2 o$ t: B; F8 m$ s2 M. `}}; R6 S% G' I! Y# l
6 u: v' U# U: }: w- e* G' s; b
/ S5 |. q) K! O! P" b$ [5 G
9 y4 j g5 J$ I" H h, I
函数模板使用示例:+ p! B( ^& p/ i; D4 u+ ~4 _
在以上那段代码的后面加上以下代码:/ Y. F( n3 u: n- s) n
" W; V1 H+ q! R$ p
9 h+ F, q/ b* _( z" P
, [& O5 }7 z* ?9 U; }, ^2 @程序代码: ; f% m2 H) O8 @# ]; h
" @) S+ R, M' x' `. h#include<strstream>
+ z( P) y& f" u8 \, ~' T#include<iostream>
2 e. x, M2 ^1 @, B) }: F; I#include<string>
/ N$ }2 t1 f/ Vusing namespace std;
: m) l1 S1 R0 A- qint main(void)4 w6 K; @- k; M
{# h% F8 g2 Q1 p G
string s1;
4 Z2 X! \, v# `3 B0 Q while(cin>>s1)" i2 K3 E y! j4 B0 k- d0 P( W J
{
3 ?2 r7 J5 J* G c: ~( v) y istrstream isin(s1.data());( w( S8 l: Q; J7 E$ k8 q* `, s
double d;
) m( T3 a6 m- g% G" K) { if(fy_Exp::GetExpValue(isin, d))* C: d. Q# e2 y, Q8 H! [/ R- _, B
{* L" }+ ~9 D& @6 X6 x6 F: i
cout<<d<<endl;
/ E. m, g7 b- i- s }
$ a. V. ^$ `8 U# I else
$ H) Y/ E! c S8 x1 t8 T5 _' S {
D+ q1 R8 w# l# x5 u! D cout<<"ERROR"<<endl;& ^; Q# a* O; d# ~. ^- I5 H- ?) t
}3 j) l; u6 `' F) t0 w/ F& ?1 h
}
& P5 b; Z- G5 J2 h7 K/ K return 0;0 r8 K2 \. f1 {, I2 |1 @' `- _1 {
}, f: ` m# Z/ u6 i
; `, U6 d! n7 D% ]( C# e5 |9 V/ {& u+ f0 @: _
然后编译执行就可以了(*^_^*)
" w O, {5 w U" j7 I0 F* x) Z9 T其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 T: n ]$ a- H6 F$ S n 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|