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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,, ]* s# R; Y1 h* w5 W
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! G3 d& X9 s q# o r3 i+ N$ m; Q" [只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), A% j2 F+ G U7 w( i. \( Z; y) i
参数解释:3 N6 r+ z2 Z. G4 c# L4 V6 r$ A8 _
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) K$ }8 N6 @2 ` t4 T& |. H6 @
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
( j4 ^* q2 k/ B/ L2 \( J返回值:* j _+ t" [0 ]: R. }6 y
返回非0表示计算成功,0表示计算失败有错误6 w* a3 n7 @: z% x# D
9 @/ _) ? w* O t5 T9 l
* f7 g% \5 ?9 r! c0 T7 E
- e3 o4 h* _9 O+ s程序代码: 2 v9 T7 X5 o+ i* l! [# ~
& M5 U2 c' ^* c; @0 X3 w5 Wnamespace fy_Exp{% R. f5 j# h4 H- k! I- _' r& c
namespace {template <class _T>& V5 p( `5 U! _- d
inline _T GetExpValue(_T t[], char& csym){
2 F' P/ f" o* Q% u# f+ e& { char c=csym; csym=0;
7 v8 r% D! u9 l* V- A/ R switch(c){0 P7 J5 G8 @* N- d/ B
case '+':return t[0] += t[1];
5 p% B6 l3 A+ y7 H+ o: ^% E) v case '-':return t[0] -= t[1];
# p+ i" V* A, i case '*':return t[0] *= t[1];6 _% b0 t7 e' B* V" z1 l% H
default: return t[0] /= t[1];//case '/':
' X. J; O) [- J }
% ]2 a& `) B p; ^. S* l$ J8 ^7 l0 T; w}}
8 R) \: s6 L6 w) s1 ^) F' p( c" Gtemplate <class _T, class _Tstream>
; K' n" P% i! A" L/* _Tstream: inputstream, _T: get return value& P# V" L; q: l- w+ n; `
* Return nonzero if get value successfully */1 `' Q. m9 T- d1 B2 k7 H! m& `0 v, V
int GetExpValue(_Tstream& istrin, _T& nReturn){
3 R) P J4 m( P# W6 P _T t[3] = {0}; //雨中飞燕之作
& j- g- s- n7 |$ |7 S char csym[3] = "++";
' I3 y( B/ W. f+ K( H4 p int nLevel = 1, nERR = 0;
1 W" d" f G6 Y4 X( P if(!(istrin>>t[1]))istrin.clear();
' p3 G4 q$ n, A+ F8 E3 C for(;;){
5 }: p7 |/ @/ _& w$ q3 f7 {6 ` if(istrin>>csym[2]){
' O0 e4 Q5 a0 c( ^ switch(csym[2]){ ]; m g$ n- O# C, r. J" R U0 T
case '(':: W0 n4 k. }4 a3 O5 u
if(!csym[1]){nLevel=0x100; nERR=1;}else m/ X" q( ~3 [% a9 E
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;/ g# @4 J! c- C0 x6 k( N" J g
else{nLevel=0x100; nERR=1;}" k! z6 W6 i9 M% k# O
break;
3 q$ b9 |/ A( Q3 Y: Z0 ]& a3 h( b3 D case ')':3 F" e8 S6 s" x+ C0 Z Y7 k
{nLevel = 0x100;}break;; I8 E ]5 w) \0 F
case '+':case '-':case '*':case '/':2 L. L8 s* s: G7 E3 q
{csym[nLevel++] = csym[2];}break;
4 _/ J5 H& N& J# c case ' ':case '\r':case '\n':case '\t':continue;
. b2 A r; e: e1 Y$ r. c7 F default:
' ?- @* e( U4 @! w {nLevel=0x100; nERR=1;}7 ?/ I0 P7 f8 i- u1 R. h) t
}$ B h( E5 b1 j. G" C
if(nLevel==0x100)break;
( X. w9 o$ p9 y. h# [1 I if(nLevel&0x10 || istrin>>t[2]){
6 \' H: Q$ i( o2 Y" J nLevel &= 0xF;, E' ^/ a, C0 S: @, Z Y
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& [! C& P; f! x: p if(csym[1]=='*'||csym[1]=='/'){
" W, x! U& {( f5 e& ]' P% Y GetExpValue(t+1, csym[1]);. H$ K* {* R. Q
}1 E% u1 c. r! o8 D( X
else{" q) S R R- ]
GetExpValue(t, csym[0]);& T2 D. l; R0 q$ A8 L4 b" q7 ]
t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ U; P) V5 U; X* t' O
}
2 Q) C8 k# \, u' u8 D nLevel = 1;
& s5 X" I2 E& q, @1 v2 S3 m% Q4 L }( t; V! Z' V; N6 ^+ o; U# ~( _; ]
else istrin.clear();/ S4 K6 n" E) \7 J, m5 h* k3 k
}& U. C/ `7 }6 P) J) F) z
else{nERR = -1; break;}2 j+ b' n; [2 w0 Z
}6 ?) U. o8 v3 w0 I& f
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
+ B# a* ]6 } Z5 l else nReturn=GetExpValue(t, csym[0]);
* n" j( j$ P( i! q. U return nERR==-1?1:0;" e+ F! f3 G2 j+ N% n0 K# F: I
}}; ^3 X' z& f* {
' l& L0 w: \( x/ s( D6 u7 o+ G
' \7 X5 C* B* _* F8 B% M9 y; }; R% R [) e& G
函数模板使用示例:3 `3 I; L, L% d+ }
在以上那段代码的后面加上以下代码:
' q% U* j; D6 \- i" f* @; H6 v. i9 D! U* D7 }
V$ \0 X0 r0 C% T
' b! I- \ B0 N6 ^' J& N0 T程序代码: ! f& L/ N8 u0 A# f7 C# a
5 J' z& J7 S; u#include<strstream>9 N* a4 I0 `1 [$ N8 |
#include<iostream>
; _( e+ Q* t) P. r2 P; P4 K0 H#include<string>
4 Z9 d7 }% r/ |; i0 ousing namespace std;, w0 I0 i; P+ J
int main(void)! z. y4 h# C+ _ M
{* S( i3 I: J. ~5 w4 U' N% P
string s1;
1 R% d6 M+ f; W" ?) X, h3 [ while(cin>>s1)5 a# n# o4 `0 V; l. S" M$ i( L0 z) T
{
F3 M$ z5 J4 ]0 m& r istrstream isin(s1.data());/ D) Q! ?: ^8 z# D0 `& S/ e- U
double d;
1 j; p6 W: K4 |* D" u9 S7 i if(fy_Exp::GetExpValue(isin, d))
! x' X+ z p- @$ E) u {$ Y3 {, X% B- J- e5 L+ Z7 j% P
cout<<d<<endl;
/ D; q0 V5 t$ _% h }
& T9 W' s- s+ S7 f: Y else
9 d$ E1 R5 c' t9 e" N {
7 B1 ]) i3 ^0 @ cout<<"ERROR"<<endl;
* P6 w: Y" _+ o }2 p p+ ~6 G0 x# x7 A" y0 ^) C
}
% f `8 q8 N; | return 0;
1 n" T7 i) Z7 ]$ O, O- L( j}
" A& Z) G1 t. r1 V2 m
" | O9 J4 E Q0 A( q% L3 |8 B
8 o; ^5 V9 {1 @( ]2 h; K# o然后编译执行就可以了(*^_^*)
( Y, W! U4 z4 t, L+ N- G其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 I2 t9 K5 ^5 B% |
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|