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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,; R* H2 m% P( J9 X4 L% @
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; T, N% R+ `& d3 `3 w5 ~
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 k7 r% a7 q0 a" A# G参数解释:' z2 ]( G3 k/ g' p. h; h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流& {3 ~* T5 b1 M3 b: G
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. L6 X; G! u" Q" W; C$ c
返回值:2 }+ V9 r8 x7 ~( }/ [1 I5 B
返回非0表示计算成功,0表示计算失败有错误; v( q& W' b: k) S2 {
4 L; |' i& @: X/ I) @* u4 m) ?
/ W" B* N/ [, c( c# q% W
" Q" V% I. q0 v r+ m+ w
程序代码: / B% V0 ~* |9 M" d
* t* r* o+ v9 K6 [" jnamespace fy_Exp{
8 ~; m0 \- ?" i1 L5 Ynamespace {template <class _T>9 p8 J& W9 f7 a# f5 K) Y* L
inline _T GetExpValue(_T t[], char& csym){; |. n- N, t* W; a7 p
char c=csym; csym=0;
5 Q7 \6 m/ o$ m switch(c){$ ~$ E, I. }: t2 U5 n
case '+':return t[0] += t[1];
0 ?* a H6 k5 g. g v7 x) m case '-':return t[0] -= t[1];
" ? Z/ C! E* T' p5 X9 F7 [ case '*':return t[0] *= t[1];
8 J5 y$ n% W& n" v, u; G default: return t[0] /= t[1];//case '/':/ H# U9 n5 M4 E- E
}
( t. x8 e7 J& p5 V7 k/ D2 Z0 d}}/ D# w3 a$ J5 }$ y" m* a5 ^6 ~1 @0 r9 K
template <class _T, class _Tstream>& _# D5 {0 V0 M' f( b
/* _Tstream: inputstream, _T: get return value* c3 Z: x, g* t( a% x! H8 g
* Return nonzero if get value successfully */
' o' N; \3 M- W+ Q7 V8 \int GetExpValue(_Tstream& istrin, _T& nReturn){! U9 C# q: }6 o' y, H" j
_T t[3] = {0}; //雨中飞燕之作) C! k& R6 i! W
char csym[3] = "++";
& U% b1 Q# P, D# i/ R int nLevel = 1, nERR = 0;, E# C4 ~9 P( l$ W( S- R
if(!(istrin>>t[1]))istrin.clear();! }/ [. ^- x; Y/ p
for(;;){5 i: p( j$ W1 j/ F
if(istrin>>csym[2]){& d; S$ d5 L: Q% T' k
switch(csym[2]){
- i0 y1 @4 _( A& g9 z( H+ d+ m$ ?, f case '(':
* r2 J0 t0 d4 N/ G3 Q if(!csym[1]){nLevel=0x100; nERR=1;}else: F1 Y0 y1 |/ Z' v8 d3 a
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, r5 i. v( m, @' o1 C
else{nLevel=0x100; nERR=1;}
. u/ e: ]6 F: H. ^" O0 p @/ s break;3 X% W# _) \3 e# o$ u0 c
case ')':! R0 M0 x3 b G, R; J1 k
{nLevel = 0x100;}break;& d9 X4 B- J9 i' {. \1 w7 D4 J5 } b
case '+':case '-':case '*':case '/':& {. x. Y4 W7 j, R7 l7 a
{csym[nLevel++] = csym[2];}break;: ]* Q8 ?) P3 q$ k7 w% R1 J D
case ' ':case '\r':case '\n':case '\t':continue;
/ f7 ^: K: j6 K* s3 L default:
0 ]% U0 s3 a& j. Q3 Z5 R7 O {nLevel=0x100; nERR=1;}
7 ]$ e, \! C0 V$ Q( o5 D }
8 _! v$ v# [& i9 Y if(nLevel==0x100)break;
/ _5 D; q; k: E' s5 h# J7 i# T2 w if(nLevel&0x10 || istrin>>t[2]){; E) S% S; B1 Z
nLevel &= 0xF;1 p: x4 D+ z0 ?) ~" \, t7 n
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}7 O7 j5 h ?& b, l8 R& c# o+ a6 _
if(csym[1]=='*'||csym[1]=='/'){
4 c# O% [! T5 I/ P GetExpValue(t+1, csym[1]);
: [( [% _' }0 c }4 i$ x9 g/ ~" w$ c- B
else{
; Q4 F; a" j" V/ \) O. u GetExpValue(t, csym[0]);
$ d. x& r9 M2 K! P% F, R V t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" D" H. }0 n# U2 R }
$ Y, \& h' [7 b2 m2 V nLevel = 1;
! @9 H2 G' G9 d( B j) U }
g/ E# ]2 z+ o2 a% `) R else istrin.clear();& p' S1 A, Q8 A4 v
}2 B* H. H" ^* H
else{nERR = -1; break;}+ v8 U N4 q) W9 [! a) M
}" w9 x6 V1 A* ~$ _
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 V1 f2 ?4 t1 D7 B( u6 M0 h else nReturn=GetExpValue(t, csym[0]);
9 d. Q0 m% g& P5 g3 I return nERR==-1?1:0;
: e$ W. k) R% L4 {, Z}}: D+ p9 Y" i) }. \8 a- d1 q% M9 d
- Z0 ~$ t/ h: d' L7 {! f( ]
9 f4 M' X3 y; R1 e) U% a. B# L( O8 n" E' @7 @
函数模板使用示例:1 Q) f* R% ^# d& {, O5 m
在以上那段代码的后面加上以下代码:! v" Q0 M. K' S, Q2 K$ r
% t2 M( ]% K: ~; g# U) e& s
8 s8 B: U* x+ K/ X: R2 T& v, e0 \: N& I8 j; w4 S& _
程序代码: 0 d0 {' W' \8 D: X) D1 N- ]
7 s1 ~+ O$ } _5 q3 ^: J3 o
#include<strstream>
7 y% I3 W0 i( H0 C" `' S5 y: O: E) y#include<iostream>: r$ A! M v: Q& |8 w. h
#include<string>
i$ c. W: |' I4 ]- c E9 p6 u3 d; Tusing namespace std;3 m5 G, H6 H) p; Q$ `6 d
int main(void)
$ p1 V& g3 n/ s& R{# P$ H3 ~- @/ Q, y' S0 b' Q, a9 [
string s1;
7 Z4 Y1 f* s! T3 ]0 P: y o while(cin>>s1)8 @- Z! h; L! ^% C
{
' T9 Y5 a% q# S% S- O6 i7 v istrstream isin(s1.data());. b, |& c- z4 [8 X
double d;
/ w" R! R7 k. V2 Z8 ^7 X if(fy_Exp::GetExpValue(isin, d))2 g6 J/ m* ~& o2 x: }9 G
{* p, E- f o, [- x9 \
cout<<d<<endl;
2 n+ G n& B* Q& I" u( x4 {9 d' m }
* U \, w3 x# P# [' T- l else
- Y" a2 `- O/ x" V4 S/ C {" S/ H' K* t- b5 O' Q& P) w$ d
cout<<"ERROR"<<endl;* C* [ D! O; y$ H
}
3 d4 O+ g- P; m7 O4 x8 I8 ~& u' t }
j! \* d" O" } return 0;& b' l9 b {3 k0 E0 }
}; S. a' W5 ?6 e5 ^; B& I, {) E
) u/ q7 | s* h* T
7 Z; \0 @* J2 P- D然后编译执行就可以了(*^_^*)
# Z% z* P5 S3 U' B* r1 O其它:TC++上一定编译错误,不保证在VC6上也能通过编译0 e, W# A7 k8 }$ j& ^0 e4 s
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|