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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
0 o) ?. N2 q) K* c' r5 N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" S! _% X7 n6 H$ ~; X5 \8 l只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' D$ }1 v, d- I
参数解释:, e9 p. j7 G A# ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流1 ~* _% i3 h8 [' D
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( h& Y+ B) e! L" t3 B/ A3 D8 ?+ a
返回值:
7 `: b! Z3 t7 \1 J) W7 ~返回非0表示计算成功,0表示计算失败有错误
' I1 o& l9 d2 ^; G4 X! N
* ? ?0 ^/ Z; a
9 p) h6 S5 y. V. z
; ?; j& s. O$ b5 Z7 u! d. Y程序代码:
0 C; _2 G L; z5 f' g+ [9 `9 j/ [
namespace fy_Exp{
) L% `0 R1 `- {, ^2 t6 F# bnamespace {template <class _T>6 E. e z2 Q6 X$ [, g! ?) @
inline _T GetExpValue(_T t[], char& csym){
) o. u, p% M3 I6 K char c=csym; csym=0;
5 O+ ~( V0 i4 n% u* A* h switch(c){
, F( C. W W" p& v- e0 h case '+':return t[0] += t[1];
2 G) `& i+ ~6 `. V2 L+ ] case '-':return t[0] -= t[1];- N4 o* }. j. |5 q" m R% ~* g
case '*':return t[0] *= t[1];3 J: H0 P5 Q. s1 Z% j H
default: return t[0] /= t[1];//case '/':$ @' T, f' _: v- n. m0 a9 Z
}1 i* w, I9 b" y' [6 G& n6 l; u
}}
( U% r8 g; z* U3 Z0 \template <class _T, class _Tstream>* I0 e @7 b% @
/* _Tstream: inputstream, _T: get return value/ U3 V+ }! i$ T
* Return nonzero if get value successfully */
6 I. }6 I3 Q& }( K) e* x/ y Zint GetExpValue(_Tstream& istrin, _T& nReturn){% `- n6 t8 a N* _( l
_T t[3] = {0}; //雨中飞燕之作
" Z1 M% a. `. M. T* m7 P char csym[3] = "++";- W2 H0 Q. K5 ^; W- W
int nLevel = 1, nERR = 0;
% o7 _. w, e c- v: K& P0 [ if(!(istrin>>t[1]))istrin.clear();0 t+ c0 F" `( p2 S6 D1 V1 r) B
for(;;){
( u8 T f! t5 M" `0 |4 b V' { if(istrin>>csym[2]){3 e3 |7 _8 ?# i3 Q7 ]; _
switch(csym[2]){
4 `6 h7 k; }1 C1 X5 h case '(':
4 d+ P- r) u9 @. ~. n if(!csym[1]){nLevel=0x100; nERR=1;}else
# l+ E; c! V7 R) m- n if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 i2 f2 {0 c0 G. q( E# [
else{nLevel=0x100; nERR=1;}" z b+ q( @9 f& D
break;
- f. o, [, P/ ^$ S! } case ')': @7 Z, V0 S) d9 ]. A1 v
{nLevel = 0x100;}break;3 ~% X6 p6 H( Q7 c
case '+':case '-':case '*':case '/':. `" K& F9 s! ~7 J" B2 P' p& z( E
{csym[nLevel++] = csym[2];}break;1 J5 ^) Y7 P2 j/ X6 {8 K& Q
case ' ':case '\r':case '\n':case '\t':continue;
! U0 q3 [" E7 K default: @) O* F6 {; @" J6 a
{nLevel=0x100; nERR=1;}/ |: W8 j! ?5 v& {2 \; X! W) r' ]
}
- y* r; O/ K: Z' [ if(nLevel==0x100)break;
7 Q4 Z9 q9 w* M) K: } if(nLevel&0x10 || istrin>>t[2]){' }' ~" k! P8 ^* z7 `2 Y6 E* X( f
nLevel &= 0xF;
\2 ]8 m/ @4 ^ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. d; v; R Z- |
if(csym[1]=='*'||csym[1]=='/'){. Z' [6 v% P! P* I( m- J% T8 _
GetExpValue(t+1, csym[1]);. f, q, W" |2 B
}
5 ~* V1 \# [# P else{
7 e$ }- ^3 W& g" q n GetExpValue(t, csym[0]);
; }% Q6 C- v# L t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ C# y D9 @( P# k) F; E2 c }
: g* I' S# U1 ?2 e9 ^' f, w) e nLevel = 1;
4 ?0 i! M' n8 P$ y3 L/ D }
8 @2 V5 B2 B3 r$ ~1 o else istrin.clear();
6 X" H3 F( `7 V3 m7 y }% [- ?: n/ n$ H- ^) x
else{nERR = -1; break;}$ B# h& R% a M9 ?! F: p" x" N6 a; Z
}
+ F# Q; L4 C: f. f' C if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);, q) q( s) M: s! {# E
else nReturn=GetExpValue(t, csym[0]);( E( Q9 |! H# `
return nERR==-1?1:0;" y/ H; `2 D3 A8 s' x. a. A/ @
}}" \3 \& V+ i( y7 ^' ]( `/ Z) Z, I
1 U4 y9 E u1 a: N- f" z" {
7 ~% c, T- }3 _- ~
) v# G) w& {% h3 m函数模板使用示例:
+ [6 E2 ?0 \ i2 H在以上那段代码的后面加上以下代码:
( [$ Q. V5 u- M7 I% Z0 x2 [9 O2 }1 k% O* Y$ [; `. n1 R) o. A
; B- M+ q8 m8 d5 a7 S* l4 k: v6 I4 p) R5 R, \$ n4 ?/ e( Y" R$ ^
程序代码:
/ h2 I' h) r7 m5 n
* m4 \/ N9 m5 M#include<strstream>
! ?# b: [; Y* O( t#include<iostream>3 [$ [( b0 S( t& K0 m7 Q
#include<string>
- o$ M1 X4 j; v* w' Busing namespace std;
0 B) P/ I) d* p9 n3 ^int main(void)
8 E K) _% U7 Q' c6 }{
, U& `; |& G$ A5 S2 P; G string s1;% j" p" o: W) C) Q1 U
while(cin>>s1). x! C5 {( t: z# g8 X9 H
{
# C3 K( x# H* g& r8 M istrstream isin(s1.data());: c! w6 l5 l& b5 R
double d;
' A9 L9 W& I3 b1 ~ if(fy_Exp::GetExpValue(isin, d))* w8 L4 }7 F/ _& @9 D
{% n4 O4 J" Y. W! s7 X
cout<<d<<endl;
" @. Z. i; B4 O b3 _- o) H }6 d* X; c6 R$ K5 S Q7 l' o! a
else- L. _% w. [& S' ]$ z2 e7 \6 v, X
{
a( Q' [7 z3 ?& \% i cout<<"ERROR"<<endl;
% H0 e% l- N/ N) R5 F) s1 G }$ A1 h/ x! \' l( ?3 k! y
}9 U0 C+ M( h- d0 y( I# W
return 0;9 s4 G- L0 G( s: R6 U' v q
}
" _# m9 a) `/ A3 g @! |: A; `; E, O7 h# u8 F6 L- i
7 g' `* D" m. @! b2 p( o+ v
然后编译执行就可以了(*^_^*)* C6 M2 G9 D! u3 W* P5 T
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
$ N2 s5 O+ e t" T 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|