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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,/ B: g; c# _$ Z' X4 J, H1 m
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- b! m' e( ]# O k
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 f: }* K9 p+ V' c+ h
参数解释:" o; @' Y7 S4 N0 Z" k
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" R b# l, d/ r
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
& F. K9 Z2 R4 n返回值:9 Z' W( t& H& K- D# V
返回非0表示计算成功,0表示计算失败有错误& V- x$ S" V5 H
- h4 L6 D" e5 N
3 h3 x8 W7 ]% U* V s
3 k% v( B+ y/ R( R程序代码: 9 I- @3 L6 P0 Z8 R# `+ O$ H
2 g/ Z+ G0 [: K" s5 `* ~
namespace fy_Exp{8 m! r) @8 _& {8 K3 L
namespace {template <class _T>. m! T2 ~( t, Y
inline _T GetExpValue(_T t[], char& csym){; `& F" z5 {1 h) a3 q, J4 a: t
char c=csym; csym=0;1 w! {5 i' I5 {
switch(c){* M( ^$ n' Q9 p) S( j' p
case '+':return t[0] += t[1];
5 P9 B1 U6 {' ], A! c case '-':return t[0] -= t[1];
: H5 x1 k' ?# V" g0 ]+ P case '*':return t[0] *= t[1];( x" f& R1 b2 d% {: j3 z! [
default: return t[0] /= t[1];//case '/':
# Z; |5 R5 W7 O5 m2 E7 r, S; \ }% ^% q, C1 x' S/ }/ s
}}$ B0 h9 V1 ~4 w. F: f E
template <class _T, class _Tstream>, a$ V& p* ?! O+ ]; \
/* _Tstream: inputstream, _T: get return value* o7 a) j) J9 U. [
* Return nonzero if get value successfully */
, Q( W1 g" \9 a# ?0 Z$ \int GetExpValue(_Tstream& istrin, _T& nReturn){
6 }$ j" ]1 g* M _T t[3] = {0}; //雨中飞燕之作
. ~% E7 F% c, l char csym[3] = "++";) q- B' g5 Z# e" S. ?# @
int nLevel = 1, nERR = 0;/ G. m& o( m* v2 o: w1 e, W) I5 K" h
if(!(istrin>>t[1]))istrin.clear();5 |' B' A8 q0 @. ^) t
for(;;){
, F$ F( a$ l X( Q6 b( n if(istrin>>csym[2]){) ^4 i# H+ f0 u& c4 P
switch(csym[2]){
/ c8 l0 k0 A1 x, _2 t case '(':! F A* ~ P6 w" `' o. x. X
if(!csym[1]){nLevel=0x100; nERR=1;}else
' V0 w0 d* f* h; x8 Y( v if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
! e8 m$ Q A& N$ S8 `2 h7 a else{nLevel=0x100; nERR=1;}
: l+ ?# L- |: o, H8 S9 ?+ C% c break;
5 _. n" e( S* X# o3 j8 z$ ] case ')':( l& C! T+ k' P' e
{nLevel = 0x100;}break;, {$ `# l" p! L8 l
case '+':case '-':case '*':case '/':
0 r2 ~- X/ \! v: e9 E2 d y5 K {csym[nLevel++] = csym[2];}break;& w) F+ C' t- h% W, I* U& s; T# U
case ' ':case '\r':case '\n':case '\t':continue;8 f+ ]# b: S- q" p* Q% [# h4 c8 m0 \1 T
default:- |2 T8 K7 T w% E' k
{nLevel=0x100; nERR=1;}
$ t d& U2 t- ]# i* U }* {4 u* R$ p& @. ~3 N
if(nLevel==0x100)break;
% j# {6 C+ T0 E" f+ R t if(nLevel&0x10 || istrin>>t[2]){
8 r6 w. X1 G( F F: j nLevel &= 0xF;7 ?: R* y7 V$ f; ~7 e# X
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
7 ?5 m$ u; S4 l if(csym[1]=='*'||csym[1]=='/'){6 u! `5 f3 ?# p3 r: ^0 x2 B9 ~
GetExpValue(t+1, csym[1]);9 @ q }1 K6 f# c3 W
}* u* r2 A6 E% p, n+ p# F
else{; o8 N, z; x8 l" L
GetExpValue(t, csym[0]);
8 k( A. ~" W( E: I0 r t[1]=t[2];csym[0]=csym[1];csym[1]=0;! N O, p4 B/ T( J
}8 _7 F3 c6 V1 S' u
nLevel = 1;, M3 c& [, u$ t
}
8 G4 N5 j7 J0 R$ p+ u: J else istrin.clear();
! z# o$ _7 y6 U& n8 ^) w& N }) W3 ~% m% F4 M
else{nERR = -1; break;}% @" R0 K7 y& |2 ~0 S$ T$ p
}
P5 }& |7 i T8 x if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 H( x1 y3 Q. @- g: e9 D: d- ?# { else nReturn=GetExpValue(t, csym[0]);5 ` q- s( ~. ]# s
return nERR==-1?1:0;* I' j/ T! z9 R& K1 p
}}
8 t0 U6 D3 F& B$ L* X
' G2 V( [5 \: @0 @! T# b) t- W! D+ v1 ~8 K4 g S
3 g7 y! F( H- E& r% o1 {+ N
函数模板使用示例:
7 s, }( F( ?% u( W8 v' B( A9 u3 L在以上那段代码的后面加上以下代码:
1 u* F* ~' r- R$ {/ `: V- N) }2 o8 @( S% f8 y
. f( ^. e3 }9 d( A9 n
- ^: n$ J) w6 |/ a9 x# X程序代码:
. ~" P& J/ N6 r% k1 e3 u' g& d5 W! U, l s4 [4 R
#include<strstream>& e2 }; o* F" ]; a
#include<iostream>
X# \6 r* D* q#include<string>9 G' s; W/ \7 A
using namespace std;
6 {) D- H' G$ l0 r. }/ Gint main(void)1 T& {' ?) x+ l1 e3 r
{6 }9 v+ {3 c) X( q3 D/ z Y% @
string s1;
0 b. q* `# K* ] while(cin>>s1)
7 V; v8 S/ g' Z {: |7 T0 t: P7 ~* n) Q
istrstream isin(s1.data());
! r+ K- @& x u/ d# v3 w double d;/ R1 W: e; A. F3 X3 l0 t
if(fy_Exp::GetExpValue(isin, d)). ]2 l/ \6 v, M7 l: l+ U2 O0 C
{" A4 S$ _7 ]+ g2 a+ o! p
cout<<d<<endl;
3 c4 N: U& _ s$ d w }7 a0 y3 P/ o/ N3 I
else5 ?3 K! e5 s- }/ ?+ A: b/ t
{& I3 M b! l2 m' `8 Y
cout<<"ERROR"<<endl;1 s3 X1 w8 {2 ^2 x$ U
}
0 v' L* c( Z6 C* ` }+ \4 Q/ ?+ w: K/ i4 i2 R" g% H8 M- X$ @2 L
return 0;
7 S3 q! p! B+ z" s' I: T' J4 g}0 P8 E1 J* Z& C {: t& @
! |" L: l. _' P
0 h: e, ]" K: J- r, J然后编译执行就可以了(*^_^*)
I. d C* ^4 O. W) Y. o其它:TC++上一定编译错误,不保证在VC6上也能通过编译
4 Y x/ ` p+ A; u% B 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|