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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
6 @& K0 w$ R5 @! a, f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 F. D% ?: O0 e6 F X8 I7 I& b只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
; B. K" e" u4 u+ }$ ?5 g- w2 ^/ U参数解释:0 U/ d c: J8 e
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: i& P6 W8 G, a2 [+ Q" u3 _$ anReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定6 N0 R' ]8 m* o( K* p O& f) l
返回值:
7 `1 u' Q) U+ i. M" n返回非0表示计算成功,0表示计算失败有错误
# w0 g' a/ w/ n- B/ v9 `! ~6 J) j- v: {" K
& l1 }1 y; C) R7 D) e8 G4 [/ O2 i. r8 D
程序代码: ! m$ Z; V! I1 U
. j$ O! ]$ ]- c! p* m' O
namespace fy_Exp{
( u4 }, n* u" I# unamespace {template <class _T>
" k3 }6 R( ^8 O/ ~6 K( I/ Vinline _T GetExpValue(_T t[], char& csym){- T% @6 P/ y, _( {5 }: I
char c=csym; csym=0;4 y3 A+ q& ?5 T1 X9 o* W s( _ R
switch(c){
Y0 N2 w! O7 x3 R* S8 O$ D case '+':return t[0] += t[1]; q5 K% f8 e3 u5 U M: M5 @
case '-':return t[0] -= t[1];
8 W! A7 a. Y, p3 h1 I case '*':return t[0] *= t[1];
, q$ S& l. s/ ]5 o1 r default: return t[0] /= t[1];//case '/':
; r2 ^ n0 f/ w' ~4 @ }
5 F# J0 \/ i' w; l# n! o- J* P}}
! W6 r/ G, S7 f1 @3 S) t: @+ mtemplate <class _T, class _Tstream>
/ r+ M: j- j. L* h% n% |9 i4 w% _; \/* _Tstream: inputstream, _T: get return value# d) k/ g! V- f) U- X
* Return nonzero if get value successfully */3 C0 l* Y. R3 g: O% z, h0 `& C
int GetExpValue(_Tstream& istrin, _T& nReturn){
2 V1 H" u& U9 u( {5 J; d/ \, N _T t[3] = {0}; //雨中飞燕之作
0 S* S+ {) q% L. S; [0 N& m8 @ char csym[3] = "++";
, z# J8 M9 D& d1 e8 w5 w int nLevel = 1, nERR = 0;
) o7 w* O" B4 ?) j. n if(!(istrin>>t[1]))istrin.clear();
5 e1 c: r' H1 m$ ]- G+ ` for(;;){$ z, b5 O' t9 Y1 S& R) v' r- h
if(istrin>>csym[2]){ c; _# V! T, i+ C
switch(csym[2]){
$ ~0 c2 P, N0 j( X& ?& x' S t case '(':
1 C# Z; t) c" O6 p if(!csym[1]){nLevel=0x100; nERR=1;}else
3 x& K+ _) k5 X ? W if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! y; S S; ^8 }. }
else{nLevel=0x100; nERR=1;}
+ g# ^& N; E1 O break;
9 H0 P) t" c: N: J- w case ')':- v4 R5 ^; k; D! f! W* F. [
{nLevel = 0x100;}break;
/ u* a; W& M( b% b case '+':case '-':case '*':case '/':+ S6 G3 c; l0 Q
{csym[nLevel++] = csym[2];}break;
# j/ Z1 G( L: B! ~+ Z% j$ A/ m+ W case ' ':case '\r':case '\n':case '\t':continue;
9 Q# W) X5 l& z7 {1 [ default:9 T1 ~0 j" M* d# w
{nLevel=0x100; nERR=1;}
/ l/ `8 |- M" z5 _4 n }5 t! \" c- {' w: B
if(nLevel==0x100)break;
2 |/ j" B) L3 U& m7 u3 _6 l3 m& u/ N if(nLevel&0x10 || istrin>>t[2]){% n3 s7 n5 ~/ [$ w( f( u
nLevel &= 0xF;
$ r, l% \! _. A! n if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
* A/ t6 M! d, a3 \- p if(csym[1]=='*'||csym[1]=='/'){
7 ^% j- r# i" a GetExpValue(t+1, csym[1]);
; |! s+ ~1 t3 k* _4 F2 Q }
' i" n! F) w, j7 ^: t: _0 P9 c else{
`! c5 ]- P5 |' {# v' X& X GetExpValue(t, csym[0]);
7 |4 N8 N3 Q8 \ t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 Z+ B P( \2 h
}/ h: V) V! O/ e" G) i& ~6 z3 ^
nLevel = 1;
6 v# U6 O" _% j }
5 w! m) \. m0 P6 X else istrin.clear();' F8 {5 s1 K5 \( w8 F
}
, u: d, ]7 ~1 ^: \ else{nERR = -1; break;}2 w* Y0 k) t5 x2 t
}" `& p% ~1 k* {- ]8 ^
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 W6 S S+ M6 |( ^" \
else nReturn=GetExpValue(t, csym[0]);
/ W% R$ {) F0 y g7 W return nERR==-1?1:0;
7 D8 p6 Y/ |! s' t}}
# Z R; f! v2 g/ `0 b4 l5 n
" z0 i* K- [$ k, D
, W$ a" U! e4 y2 t/ [. \$ ?8 E4 f2 D& o/ E
函数模板使用示例:9 T% G/ N# V$ t2 _7 m. ~, a) i
在以上那段代码的后面加上以下代码:
. P4 y- g5 N% X" L. f% m4 r6 D [" ~
# A P$ I7 u h9 Y7 h, i/ k
- m3 Y" K7 i b, C7 i) q+ n程序代码:
' T$ T* m$ {2 D. X2 V: }
- ~* S4 [0 Z! v; V% t* { U#include<strstream>) G8 B( w/ f7 Y, m! h5 M: y
#include<iostream>8 q1 K) ^6 J1 l! S# z
#include<string>
( f: F( c9 d+ S9 G# w, dusing namespace std;
: N h4 S1 K5 y0 Z3 A/ Aint main(void)7 D4 g l( S0 U$ _& X1 e' h, R
{, k. W' ^$ }7 z* Z! u) E! \( t
string s1;: n+ F3 G( q5 p5 v) G
while(cin>>s1)3 L r4 b: F, j8 e. r
{
0 @- ?: U) p3 | istrstream isin(s1.data()); I4 ^" ^+ G2 V% U1 d
double d;7 K3 C2 N: j# C' m0 B6 f
if(fy_Exp::GetExpValue(isin, d))
1 \ k, ]6 S! ~7 g' B- N7 q { i6 W i" o0 _) B: d
cout<<d<<endl;/ H- K( E) B4 L# T! e( T" M2 g
}# H, K# M e( x q# `
else) o# e' Y2 v8 o% S: Q
{
; c" Y# F- m9 m. s3 } x3 K cout<<"ERROR"<<endl;
% T) f( W8 ^9 h& ^ }/ ]/ [1 K6 u4 h K* @0 M3 O; Y+ `
}
1 b' H5 I N. o9 q6 Z- I return 0;+ L3 t. F X. i1 q, S' B
}
/ m8 M2 Y' r' h+ d0 |5 w a, I
2 o& r! t8 \4 t! J( }
然后编译执行就可以了(*^_^*)' Z3 f" _% j% _7 u+ y8 [7 C
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; k+ r7 q6 ^1 a8 g N/ t3 C4 g 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|