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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,6 n3 b# J8 m. V% Z$ p/ x
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式 a2 F+ l. `5 l% P! @& Z& k
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 d4 {; g9 t* {# C/ Y
参数解释:6 ]5 B" G, Z6 D2 o- y9 I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& k0 f2 z; ?5 K* |5 K1 X* \nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ v( ]: |9 h( X3 Q返回值:# Z% K s/ w/ Z! E/ a
返回非0表示计算成功,0表示计算失败有错误" x2 v- i6 r. l. ~( ^. X
# Q" u, ^7 H3 f1 C8 n! q" v " @& v# L8 j, o
( a0 K2 b7 v8 b: e) v0 k
程序代码: 6 \, B/ J4 s0 @6 e4 B5 \; m3 O
6 z: r; T% q7 unamespace fy_Exp{ J, ]3 x. C! U
namespace {template <class _T>% Y( m+ X' K: N- J1 l/ {
inline _T GetExpValue(_T t[], char& csym){4 |( |5 }) g; M) U2 { s
char c=csym; csym=0;
* {- w* X2 V8 R7 u switch(c){1 B) `6 t+ j3 l& i
case '+':return t[0] += t[1];5 B/ E" V# t- c1 ~9 {. V
case '-':return t[0] -= t[1];9 _( H/ r- W( V b/ z+ I
case '*':return t[0] *= t[1];& L' }5 B5 S2 |! L6 k4 p O
default: return t[0] /= t[1];//case '/':2 v2 ` i4 O' I
}
, ~8 D! R3 w6 v3 M+ l! i( ?& [' W4 n}}
, W4 Z& X, j# {# D9 h# S: @ [- |* utemplate <class _T, class _Tstream>* \7 U8 P' _5 J$ l6 {2 F
/* _Tstream: inputstream, _T: get return value- ^# W( `( k9 z3 M
* Return nonzero if get value successfully */
6 {; g% m2 Y5 L) ]( k K+ Wint GetExpValue(_Tstream& istrin, _T& nReturn){! P- X/ j; t9 [( F1 B, }) n; H/ e3 L
_T t[3] = {0}; //雨中飞燕之作8 D% K6 e& S Q, u& d& O3 w
char csym[3] = "++";. Z$ z( {6 m* T& `8 S$ s: _
int nLevel = 1, nERR = 0;
+ H+ r! P0 ~* r+ M if(!(istrin>>t[1]))istrin.clear();% t& x% e7 _7 Y4 [, I
for(;;){3 ~$ B+ F* v2 e6 ?1 N/ Y
if(istrin>>csym[2]){
8 J8 E6 C: t y$ w" V# B+ A switch(csym[2]){( ~: i9 D& ^! N& ^. V" _
case '(':
, y6 h5 L: C3 |8 C' \: J5 D if(!csym[1]){nLevel=0x100; nERR=1;}else! r; ^0 `" N9 L5 [
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
! s# o8 U7 U' Z! g1 \) ^ else{nLevel=0x100; nERR=1;}* h' {6 B+ i9 Y7 Z- M+ j) j$ ?: M3 `
break;
- T: ?1 g* d @. Y case ')':
# z* D9 G1 _1 T0 w; b' }4 J {nLevel = 0x100;}break;
. ^- L8 \7 A% e/ @ case '+':case '-':case '*':case '/':5 F- v: r' E7 j$ h b+ b' L
{csym[nLevel++] = csym[2];}break;9 ]/ x. v/ }& o6 I3 J* Q- F
case ' ':case '\r':case '\n':case '\t':continue;! h$ p b z+ c) K6 Q
default:
S' E1 Z* o; {* W( y( `$ c {nLevel=0x100; nERR=1;}# Y& b: T$ s2 c% @" v; f& ]
}% f% K5 `5 ]+ H! \1 O# E. l
if(nLevel==0x100)break;9 U; ~' B& M& K+ i4 b6 U
if(nLevel&0x10 || istrin>>t[2]){
. K( c* g6 f6 [) U7 e nLevel &= 0xF;# c9 j( Y3 b, t; A$ C3 ~
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& @9 t H8 O. e4 W$ ^8 H. r if(csym[1]=='*'||csym[1]=='/'){0 u: W) s# L7 e( k. s
GetExpValue(t+1, csym[1]);
1 A( E9 j/ R* g5 C }
9 E( S6 Z/ ~& [* Z% m else{
. V$ k, Q- Z- ?; ]+ r GetExpValue(t, csym[0]);
6 E. Q+ s# k! B t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! T* m$ U; ^' @" C; r, V6 [/ F& U# j }
+ {4 I/ H4 j/ X, g! j( q& j nLevel = 1;4 p* [) N7 v6 M* f8 U0 u
}
. n" w/ b: G% F& }! b, a else istrin.clear();. w0 Z9 x }7 u9 F9 E9 a) O
}
- d" [6 N6 a S. o else{nERR = -1; break;}
, a( B! n- v# u9 m/ g3 D; X }3 i, B- a# T, a3 @
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
a/ }2 S3 S+ f }2 O else nReturn=GetExpValue(t, csym[0]);
8 `5 Z$ N! Y- C! ~ q5 o4 Y return nERR==-1?1:0;
7 k8 H* B. Q) B8 G# T8 d& |! D}}2 K( z. h' c1 ~2 A8 L6 W
8 `. ~4 X! T$ S' K
; d- x2 }2 B k8 `, x7 h+ O5 v* V1 b0 Z' t X
函数模板使用示例:. \5 s+ ~% B- \: f
在以上那段代码的后面加上以下代码:+ D7 M0 H- V0 K; i( \1 ?
$ B5 ]2 {5 X* S- B4 \ + F9 _1 ~. |: E. T1 h B
. Z: U5 t$ i( r! o# K, P! t程序代码:
. a! O% S8 R2 v/ ?% @% R u3 }- ]% M$ l% C' _
#include<strstream>6 A' I+ N# A8 G+ R
#include<iostream>
" T- Y7 V; @9 g4 K5 k5 [9 V#include<string>* O7 e7 h5 M c2 @- d1 P9 w2 V
using namespace std;2 a: J. h1 p* r, O& ?6 z1 j* X
int main(void)
& i( E& l: [: C3 v" Z/ @5 k{
* T% r( J9 z/ l) `/ v string s1;
6 x& @5 O! j! G while(cin>>s1)
2 ~7 D: L& P: x* ` {! G/ u4 J8 f9 }* Y
istrstream isin(s1.data());
4 }9 m& \/ I# l$ u9 Q) l, ?3 y double d;
, c$ ~/ }$ D% h( _+ z" v if(fy_Exp::GetExpValue(isin, d))# P! ]' O- x- T7 H
{) V: i; @$ y$ C3 v' h. ^
cout<<d<<endl;- {; B0 x _7 ?! e: u% x
}4 }! R2 R8 J0 f/ ]- ]2 ^, L
else
0 p2 }/ J; i4 P4 w/ A" L& V {
3 y7 C1 y3 S X& s cout<<"ERROR"<<endl;
& n: L# m1 j: i* @0 M; q }
6 N6 z& n r$ X4 e6 R+ l, S }
6 ~5 x4 f/ g+ \6 }" Y" [) i! q return 0;
" J, c, {+ r9 I6 S0 y}; @0 _. S2 v4 v! U
1 q7 N1 r: I! ?$ q$ n5 V' M+ `# s, [& n
& s4 v# o2 @! I) e! g) K6 _然后编译执行就可以了(*^_^*)
2 a3 b+ Z/ r! f/ ~. o+ i A其它:TC++上一定编译错误,不保证在VC6上也能通过编译, N3 ~0 U. A* M: D' R" l
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|