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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
3 Y" B5 k2 P" c一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 j/ s; O, g/ U' k( X/ d( M只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
; {4 \+ j( R5 s参数解释:% Q. t5 W" k! y. X( f
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 ]0 `( |, d) Y+ o8 f1 GnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
7 g, Z- Z0 {, Q1 q" E& A返回值:5 S8 S7 b2 W) u5 k; W7 x
返回非0表示计算成功,0表示计算失败有错误5 m5 C% N0 z U& g# {. S
K% S# t; |: @% w0 S* I
. x) z7 X7 q" h6 Z* z
4 _1 S8 ?/ t9 G程序代码:
' w: q- j6 k& u' E: c
. i, i+ K. ?6 Z! \6 J: fnamespace fy_Exp{1 m. s9 s7 X. z4 z2 t, \+ ^
namespace {template <class _T>* ^- W/ e4 p% o H1 w# Q) G
inline _T GetExpValue(_T t[], char& csym){; t& J4 y9 r* y/ S
char c=csym; csym=0;
" }; r# a7 H0 M/ E3 y8 X9 ~5 Z switch(c){$ [3 O5 G0 D5 W4 P+ U
case '+':return t[0] += t[1];/ q2 Q9 a3 i8 D, ^8 `+ |# L. N
case '-':return t[0] -= t[1];
( `& `0 g% |; z1 K. k. z5 e case '*':return t[0] *= t[1];
( [+ u( w# z6 r& O7 Z9 j default: return t[0] /= t[1];//case '/':
S! j" L* F7 q4 Q4 ~/ O }- u$ `9 ~, i* ?2 j1 {5 [1 T+ f% q
}}. i! a* x" g4 _0 \9 h. M1 E1 @
template <class _T, class _Tstream>
$ x6 ?3 q( t4 E" D4 Q, N/* _Tstream: inputstream, _T: get return value8 I+ }# N& }% x- i
* Return nonzero if get value successfully */
) t7 j) j" L' T& g9 h1 c! u- dint GetExpValue(_Tstream& istrin, _T& nReturn){
) r+ E* M1 @3 O2 U: j4 I _T t[3] = {0}; //雨中飞燕之作: U0 Q7 O& {% O* ^2 E
char csym[3] = "++";
* i3 }: _6 A! u0 h, r int nLevel = 1, nERR = 0;; a6 m1 ?. M1 a) r( L
if(!(istrin>>t[1]))istrin.clear();
/ J! q/ _0 K$ m! V4 p for(;;){. p; S5 f% Y$ w6 D; c% @
if(istrin>>csym[2]){
7 ?+ E( o7 q/ Z: G switch(csym[2]){
0 h/ F2 A1 L* v8 \8 @! V case '(':+ D+ T6 z: I$ [4 L5 q$ x( v
if(!csym[1]){nLevel=0x100; nERR=1;}else
, K1 i" Z5 j* Z$ O- p5 Z' h7 l: T, M if(!GetExpValue(istrin, t[2]))nLevel|=0x10;$ o3 K! Z/ _" S
else{nLevel=0x100; nERR=1;}0 _+ O0 ]$ U; _
break;
/ P4 [; R% @# @ case ')':
+ |4 m, r* B$ H- D2 g4 h/ {" M {nLevel = 0x100;}break;
9 s: L& ~9 D+ D! K! T case '+':case '-':case '*':case '/':! u5 K# {+ Z1 Q5 a3 \! ^. `0 z
{csym[nLevel++] = csym[2];}break;1 t9 W- c) P# f3 B% R
case ' ':case '\r':case '\n':case '\t':continue;
+ w, M T- }7 d' } V; m default:( v6 p1 u, N# R; J- S3 F1 l
{nLevel=0x100; nERR=1;}
+ y7 y% w# B% I; r5 p% a& `5 B }1 J2 R" W) y; |' _8 W& X1 l/ p: g
if(nLevel==0x100)break;
6 d/ V. `+ [* k0 G# l) T if(nLevel&0x10 || istrin>>t[2]){
$ z- X/ L- Z! v1 K0 E! j nLevel &= 0xF;) h% ~9 l9 K! n
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}# R# T9 i, L1 K; ^
if(csym[1]=='*'||csym[1]=='/'){' Z$ `0 O2 ~: w9 k L* q! s2 e
GetExpValue(t+1, csym[1]);
' T! J7 c; X$ W/ U8 ` }# f+ J q6 `* _- [1 D0 L L; k' D
else{
, o5 J3 L5 h! F: S GetExpValue(t, csym[0]);
' T+ {# h' W/ v2 j2 R8 B) a t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 ~9 w! N5 L0 ]) q3 c }
# m, i# ?; @0 U, C1 A7 ? nLevel = 1;
, b* Z2 d8 e6 Q4 c }
2 T6 Z5 c6 {/ ~2 D else istrin.clear();% h7 m0 z' `" K6 E" _
}
M Y+ X5 E, Q: H else{nERR = -1; break;}7 v( c( j/ e; d* b) B1 r7 A5 H
}! k4 S& g7 R4 _
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 w5 Y( x4 O+ I: W
else nReturn=GetExpValue(t, csym[0]); k% A9 [5 b+ B1 N4 k
return nERR==-1?1:0;% ?! Y" H h( h5 c
}}
% t2 K( d% H2 y& h4 F7 I7 w$ B5 I& s3 o( Y5 y7 k6 \" V$ H
! }# e+ S: O1 l6 N; c
* F- g1 ~5 Q3 P$ A
函数模板使用示例:
% h$ `; @% |4 ^) u: E- V/ D3 ` x/ x在以上那段代码的后面加上以下代码:& _4 x" G- ~- a- a6 @
& U! I" I! j/ _7 E* Y; ?* @
5 q' y. x: [2 Y" M# o& T( N' H6 ]
% y1 T2 C3 S7 R8 k6 @' \2 i程序代码: 0 o; U; {+ M5 V+ b, M4 f
( t' ?9 q: k$ b' ]#include<strstream>
' m. K6 u; q* W% q% ?#include<iostream>/ a* P6 X( Y6 g+ [: }) ~4 |: P- W- a
#include<string>
, h1 T; R9 H" Pusing namespace std;: a$ W! {# Y9 C% ]) `7 ]& V
int main(void)" x0 Y9 K5 \; ?: {3 t/ i
{1 x9 i# o$ Y+ e8 d1 X7 @) w
string s1;
3 ]4 t4 B% A! e6 o7 r while(cin>>s1)
* I# }! o4 b6 }% T, j" C+ q0 d4 S {
1 p j9 d/ l: a/ ?( R+ [ istrstream isin(s1.data());
/ e' u- T. G- K( Z; N) g0 Y double d;
' J$ |0 I& I. P% |8 } if(fy_Exp::GetExpValue(isin, d))! i: a* z/ O6 B$ ~* c
{
/ H* y8 Y4 @; @ cout<<d<<endl;& T( @9 Y1 X7 W4 H' Z9 M
}& [! R; n6 ~( g$ g; L2 K
else$ v [$ @1 S7 P0 J S/ u0 Y6 R( |
{6 ?6 V0 @; u9 y" z( c
cout<<"ERROR"<<endl;
n% C- f* ^: F }
: o I6 d3 G' F/ V }
1 G9 ~$ t1 [# H5 O return 0;/ g }/ N+ U2 T8 B8 f
}% {6 R! i, |* y r+ ?5 H8 c0 Y
! r0 E7 f7 e% O2 b3 I" [7 Q' A) x ~5 A: |
然后编译执行就可以了(*^_^*)
: L: E4 G8 E" S其它:TC++上一定编译错误,不保证在VC6上也能通过编译
6 A) P7 {* v) ^2 ?# Z/ i 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|