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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
@" H% a' T7 j/ D J7 s2 a+ Q3 [一个很方便的函数模板,可以并且只可以计算含括号的四则表达式2 I5 A; \7 Z0 Y% [
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 J8 C" O! m* R" X5 f# t参数解释:
! D9 R9 w/ Y, T7 P/ U( ~$ l! Mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 f# n9 b/ I0 a* u0 x9 vnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 `+ s" ~, H& O6 r0 t
返回值:/ s$ w7 Z! V/ G4 \8 ^. d: s, c
返回非0表示计算成功,0表示计算失败有错误
- U0 M& T8 ^( b- q* J5 g# k( _6 {
+ V) g2 L% z+ e; w% a5 q9 ]. W' S 9 h. d& ~# C: N1 b+ n+ ?- y$ j
& t( I& D6 D U7 W
程序代码: 5 v- K6 b* Z% ^4 z5 Z7 `
) X- a5 x* Y" {( g
namespace fy_Exp{
2 y6 y6 C8 X2 `0 s7 Wnamespace {template <class _T>
$ ]: Q4 X3 r7 v) `inline _T GetExpValue(_T t[], char& csym){
! C- I; h C% y/ O9 c char c=csym; csym=0;
) o( U" D+ E2 N* ?9 Y8 C9 F switch(c){9 J- x6 X- }/ k; i1 t+ D
case '+':return t[0] += t[1];
% u0 U# v6 a$ [6 _3 G1 q case '-':return t[0] -= t[1];* U4 Q, I7 w. O9 p5 g
case '*':return t[0] *= t[1];
9 f( _8 U, V& f. ]) J$ _ default: return t[0] /= t[1];//case '/':
3 V( Q9 p* x; ~2 z }% A3 O w% ]' v0 ]+ y8 E
}}
) E" Z* F- M8 O8 f) I& Dtemplate <class _T, class _Tstream>, F. R3 ~4 t( ~+ G8 J* g- z
/* _Tstream: inputstream, _T: get return value( d) C y. G6 U1 u/ I/ N
* Return nonzero if get value successfully */; l3 D/ a5 Z7 K0 e. V }
int GetExpValue(_Tstream& istrin, _T& nReturn){
5 S& t9 ?: S% z+ u" Z7 ~0 u _T t[3] = {0}; //雨中飞燕之作
; \' A' s& k+ q$ t char csym[3] = "++";. Y: M/ u4 I2 b q+ }# m- b
int nLevel = 1, nERR = 0;3 E7 u! R8 H' ?' l9 o
if(!(istrin>>t[1]))istrin.clear();
4 l: ?3 @; a9 F- \/ o for(;;){
7 ~' @3 i( `* K% F- a if(istrin>>csym[2]){" M6 c! d& z |3 A" h% M) t( f
switch(csym[2]){+ {$ S$ z4 ?- v/ F. U4 s, d( a
case '(':
4 i; l; o. H- p& w2 d5 c+ P if(!csym[1]){nLevel=0x100; nERR=1;}else
) |! y( A/ c4 r& c7 F4 t" d if(!GetExpValue(istrin, t[2]))nLevel|=0x10;8 ^- \7 w: u5 a8 f+ Q5 P5 x! Z- S) |
else{nLevel=0x100; nERR=1;}
1 K7 I c, t2 N break;
* x4 E7 V% C6 I8 E$ ]" ~0 T case ')':
! N9 F& \9 V" i. B. N7 p9 N& K {nLevel = 0x100;}break;
- z0 I, s& H$ [& Q9 c case '+':case '-':case '*':case '/':
+ W& S/ c9 Y, l {csym[nLevel++] = csym[2];}break;5 z; x% z: \3 |: a1 @) z+ n; t: {
case ' ':case '\r':case '\n':case '\t':continue;
& \% T; D3 v; z: \3 x) ~$ q# E% k default:: q" w, A" k1 W N' r5 f) t: P7 |
{nLevel=0x100; nERR=1;}: c. z- T" a5 O+ s m) }& A2 \8 C; G
} ~6 W: f' [; N2 [2 U
if(nLevel==0x100)break;6 }$ d4 K/ b5 |, i3 E$ a( `% ?
if(nLevel&0x10 || istrin>>t[2]){
* t7 q1 A. }+ j1 ^. ?$ u nLevel &= 0xF;* n0 M/ J& V0 u) U, D
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}7 `& a7 H8 c$ u
if(csym[1]=='*'||csym[1]=='/'){) S5 u( ^( x# ]
GetExpValue(t+1, csym[1]);
) ^3 Q* p+ J1 h: U2 x; F }
: ^! o2 V" h. x+ r/ z D: v4 b, H1 K* n else{
3 ^& \. y, C8 S9 c$ b' j GetExpValue(t, csym[0]);, J& U8 d: [( A4 C
t[1]=t[2];csym[0]=csym[1];csym[1]=0;0 J+ W( b( m1 L- X7 \( B5 i
}, y7 l* w! {5 |2 Z+ H# [
nLevel = 1;
N7 C5 Y g' g }( @* T6 M2 H) l$ q+ K
else istrin.clear();
) k( `# n: e& y+ n8 C ]: g/ t7 @ }' Q# F0 [& E w% E J
else{nERR = -1; break;}: _/ @9 v& \* l$ I9 a% @
}
- \+ J* J6 [: e- i0 R+ K; F4 l- u if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% \- p9 o0 v0 Z; ~, g
else nReturn=GetExpValue(t, csym[0]);4 y7 f4 |1 j- ] _! n8 C% W
return nERR==-1?1:0;% k; p3 V9 M/ }4 |& }" M
}}
* R/ _9 H2 _- n9 o" e0 g7 z0 |$ H: L# H) w0 W8 `; X3 D
) Y8 ]7 k; j6 \7 |5 Z" k
! b9 Q4 {, Z; w# A, R3 w5 f. ]函数模板使用示例:
9 O% {. B* q7 `2 W; U7 o: T在以上那段代码的后面加上以下代码:( A+ f) X% [. b& W8 k2 t7 A$ o/ e5 D
: a! z8 b- p; c
- m+ j6 C1 N; i) e0 \, Y. G$ a; F+ ]* f2 i' `
程序代码:
1 q% h" n/ l$ o- c$ ], ?7 n
1 \6 n! i1 ]. i+ p#include<strstream>
! \& k& P% `5 ?" Z4 _/ }1 B* I#include<iostream>+ U/ @: z/ j% S( h! N$ E( b
#include<string>! u, w/ B3 d* R* w) E' u
using namespace std;( j3 L9 r6 Q! C
int main(void)
4 P: ^0 z) p1 H9 j, n% T. s{
* e) e) g( f5 }: x% o9 { string s1;
' b/ n: |! j+ o, a. C while(cin>>s1)
* g9 `/ R: c I' i: }, Q$ u' a8 L {
8 H) ?- x y% w& ~ istrstream isin(s1.data());
* U4 E2 v+ U8 z double d;0 O% T6 i! [# q4 }3 P. Q
if(fy_Exp::GetExpValue(isin, d)), }( m2 R L. r# L# N) u5 a/ {7 M6 F
{
# H+ E) f/ h! P* q) f; G8 y4 Z. a cout<<d<<endl;
/ }8 D; W/ K, L# F! | m8 Y }
]5 v( g6 A$ q/ r* }* F else
: V# |: r' Z) c7 H0 y3 o$ w& G: Q3 h& g {3 ]2 V- Y; }9 f S. T0 ]
cout<<"ERROR"<<endl;
3 Q4 k6 `9 |2 Y1 \ }1 o7 j5 t& _1 I) Q* J6 }, ]3 x. q
}
0 m1 }. a' _. Y! W* g7 e, q# R return 0;
& Z$ L6 b B J5 x8 E6 h}
% b: u- P, E0 U$ {; L4 F
9 f# ?- f9 X$ {- l9 `% U4 E7 N9 `: @& M/ v2 L# A
然后编译执行就可以了(*^_^*)
: n" [# ?+ u3 ~; A2 p1 o' w& |) _: ?其它:TC++上一定编译错误,不保证在VC6上也能通过编译 e. h0 H& O2 S2 |
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|