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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
3 S: J2 v9 Z6 }. S5 L0 R" O一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ s6 H- A* o9 B. \只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" @7 |& j9 w/ ~8 D3 b6 I, O参数解释:
" [+ E9 L3 b# i/ }: ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* o M9 Z! `1 \/ h1 g M0 t* |% Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; H7 Z# B" H4 ]) Y) }, a
返回值:
' S1 D% _! M E7 |2 Y7 S% ] A- W返回非0表示计算成功,0表示计算失败有错误
( _* i6 k7 z+ ^- ~$ [2 H! V$ C5 x6 m
2 U* F& p" B) ~& _. I
! F! _# a8 A! V$ V# Q4 i程序代码: # ^. X' M% }8 V6 u- K2 F2 _$ S
: C7 V b$ t! M0 k4 @$ e1 [namespace fy_Exp{+ U1 p u) ]( n
namespace {template <class _T>$ t9 x" q8 u9 d3 ` x
inline _T GetExpValue(_T t[], char& csym){% E7 O1 H3 t& T# b, B/ l
char c=csym; csym=0;9 E9 v; d) ^# a. t& A4 d+ a1 _- D
switch(c){+ A3 A* s* @# s. |3 x0 ]" Q; v4 W$ p
case '+':return t[0] += t[1];! k$ B3 m9 a0 x' K9 Q$ f
case '-':return t[0] -= t[1];
, W1 i6 I' L, S case '*':return t[0] *= t[1];+ m. s/ Z$ C2 F0 x: l
default: return t[0] /= t[1];//case '/':
B( N7 D* B% y" a. Q& F }" B0 S- j3 _3 `7 I7 z2 ~+ w
}}
5 V) o) J- a9 l8 J- N5 I# a7 S5 S: ?template <class _T, class _Tstream>" A3 [& y- ?3 G! `# z1 A; ^
/* _Tstream: inputstream, _T: get return value7 I& L4 u3 ^" h# @
* Return nonzero if get value successfully */. Z4 V2 L4 Z9 C+ S# L
int GetExpValue(_Tstream& istrin, _T& nReturn){# Y6 @' L. f: ^. B1 v& n: ^: O# J
_T t[3] = {0}; //雨中飞燕之作% ^, [" I" y0 [- E* N
char csym[3] = "++";
! t+ k6 B$ x# _7 u* L int nLevel = 1, nERR = 0;7 J2 Y$ }" C8 w2 |# ~8 ?, H6 M( U
if(!(istrin>>t[1]))istrin.clear();
8 H4 ^+ J" ]& I( w) X( d for(;;){) a) m6 u" q: K; N' c2 A8 z Q
if(istrin>>csym[2]){
; P H; W1 Z7 O# x# ?* S switch(csym[2]){
& z$ ?* Y3 o! Q( {9 Z2 ]3 ~0 m1 t case '(':
7 ~) R- o) H6 Y5 V& l if(!csym[1]){nLevel=0x100; nERR=1;}else
. N7 [* w( R3 n2 R8 I7 a% d9 O if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: O1 r2 A. a) ~7 J, N. k
else{nLevel=0x100; nERR=1;}
8 s# ^: L" _2 E, C {2 f" u break;+ g2 p3 T, I7 c' J. g- F
case ')':0 U. ~9 u. @# {
{nLevel = 0x100;}break;# u1 b$ @' v- o+ ~! H8 R" V- X
case '+':case '-':case '*':case '/':+ ~% ~! `# B2 e) k
{csym[nLevel++] = csym[2];}break;) T* ]6 v/ V9 ^% l: p
case ' ':case '\r':case '\n':case '\t':continue;
2 \! e1 Q% T( |5 J1 C default:$ f9 N. `' E5 P% N5 J4 t
{nLevel=0x100; nERR=1;}
3 T0 C6 k5 F: M5 f, a" _% l }
: B! ~ y" o0 {6 v6 b- y" I if(nLevel==0x100)break;% t2 ^2 R3 g! V" m2 f
if(nLevel&0x10 || istrin>>t[2]){
" y0 R& Z ]& h! C2 v nLevel &= 0xF;
3 i) c) A- J3 E. P: d1 T if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}% ?0 W ]0 `& \4 f. c! G; Z
if(csym[1]=='*'||csym[1]=='/'){" C! R1 k5 C9 C* X4 I, U
GetExpValue(t+1, csym[1]);
1 G7 Y5 @; V& d& L2 E }
2 R2 }, c0 v$ s ^ else{9 M2 C2 A) e8 y# n
GetExpValue(t, csym[0]);' q) G8 |' y1 J4 e- y
t[1]=t[2];csym[0]=csym[1];csym[1]=0;) f) \: `* B6 h7 v6 u3 W
}. O& _! K# j: b) s. {4 m
nLevel = 1;
$ L$ K. N" R; R3 a }
! [0 J: H4 i% p& J else istrin.clear();2 K3 b. y; w7 e G/ Z: K/ [" S. w @% R
}5 d/ Z4 v' |; T1 f
else{nERR = -1; break;}) p* r6 {8 F* L9 h
}
T4 t4 S$ I, ?! m7 T) {9 z% h if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& b+ ]( v7 Q! l2 J! j8 F else nReturn=GetExpValue(t, csym[0]);$ Z1 \4 R& g4 c) P
return nERR==-1?1:0;
2 E# S0 t, v; n( D4 |0 ^}}
8 G1 g8 P, z& L/ K4 l0 Q+ z6 d! t- F
( q, P! Y; r+ v7 R) n6 C
) v6 q3 b0 q$ ]; O/ o1 U% b
函数模板使用示例:
' A. v# X* I+ K" ~( M$ F) T s在以上那段代码的后面加上以下代码:' [( E& J# B, r* T* } C2 y' c
6 T4 Z% t6 h# @% ^3 Z! P; ]
. ?& `: K" y( f6 c# T* g0 n+ b$ w1 b# ?* q: w9 [
程序代码: ( ?. P) {( Q5 u( w* y, U. s: t
! M- l5 ^& |8 O; k" Y. o#include<strstream>
; W* R( H0 g8 h: x: F, N#include<iostream>
6 A/ U% e! O S% a#include<string>
, U' i9 ?4 E# t- h" l: b$ l" ]) A1 Eusing namespace std;4 [% N6 l5 o, {' m" A% u
int main(void)$ X, F! {- W4 o9 f* ]
{3 ^0 d: C; }1 I4 f B7 r3 C
string s1;& D6 P/ p! g! b, u( g$ \
while(cin>>s1). k8 X" M) q* S
{* n" h( Z5 d; y k) f
istrstream isin(s1.data());
: Y: W) T, H9 x9 @7 Q0 W double d;1 }& E6 F3 T D9 ?7 i0 W( p2 g
if(fy_Exp::GetExpValue(isin, d))
j, y9 m( N+ v9 N0 g8 r6 y6 z {
( h1 u: j8 @/ N: y5 t cout<<d<<endl;1 k. V2 q3 d- G* `" J% k
}3 p$ C3 d: J$ `4 b3 S2 ?
else
- C, P2 L% g# k* k( ] {0 v3 t# }6 @, p0 [# D) z
cout<<"ERROR"<<endl;
- ?) f' }/ [4 B" U }
/ N! h' V6 B& j& k/ }% w2 n }
) s! J% k$ d# I. v return 0;' J) A+ @$ ?6 G" Y
}
! W) N. Q. y0 Y# R; Z- T$ {$ P, r
! u' y% Q# V7 E: M! ]# r
然后编译执行就可以了(*^_^*)) w, K( w1 Q: n4 p+ ?, N" ]6 v; U! \
其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ v' H( K- e* V; d
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|