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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
6 P4 `8 X8 H0 T& u一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 ^& k9 l: o, u% f* o8 Y2 E# z+ I只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn). X5 K) a0 n% K- c8 R
参数解释:: W) j4 O8 [) ^6 g1 B5 J' \
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 q) m6 [$ n2 Q3 l0 W( |$ R" c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: b6 C4 E2 ~: w$ r8 r) i+ c
返回值:# x3 F1 Z- O2 w: @* U; @8 o
返回非0表示计算成功,0表示计算失败有错误$ }6 w3 e! ?" K+ b" O: ?
5 ?4 |* e; i7 Y% L- Q0 y& R
, Z- V' i6 e3 R& G. A! T8 g
( u! c' v. L& Z! }# M: e# [+ |/ I程序代码:
! l" j, b# G) H" G4 L
m2 Y9 \& V5 X* V; v7 D! ?namespace fy_Exp{1 L$ e& A: u3 [
namespace {template <class _T>
: E: p/ D! b- binline _T GetExpValue(_T t[], char& csym){
, e1 n8 ~8 _. _0 f3 n char c=csym; csym=0;
! g0 D# W( z0 P switch(c){
& m( o! }9 K4 i case '+':return t[0] += t[1];
4 o) d3 ~9 Z8 W F# O, | case '-':return t[0] -= t[1];
* O$ b# F* X# X2 a- G: L3 F- I8 u case '*':return t[0] *= t[1];. u3 e& w. M8 H/ ?* D9 i7 T' s
default: return t[0] /= t[1];//case '/':
: Y8 d/ S+ ]8 @, [" Z( h }
% K |1 ^$ N+ W0 ^, y: B W. g- a}}
+ c+ {! Q5 F1 I- S" ?) F9 L Stemplate <class _T, class _Tstream>) i" |& U0 J3 M+ k
/* _Tstream: inputstream, _T: get return value
2 c) p6 n( J$ R: z( V- e* Return nonzero if get value successfully */. C7 m3 E" g9 Y: K
int GetExpValue(_Tstream& istrin, _T& nReturn){
" w% @ q, a b$ | _T t[3] = {0}; //雨中飞燕之作3 U1 d7 A" R$ R, S
char csym[3] = "++";
% N4 u- N% k( u int nLevel = 1, nERR = 0;
; g4 D9 |( Y8 N3 }* _: I& z8 S! J if(!(istrin>>t[1]))istrin.clear();5 _$ O9 B& O0 H% Z. W' t: A
for(;;){. |, I6 u6 b) H- ? A7 b/ ~* x
if(istrin>>csym[2]){
5 f9 m/ p4 p/ I8 ` switch(csym[2]){
5 h- P8 ?4 N* t& I+ |! l F" \ case '(':
& g Y' I5 O# n, e I5 E* f8 O if(!csym[1]){nLevel=0x100; nERR=1;}else: @3 j, y8 g Q' P1 {2 E) W* K
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, l) |* Z) ~2 v; j0 I$ ~
else{nLevel=0x100; nERR=1;}) N1 l x0 a+ T- T G0 e4 L
break;5 B% G6 d3 e8 K3 t2 _' l
case ')':- D/ Z5 f4 b& ]* Q3 K$ J
{nLevel = 0x100;}break;7 o! j' Q! X1 m) ^2 @3 v8 L
case '+':case '-':case '*':case '/':' U; ` E6 [' R: ?2 d5 P/ W
{csym[nLevel++] = csym[2];}break;" r! X6 {+ ]3 F; r
case ' ':case '\r':case '\n':case '\t':continue;( Y5 s6 {7 R. X/ X# S
default:
6 d7 x @, i# I% e9 a {nLevel=0x100; nERR=1;}1 y: \+ d, Q* E( Q5 F
}
+ C0 j, k) h( h& p- G if(nLevel==0x100)break;* l$ b7 J8 D" c+ A/ I, f
if(nLevel&0x10 || istrin>>t[2]){* T W; V9 e) b- B5 B; C
nLevel &= 0xF;' E" R% b7 X0 M9 P+ N+ O/ H9 k
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
( `9 k# ]8 T2 G( | B8 J if(csym[1]=='*'||csym[1]=='/'){5 C# J7 B4 O0 }- N
GetExpValue(t+1, csym[1]);% Y& M( \& ?* h! O9 B0 s7 G
}9 g; ?- ], p8 {0 j; c
else{; r. w, U' b, B5 N
GetExpValue(t, csym[0]);! N8 ]1 K4 u1 A' D6 N) ?1 g
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
, b6 c6 N/ j# ~ }
) Q) M) i: k, \/ ]% D nLevel = 1;% L- g( g+ y. A
}/ d$ N/ w5 _) }
else istrin.clear();
8 s: F2 F9 U4 c9 P, }. [ }4 K7 k# H4 Z* X) \: a3 }
else{nERR = -1; break;}& u4 W* z- k& w$ d9 ?( b
}
: h/ }0 r z8 t/ u# f if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' E; t7 g6 F: |+ y6 L else nReturn=GetExpValue(t, csym[0]);5 l4 u/ p: I }7 |/ C) x
return nERR==-1?1:0;* Q0 ^8 z" B$ ^) t5 e
}}
. Q1 d9 R* h6 b( `; [# K7 }9 J2 k r
0 ^! t( c8 \* U& v
9 |1 D3 r* y/ y! g% Q) [" A4 R$ f函数模板使用示例:
$ W2 K6 s, m# ~9 v! Z% c' k t在以上那段代码的后面加上以下代码:
% H" c0 n _7 {1 [
1 V3 ]$ [3 H$ l( W& e1 O2 f
- G8 r- R2 o/ ]1 e8 N+ i1 B1 r a, D, a* t) n4 [/ x
程序代码: . J8 [. L2 }$ u" j9 {
- G3 i! R. w$ _
#include<strstream>
5 N% K1 v' d. G. j, k- M& A#include<iostream>
3 m' i( D' [2 z# A* C$ X#include<string>
7 Q+ o* `! ^) C+ M: U6 k1 zusing namespace std;3 r5 R, l% R, J* s
int main(void)1 q W# x7 R( U+ T/ d. K
{* T/ Z7 z. D4 C6 p/ C5 y) ~
string s1;# A0 j: b, k* b# S- u. d
while(cin>>s1)
7 i3 ]6 z; y, ]$ Y {1 M5 t% \# l! c! ^$ k
istrstream isin(s1.data());$ |/ k9 ]2 q, D: ], r: k
double d;
# }2 v4 K* w% n' r if(fy_Exp::GetExpValue(isin, d))
7 l: I7 z# r! {8 A6 c( d4 } {
5 D! d3 t7 \4 [$ Q" N: T+ i cout<<d<<endl;
% d; m' z& K* S2 q; E }
- |4 G7 n7 w% r6 P! l; Z else0 \; D6 F" [+ U7 E( H' ]
{
% G7 e6 i% l& P4 Y/ C! D cout<<"ERROR"<<endl;
$ B- m: Y* s$ ^5 I* A4 b3 i }
& D) m' x! R/ r% n. p3 [; F% X }, ]+ O- H0 f; L0 Q3 |1 w: B2 \
return 0;
7 X, @9 b+ \' ?3 x+ o}
. Q, i5 ~- v; |4 z6 d, ~4 F/ `# y, G- }. q# }# K
9 y4 v: U0 y H" [7 e$ r3 b, P& S1 Q然后编译执行就可以了(*^_^*): @7 n0 R: l. [# I% b2 U, \6 q
其它:TC++上一定编译错误,不保证在VC6上也能通过编译5 k3 R3 S; o4 ]0 b
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|