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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,; V/ g w/ P8 y' y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式% v' W$ `& r8 h1 @& F( K
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' i. y' c7 [2 d- W参数解释:- z+ D ~3 F/ l/ `7 \
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 G: ~2 V. ~! B# T
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 @7 N* T7 S, H$ J返回值:
8 D: u3 r; ` ?+ o+ U7 ?4 M4 i返回非0表示计算成功,0表示计算失败有错误
/ X. B! ?6 U5 q& w2 I2 s
3 X6 A7 `( P8 I) m' [ 0 V# _/ ]/ |- D% X" P
6 g! `% b% a% r/ n
程序代码:
3 J1 b$ u, R, F3 }: z8 B, s2 m
! P8 H% B" T" f' ^2 V! _( Pnamespace fy_Exp{
- _& [8 w7 V& b/ k) D& j; ?. \9 unamespace {template <class _T>
8 e5 I; p& Q6 _# V8 Tinline _T GetExpValue(_T t[], char& csym){+ W3 b! u6 M4 w# O; A9 h) y
char c=csym; csym=0;
( B; K9 ^( w, T4 m& L switch(c){2 o& E9 d2 g5 n) s! b/ _
case '+':return t[0] += t[1];
$ D/ P1 t" d; F. _9 _, } case '-':return t[0] -= t[1]; P% e4 M0 k! B% B$ T; ~3 |8 q
case '*':return t[0] *= t[1];
+ q# h! A4 c0 a3 v% V' w6 X default: return t[0] /= t[1];//case '/':
! [8 y! F$ j- ^ _. r) v* T }% e, b0 W/ s( _2 b- B& d$ h( q
}}* \/ k( ?" A5 J! @2 l* `
template <class _T, class _Tstream>
* L# N. f2 v% o5 e1 W6 R( l0 f/* _Tstream: inputstream, _T: get return value
* A) j4 q8 c) x* Y* Return nonzero if get value successfully */
7 _ P5 d' ^. s, F0 gint GetExpValue(_Tstream& istrin, _T& nReturn){
5 x- Q- t: e* I }# w) l _T t[3] = {0}; //雨中飞燕之作: K3 O$ @! P7 A
char csym[3] = "++";# R+ f" [+ a8 c$ i) R
int nLevel = 1, nERR = 0;" Y* p7 v1 ? t9 b s: {( b; v0 K
if(!(istrin>>t[1]))istrin.clear();
$ F# a" P& O. ?; b! m* [ for(;;){0 F5 \+ H4 B0 q3 n
if(istrin>>csym[2]){
0 P+ p- \% \, v& y) r/ B switch(csym[2]){- l# q! T p. {, a
case '(':
b0 Q7 d' [8 v$ [3 x! [; @ if(!csym[1]){nLevel=0x100; nERR=1;}else4 W2 ]. H K7 W# X* F2 z3 C
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 \" r8 g& I6 H. S+ \( h" U$ H1 m
else{nLevel=0x100; nERR=1;}
9 Y. e3 l* }- |9 }( t& w. k$ K break;
$ V+ `( l# c2 z C4 y case ')':; G/ {% d# k& i- A. Y
{nLevel = 0x100;}break;) s3 \4 ~; v2 u# { u( ?# `; v
case '+':case '-':case '*':case '/':
5 c$ x' s1 p- ?3 \; ]! k3 B; N {csym[nLevel++] = csym[2];}break;
4 U+ o; t2 |4 n( _3 n3 @. B case ' ':case '\r':case '\n':case '\t':continue;
' u7 {/ @8 N1 g l$ ~ default:
5 R5 ]! a; j2 y* r" E {nLevel=0x100; nERR=1;}. j2 E( p. T, n/ G" D
}. w8 o' b8 l3 A' S$ A. A
if(nLevel==0x100)break;
' a) X" X; Q5 Q: a8 E4 ^ if(nLevel&0x10 || istrin>>t[2]){
+ P" T' p1 L0 B+ x: y; v nLevel &= 0xF;
* Q- `7 ^/ y6 l/ F) w if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 W1 }0 j) H8 L: t4 a2 z
if(csym[1]=='*'||csym[1]=='/'){
$ q- \# R( i* g K; l/ j GetExpValue(t+1, csym[1]);3 q3 G" d, | D. y" t2 i8 c9 p( e7 \
}
6 G) E& \ [( K% f5 O- t( \( @ else{4 }! M/ H. r9 Y
GetExpValue(t, csym[0]);
6 f* n7 `: D# A% s% i8 V t[1]=t[2];csym[0]=csym[1];csym[1]=0;
- Y: a/ a z$ ^' ^ }
( S3 n4 Q- v, H& o* D- D2 K& Z nLevel = 1;! O. W) ] O3 S v( O
}
! q9 q5 f l( @* M( K( Z" i else istrin.clear();- f+ [. Y# y6 p
}
# f* g0 E: P4 O3 f2 b" U3 k else{nERR = -1; break;}" ~* q* b7 g( H
}9 B" A3 p3 n0 \5 A1 r+ d8 p
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 d7 L+ v3 \% b/ C, t' A7 g
else nReturn=GetExpValue(t, csym[0]);
1 l& Z) c9 m# ^; f$ V return nERR==-1?1:0;
+ m# ^7 L F: B8 `8 X8 P}}
& o. Y7 ^) ~2 |% E- w" h4 [3 K% @$ w q& k; A$ [
0 [4 f+ O2 j; Y& v# h0 e$ S
( m5 M4 r3 M* G4 T: I( w: t' K函数模板使用示例:; e' i& H+ l6 x/ p; H: U
在以上那段代码的后面加上以下代码:( U% y+ A8 _% I3 C# h! |
# k6 }6 \9 L9 T8 _9 t! B
$ l/ w" k' i. y
( @1 z- m. W8 }/ \& |程序代码: 1 H' O9 M/ X3 q9 E+ C- t/ k
" P* V7 x( \9 z# I8 a
#include<strstream>8 G; t6 P$ z: i- d
#include<iostream>
: V+ y/ E% U/ v. u& b#include<string>1 G* a/ L7 ^! L. d
using namespace std;
9 s) b8 B3 }! O$ p: @int main(void)/ X8 P$ L- {7 y4 E
{- M: ~) b x. g& s& q- A3 m! K
string s1;* D; U0 z/ ~" _ D* D
while(cin>>s1)+ }' U q! ?2 Q( B. x
{
6 z3 R) q( @& b istrstream isin(s1.data());
& b5 H+ B" e# q1 a8 d; W double d;
) B: ^% V3 B: @& x! p# c if(fy_Exp::GetExpValue(isin, d))
7 N. a8 G: j( u" m- a {) I: w+ l( X2 i
cout<<d<<endl;
* Q1 n9 Z6 x7 B1 W; O. h }
$ T' } m% }" i! z else. h- R$ p7 {7 Z/ o: L. {! z4 [
{
: v: p3 m* n- H* F: i cout<<"ERROR"<<endl;
8 s9 N' a7 {# l }% F. H1 n5 g5 U( M& J% K b6 Y3 J
}0 `6 d9 V# l* P: i% z- ^
return 0;
: M% c( d ?/ j4 ^- \& I- I}" b; d$ K" m# \5 C. m; m3 d! W) B* K
; E2 l- M7 F* x5 M: E2 e. Z
{: w7 s2 L9 k3 [然后编译执行就可以了(*^_^*)* K0 Q3 \6 N; B- v( x
其它:TC++上一定编译错误,不保证在VC6上也能通过编译. U5 m8 _) c, B" [" B! @
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|