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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
( ]0 n {$ j+ t$ i' ?/ y一个很方便的函数模板,可以并且只可以计算含括号的四则表达式2 [1 B- r; H* F. \% i
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. C! V' ]2 Q# i* ~; A; }* f参数解释:# e m1 q( a, V0 r5 T/ `
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流$ ?$ }7 V" P+ [$ ^. l* e& J
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ U" e( x1 f/ f0 ^$ h8 h d
返回值:+ {" P1 r9 u) a- w1 `
返回非0表示计算成功,0表示计算失败有错误$ \- O% f( ~' x8 l& c
. G* ?/ g$ A9 n' E. H 7 Z6 a& g7 m- d2 \3 d$ y) R
6 D5 x% t! D7 B7 I+ e" q2 i0 d6 @
程序代码: ( G* }2 l0 t: _' H: {3 f6 G) X" @5 m
2 \' _# g/ q% p) {8 U6 Anamespace fy_Exp{
0 f. v( @" i1 M( G9 H4 _' E" [namespace {template <class _T>9 ^ {, a3 s2 p, {* y3 t
inline _T GetExpValue(_T t[], char& csym){% x. r7 t1 b2 ?) q. [' q
char c=csym; csym=0;) V) k9 V" S+ x% R
switch(c){
# m9 x6 J9 V, k" e case '+':return t[0] += t[1];' Y3 W; ?7 N! H
case '-':return t[0] -= t[1];& U6 ?: Q% F" m& |: X$ o
case '*':return t[0] *= t[1];7 S$ f- y5 _ p" S0 ?5 N! T. P
default: return t[0] /= t[1];//case '/':( Q0 S1 `7 y/ S
}! E) G' o7 W! c+ K$ \5 f
}}7 | c- ?# O/ J# [0 D5 }0 Y
template <class _T, class _Tstream> B: c& S$ e; r5 k5 [8 m1 ?9 O" s
/* _Tstream: inputstream, _T: get return value g1 L5 L* i4 N8 T
* Return nonzero if get value successfully */
8 H) T. z9 g7 m0 v4 l! J/ mint GetExpValue(_Tstream& istrin, _T& nReturn){
3 l+ j% Y& O/ S' h- _3 r* R _T t[3] = {0}; //雨中飞燕之作
% i. x; C& X& S+ @! v6 _ char csym[3] = "++";. h3 \$ |+ N. i4 N& u
int nLevel = 1, nERR = 0;3 H/ m+ }; l9 Q5 V' \: F
if(!(istrin>>t[1]))istrin.clear();6 ^' w E" O+ J
for(;;){; n" ], E* _& F; C$ T5 E# V6 G" c k
if(istrin>>csym[2]){
/ c" B& r* ]3 _ switch(csym[2]){
d* u# j4 m4 E% c case '(':
4 C% |7 O' c2 y2 C* h1 g if(!csym[1]){nLevel=0x100; nERR=1;}else% L6 X: }$ ~" ]7 O5 j
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 F4 g& Q" }" w, D% S6 s else{nLevel=0x100; nERR=1;}
# {# Q$ t3 R( x9 z break;
2 r; \# V3 a/ `$ V- X case ')':
4 S E0 n2 O0 l- s l1 u, @7 A {nLevel = 0x100;}break;
2 N) o% E2 R" @, @; ~% q3 c case '+':case '-':case '*':case '/':
8 w: z0 W- S- I& ~ {csym[nLevel++] = csym[2];}break;
' ?6 p% E5 I5 R case ' ':case '\r':case '\n':case '\t':continue;
, m/ p! ~* S$ w' D& Y4 Q$ c* v default:
/ o: W0 ~/ W% J- p {nLevel=0x100; nERR=1;}
) [8 n: x9 Q0 s7 S' r, n L' w }4 A3 U& R6 l* k, `/ `
if(nLevel==0x100)break;) |! D6 h- b* e" B0 T# Y5 a
if(nLevel&0x10 || istrin>>t[2]){' H) c# I N4 A' t! [+ E
nLevel &= 0xF;
% Q3 [# m5 e7 F6 |: L if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}4 \1 u1 I& }. u/ G6 A! C9 c
if(csym[1]=='*'||csym[1]=='/'){
$ C8 N4 q- f4 ~2 {8 B2 S GetExpValue(t+1, csym[1]);
4 X2 n8 w+ @) f* G8 u! z }
. R& Q4 n+ J+ o3 K0 Q* w else{" Q+ t, U0 |9 q; B# i! D
GetExpValue(t, csym[0]);* Q8 P4 m& p& I7 W0 T+ B0 ?" a
t[1]=t[2];csym[0]=csym[1];csym[1]=0;" x. A! B. x# h! P5 b1 `* n
}4 V# B ^7 o8 Z2 h' C
nLevel = 1;
% m0 T: t+ |" e6 Y, x! B }
1 m) c7 V( Z! T8 u else istrin.clear();+ d4 j) h- ?. u
}* L, T$ y+ J& Q( b6 M' M/ z% ?$ h/ g) P
else{nERR = -1; break;}% D6 L5 ]7 | @
}
! l& c: m) d8 F6 O$ x if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& _# G# O" C/ g+ \) f: Z else nReturn=GetExpValue(t, csym[0]);7 W' ^& S0 g4 x4 `0 A
return nERR==-1?1:0;
7 Y) A T7 P2 y% l}}
4 ]0 v' R, H* F+ x9 k7 V
5 F: R7 J6 D$ \: W. n% L ]" c8 f- F+ I k# k/ q* ^( g
, c* i& u/ M! {( R% z, O3 \0 r函数模板使用示例:0 h2 ^+ l' p( [1 n$ v) b+ W( G
在以上那段代码的后面加上以下代码:7 M' q, e( v4 H0 g) y
/ m2 F# `; L' Q; [% F
* O. T# j3 @4 U( t# q* r" x8 {& E4 }# {& Y
程序代码: ) D: x* a! B7 u6 j. t' \ ~# u8 p
4 l. L+ J7 b; w5 l
#include<strstream>
" Q( |- X0 a5 x2 q( B#include<iostream>
m9 W. ?% G; a9 C#include<string>
; ^) [: ?* {! c) \% c, `using namespace std;
5 F7 f. J3 O/ ^$ p1 r) Qint main(void)
; f; x& A! r0 ?{; I9 h6 v5 c6 z+ r. R9 m0 W
string s1;
7 G. Q1 B: H' T {* K7 p& V3 } while(cin>>s1). M& N) A/ Z; f1 x
{! B& n" }9 \2 s1 S8 O
istrstream isin(s1.data());
0 f1 m3 i& H8 V: T1 z; w$ L+ T: z& B' i double d;
; v. R# B+ G1 g( F# ~, w- e if(fy_Exp::GetExpValue(isin, d)): D0 P" c* x+ k: h7 [' V: L3 Q
{
) z G+ l& A' {! f8 i cout<<d<<endl;
6 |! W2 ~# M5 }5 ~; e5 x- y' q }
4 F+ R6 }' ]" S! v, Q else
6 e) w7 @8 j" Z {+ c4 l" G% D/ O/ O6 _( t
cout<<"ERROR"<<endl;
, Q' R0 J# Q, _3 x/ { }7 J0 v; \+ [6 [; e( D4 O5 S' k
}5 r+ H/ T+ N: t3 a
return 0;3 y# A4 C& d' L
}
+ O( X* N1 ~9 _0 u4 X
& i% {: \3 ^' y$ `) B
, z; G& ~3 V0 E4 a! H然后编译执行就可以了(*^_^*)
; M$ e: [) b. l+ o( I. N+ K# X9 L) b其它:TC++上一定编译错误,不保证在VC6上也能通过编译
4 ^) V! S8 |; f 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|