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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
; f0 i# y& x; G; |( N% K一个很方便的函数模板,可以并且只可以计算含括号的四则表达式# \% \% I4 G" f* e' G+ k' K# B$ \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ Z6 r: {/ N7 V, {9 L6 O
参数解释:* ^4 B# N1 [: N( i6 [4 f
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# z. j ?: M- s9 q* J$ R9 P g( vnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定6 N/ _4 |* X4 p5 q( {
返回值:
j: Y: m, ]# T/ L* X0 e返回非0表示计算成功,0表示计算失败有错误8 t5 W' S3 n) B5 L2 s9 y% X- u
* X" _2 f8 p2 ~3 a6 C% U
6 q4 r8 j/ Y$ q
, S9 P0 ?$ G7 v1 x* B2 C" e1 y程序代码:
4 T: `5 A) i, w- C9 g& H
' i" W+ y; k8 |) \* Knamespace fy_Exp{
% @/ f1 F7 h# k8 wnamespace {template <class _T>
* n0 V* Q: N+ y; d2 E4 V" winline _T GetExpValue(_T t[], char& csym){
4 \! Z) _4 e9 f2 R0 x2 w char c=csym; csym=0;
9 g; U7 t1 R7 A K; h switch(c){
8 S9 {" _* p! ^. E S case '+':return t[0] += t[1];8 H1 a1 c* x1 b# k
case '-':return t[0] -= t[1];/ \: o$ b" b' j! m2 Y" T8 E
case '*':return t[0] *= t[1];
, u8 ^+ p& v3 Z8 k5 T/ l: a/ s1 {4 y default: return t[0] /= t[1];//case '/':8 p) p# k$ _& h& A O
}" Y2 x( Z+ E* |( ?+ S g! M
}}# s6 H& X' ~% q3 \
template <class _T, class _Tstream>0 D, C) U! U p" q$ u2 T6 u0 p
/* _Tstream: inputstream, _T: get return value& l% N3 @9 a; T+ ]8 ~( P% c% _
* Return nonzero if get value successfully */
}% q4 `( J7 F/ L4 k' H5 |int GetExpValue(_Tstream& istrin, _T& nReturn){
- p/ @5 c% Y" o _T t[3] = {0}; //雨中飞燕之作3 P3 x: b. ^6 C" M2 Y2 b; c/ ~
char csym[3] = "++";
2 g5 n# i5 A2 g. r& r9 ~ Q int nLevel = 1, nERR = 0;
7 ?1 i, j( J$ N! @: W, S if(!(istrin>>t[1]))istrin.clear();
5 C1 t9 l$ ^8 m# o! c) S! ~ for(;;){9 C) r9 Z0 H" V
if(istrin>>csym[2]){! i; a9 v/ K- i
switch(csym[2]){
7 c' z7 w( U7 K case '(':
8 p$ c7 c' h" M% i7 x if(!csym[1]){nLevel=0x100; nERR=1;}else
+ C( d& d. e# Y' J: n7 a if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 N p+ X% `7 b, Z8 b else{nLevel=0x100; nERR=1;}: S! M! n0 I3 b g ^6 x6 w
break;
* t' _8 l9 _& S5 h+ ~* B. l case ')':
" d F; ^+ C3 S2 k$ X9 K {nLevel = 0x100;}break;
2 c+ \. j3 J5 k9 B# l4 u7 f5 x case '+':case '-':case '*':case '/':+ ?* n. x0 q4 Z- R/ K
{csym[nLevel++] = csym[2];}break;
; q, c t$ `* y( V. U5 }. h6 ~) R4 ? case ' ':case '\r':case '\n':case '\t':continue;* }+ J: S4 l9 d: {1 j& s
default:2 J9 N5 Z- H' \$ I1 n% ^
{nLevel=0x100; nERR=1;}
/ N& ?# E; E& F, V- ]5 ?) ~, d0 C }
& Z K' h$ n. @( t! m9 H, H( ? if(nLevel==0x100)break;) b, b( c8 X" R* ?$ T0 W0 U% b
if(nLevel&0x10 || istrin>>t[2]){0 |& \3 i, @' X2 ^' }& |
nLevel &= 0xF; @* }5 M* d7 S% S) f1 c
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, o% @* d( u, m if(csym[1]=='*'||csym[1]=='/'){( ^' x4 v- A5 k& ]8 J; o
GetExpValue(t+1, csym[1]);
& J ]' o* E6 n8 \% k5 i, j }4 u" P! Y2 }/ E# Q7 E" C: E
else{
" ], U/ ]# K; e& E9 U5 U( z5 U GetExpValue(t, csym[0]);
5 C, b \% J0 C" d; y t[1]=t[2];csym[0]=csym[1];csym[1]=0;
) e- k9 l) ~" r8 e7 c3 a+ q# N. O }
9 z" B: c& F& b nLevel = 1;
j" R1 {+ S: c: | }0 L9 k3 [: I: c9 ~8 ~, C/ U s2 v$ H
else istrin.clear();; \$ I5 p0 o: j- x" T9 s
}
& I' @: D/ g0 ]: K6 O else{nERR = -1; break;}3 M4 \8 w* g7 M2 f# s
}
; s# q) S0 L! Q9 o9 y" L if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; k4 T( S) l# Q* C& Y else nReturn=GetExpValue(t, csym[0]);( c; Q$ L e: r$ S
return nERR==-1?1:0;
8 L6 K6 N; _4 ]# W9 ? O' `9 t# l}}
3 r" d& [$ c1 f# ?; |
a4 D2 Q+ n! l9 ?* y& P/ ^# y; T, z% p' ]( |
+ L3 S5 ^8 A& o$ ] o函数模板使用示例:
+ Y2 C3 C9 c8 o- I, h" s/ z/ N在以上那段代码的后面加上以下代码:
$ J9 ] d3 P$ x3 a, L; j4 I) e D3 v& O2 d( z
* v( O7 T& Y& w" m0 h) V! `
; }' J3 }0 N( j! |8 M% P" W程序代码:
! Q- X( Q r7 A3 x: {6 u
. |/ O; J: D' M {% F#include<strstream>
, D* K6 J( t: {) d, v9 e( G( }4 \#include<iostream>4 J3 [" f1 i: {6 G T& \ J
#include<string>
9 a& Q7 X' E' m5 a3 @using namespace std;% H7 o( Q6 h/ ]
int main(void)
) X6 s' r, \, O) `1 B7 ]+ W{
( }; h: j! e- u k string s1;
' Q5 o& `+ r) G9 O while(cin>>s1)2 L k- f2 M$ Z6 }
{9 R' k }# g* Q! @4 q
istrstream isin(s1.data());/ s9 _# d1 Z1 s" X# \+ Q s" E, [6 d
double d;
4 ?! `! a& S( @# R if(fy_Exp::GetExpValue(isin, d))+ f, _3 s9 U1 Q4 |- r
{9 s" u! p& H1 R6 d9 z$ `
cout<<d<<endl;
3 \0 V: y2 p7 V9 _- L0 @) Y% d }
! k# t7 z) w8 e) a else
* o x6 R; N& O, @! b {
0 I1 z+ b) i1 R, a$ A cout<<"ERROR"<<endl;% k: J9 e( u2 o' _6 K+ j
}0 G" P5 s# N% ^
}
( i: g) x1 w4 v `: z4 X" l7 q return 0; s$ d0 W" v$ r4 w
}2 U+ _" H5 v6 ^0 |1 w9 w, M
$ M, F8 ?; j: K; s
7 ^$ L4 f4 |6 N9 e4 Z: {然后编译执行就可以了(*^_^*)* p1 ?/ q" u' D: n
其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 V; M" |- ]& \0 |; z. V
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|