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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
, G' B, R) \4 c7 O一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
; J$ V- V& {9 |5 F8 b2 F# X只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 Q* p& w( o- U/ N2 X. E* a2 ~参数解释:* a6 D1 X1 w% V: S
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 ~2 ~+ ~, [( f" [5 f# ]1 N6 ^' W
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* Q/ U: @2 k% x- G8 c9 ]) S
返回值:. }& t2 r/ B; l+ u+ x
返回非0表示计算成功,0表示计算失败有错误
- e9 M& W' }+ Y- c3 y7 {1 ^7 }
- c8 [- ~( |8 Z. k4 H, `# } . Z+ _; ?" O8 p4 d T
% k6 i% U3 _5 n, C' L+ w7 |3 c
程序代码:
4 r8 C* [/ }) t) `) Y3 J2 F
$ M6 t$ ] w9 |& Z4 E1 Ynamespace fy_Exp{
( a9 {; X3 {2 y0 s" Lnamespace {template <class _T>1 \* q# p5 A+ Y2 ^" U
inline _T GetExpValue(_T t[], char& csym){. a/ K# Y9 D v
char c=csym; csym=0;4 Y3 r* J* r) V4 ?" L9 Y/ |5 X
switch(c){
, ?1 I; f) G) f+ e2 _4 R case '+':return t[0] += t[1];; d7 r" v( R( s8 N' v( C
case '-':return t[0] -= t[1];, D; A, z0 @+ W' W0 `: g
case '*':return t[0] *= t[1];. R$ f: W" h$ @
default: return t[0] /= t[1];//case '/':
9 Q K, T c r: t }
1 k+ q5 w* V: R2 y6 {. L}}& l# F q2 o8 s! D
template <class _T, class _Tstream>% Z: h. B7 `: h) j2 m8 J' P4 ]# `
/* _Tstream: inputstream, _T: get return value
4 R3 C+ O A6 s3 d! C+ C* Return nonzero if get value successfully */' w4 X; t8 F8 E, V
int GetExpValue(_Tstream& istrin, _T& nReturn){
! @2 w7 Y, P, E1 a" Z; d3 Y _T t[3] = {0}; //雨中飞燕之作' q x9 P0 u. T$ Y7 `6 B
char csym[3] = "++";
! Z& a) `1 m7 \1 V int nLevel = 1, nERR = 0;
7 L9 _& A7 m2 c d0 E if(!(istrin>>t[1]))istrin.clear();
& C" A0 S( i, V for(;;){/ Y. |; I; n- `7 j/ {
if(istrin>>csym[2]){
$ ]4 e2 X, V! }2 A' }( r! a switch(csym[2]){9 U; p, s# y+ D, }2 a( P& F. z. C
case '(':
# e6 m" ]& ?8 n' G9 c- P6 u if(!csym[1]){nLevel=0x100; nERR=1;}else
+ [3 n5 O) _$ x* D if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( Y( Y. I4 R2 \1 k7 d$ j
else{nLevel=0x100; nERR=1;}
! N3 L3 _) C% A! W2 M0 F break;
) ?7 W. [# u. f case ')':: {0 ]0 x, K% [3 K" @8 S
{nLevel = 0x100;}break;
$ h, m) o: D" V% l* e5 g case '+':case '-':case '*':case '/':$ m4 P( E; ~+ m+ |0 J+ e5 Z
{csym[nLevel++] = csym[2];}break;
# l0 V$ w+ c# u5 `. S0 ~, ? case ' ':case '\r':case '\n':case '\t':continue;
* a1 }% ^2 s, ] default:
! s; `8 [0 N' Y* w0 l, f {nLevel=0x100; nERR=1;}4 t, j3 P$ H( @5 X
}
+ B" y, h! P- ^- K, d% n if(nLevel==0x100)break;
7 U( `" b- O- Q* { if(nLevel&0x10 || istrin>>t[2]){4 q) Z$ y, y' y0 R! ]$ \! g
nLevel &= 0xF;/ B6 m/ Q6 T" R$ U
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& R6 O* h4 m% I' S- h/ ? M if(csym[1]=='*'||csym[1]=='/'){: r* @+ P/ L, e9 q; H, h
GetExpValue(t+1, csym[1]);+ E& j6 r6 X% F% ~
}- u; r7 u6 f* G/ ]2 J$ U! }
else{
4 h3 v3 h: G4 Y* c- [ GetExpValue(t, csym[0]);" i! _# `. @3 l9 Y" m2 L5 i8 v
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
4 Y2 ~" B v& C A& l: \% J! F! v) I }! W# p2 f+ x1 y: w' v
nLevel = 1;9 k \, K# {1 P) c7 Q' X6 D
}8 k: d' H0 A9 M7 H: h% b# O# u# }
else istrin.clear();
: e3 _% U+ q G }
' }; r: a0 F6 B& L5 h else{nERR = -1; break;}
3 m- r0 g- }! y$ n6 { }
. }' K9 |$ V* v! s: _ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 X( s: \ f4 K! h$ j else nReturn=GetExpValue(t, csym[0]);4 P: r/ m3 ?" e% s& p7 H" M
return nERR==-1?1:0;2 l) y+ F( Y) t f# L
}}: l& y, q. i/ t4 A8 D J7 H) \, I
Z3 K, W: s# F6 }( D* a5 x- k' Q
' }& A3 t. u2 g
# z8 v) _* {/ ^; E6 }& U函数模板使用示例:
, G7 A5 ?, k$ ]9 } r& G% G在以上那段代码的后面加上以下代码:
& l- a! p4 O# U2 R" t( Z' x2 n$ q0 F+ i6 ~1 ]/ a3 i
$ u7 o" C' G6 p" {' [4 I% [
( x+ F- L% a- }( U1 ]- q程序代码:
- H& _. p4 s! Y# N3 F3 o' o% k1 p: C% c# ?
#include<strstream>
( f. L* Y0 g o#include<iostream>
( ^* ?5 Q5 s6 `, ^#include<string>8 f7 |) R6 D8 e% f$ ] M6 H
using namespace std;
; c& W* E7 _: I0 c* @int main(void)5 ]+ o8 A8 d* ~ o, I) B" B
{
' T P% q7 c" I2 |. C string s1;
4 H! E0 \5 }; K6 {- z while(cin>>s1)9 c' g5 T" z% S* x$ [* b1 z
{
. z* ]7 J! z7 v4 s+ J istrstream isin(s1.data());
! d) c- N6 C# o. ^% c0 I: `% F double d;8 s+ f* n! h' a2 z4 c
if(fy_Exp::GetExpValue(isin, d))' d6 O# j, M& d, G
{& U/ P$ m; X2 @, J2 q& `* e
cout<<d<<endl;; D* A6 [. F5 O
}+ S! t7 [, o) X7 j. M4 J
else
$ V6 Y E# z* Y! q) o! p {
# c, u8 z! W+ l/ ^( }6 n' g$ P cout<<"ERROR"<<endl;) Z4 b0 U0 d3 I* ^
}
6 l4 z, E" Z, I$ i& }4 V# ^ }
/ v7 }" v, d7 I. E return 0;% O# @ f# V5 L6 U/ i1 F
}2 h8 Y6 d7 P2 k: }
: I. Y2 d) e2 R' e' G) t' J
" B9 H: F0 \! E; n6 i! Q, ^
然后编译执行就可以了(*^_^*)5 R/ V& Y5 A9 B( Q) q4 ~* A5 a- e
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& M, X& f& m" e5 J N; `1 V 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|