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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,- h% Q q; Q% @1 ~) ]( W
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! s: h" {: L# o# S \ H只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
+ R9 x+ [" T9 }+ d6 e4 @参数解释:
$ O. Q3 F1 f$ [4 ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: L/ w( B, X6 h6 W7 v1 O4 R2 C& rnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" t& P, n$ s2 }0 W& }4 } {# M" F
返回值:! O% p0 P6 o$ R8 M; O
返回非0表示计算成功,0表示计算失败有错误9 S4 I5 w0 y/ D b+ G/ w5 D4 N O* ?
# p7 Q5 ], ]+ J
9 J, N9 j6 G8 [7 f" A/ ]; v
1 t6 i9 {7 T: J程序代码:
, t" i1 [4 p0 d1 i* u Q) s
( g8 R6 @& Y2 C2 rnamespace fy_Exp{
4 ^, D3 d( f8 O, N% Mnamespace {template <class _T>
0 V- Z; c, f7 M9 E6 O, O: ginline _T GetExpValue(_T t[], char& csym){; ] ^3 X; ~9 i) H- u# {
char c=csym; csym=0;
( r0 Y; P0 h( w# r3 N switch(c){0 q) r5 I% [4 a6 H" y% I$ R
case '+':return t[0] += t[1];" @! V h! C) n
case '-':return t[0] -= t[1];7 ?( G- f# t# U4 P8 _3 S
case '*':return t[0] *= t[1];7 E1 n" A b* Y8 a5 i
default: return t[0] /= t[1];//case '/':& g6 U1 @, h* b# b% i# L
}# v; {1 ^1 R- G# d: e% q7 T
}}
9 ]9 M8 h" C: z* R, J. I2 wtemplate <class _T, class _Tstream>* V% B5 l) ^5 E: E8 }7 e
/* _Tstream: inputstream, _T: get return value
; P7 o" @6 G) B: R, e* Return nonzero if get value successfully */+ k$ m I% n4 ?- Z
int GetExpValue(_Tstream& istrin, _T& nReturn){* n1 L& ]& Z/ H* {" h- v9 t( s0 |- H* b
_T t[3] = {0}; //雨中飞燕之作1 P& ^1 A# A6 G: A
char csym[3] = "++";7 |- p( ?. L/ e, j& I
int nLevel = 1, nERR = 0;
: p2 O" F. L: F$ c. Z0 u* _7 ~ if(!(istrin>>t[1]))istrin.clear();3 @# ?& R" Q8 o
for(;;){, q; N- t+ p2 p0 U) L
if(istrin>>csym[2]){* Q& X6 }# ^2 o N" g7 F
switch(csym[2]){- M- U5 a5 k; {( }6 F; X: t, w( O$ |
case '(':
, m2 f) {; b0 G# b2 \7 `# j if(!csym[1]){nLevel=0x100; nERR=1;}else, W8 | G1 S$ i/ A7 `
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: h: ?! k3 Z/ f! N b
else{nLevel=0x100; nERR=1;} D% y! U* { \5 U$ k' B/ m" ?
break;6 K, q( G5 k( }/ [8 T1 F
case ')':
( S0 u. W R1 q2 A {nLevel = 0x100;}break;3 {* J1 `" F" a" n6 C# V
case '+':case '-':case '*':case '/':
* m7 y9 [$ W& M {csym[nLevel++] = csym[2];}break;
. A& L3 X9 a5 T3 ?* J case ' ':case '\r':case '\n':case '\t':continue;0 H& `" x& o. z
default:
% o: E' k9 K. f4 H$ g4 W {nLevel=0x100; nERR=1;}& O: j, l' l0 x
}
- i- b& |" @. X0 q7 Q1 e8 ?& D if(nLevel==0x100)break;! D1 _( H/ I) V L" r$ G
if(nLevel&0x10 || istrin>>t[2]){
/ y& }4 M7 h. i" ^3 Q7 c( m nLevel &= 0xF;5 O* G# t% d2 k( Z$ Z' N( m
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 g& c l- j' C/ r. y. C. R7 R; s if(csym[1]=='*'||csym[1]=='/'){
; s u( V+ Q+ G" t4 U' S3 [1 Z) B7 m GetExpValue(t+1, csym[1]);
" c6 V8 ]. ^* I @ }7 G7 X- R; C% @
else{ K5 r4 {& ?7 J, Z
GetExpValue(t, csym[0]);
% u2 L: j; ]+ e# D- v; K, P7 e* @ t[1]=t[2];csym[0]=csym[1];csym[1]=0;: I7 B% \3 ?/ _. H. Q! _. ?
}# q& `3 _7 N( F5 A
nLevel = 1;1 W$ u$ k* v. w2 ^
}
" R" |6 v. Y$ h- X/ v2 _ else istrin.clear();
6 k$ w& t% v% X }
4 j2 w+ K3 {9 N8 a6 Z, t/ m3 w F else{nERR = -1; break;}
$ M, r2 A% b+ ?* p. B }5 p* M% H9 X8 p
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 V2 c I6 e% E- \( f else nReturn=GetExpValue(t, csym[0]);
1 g s( _ ~ g; d, {3 ~$ I3 q' T return nERR==-1?1:0;
/ A4 m _) o2 G& l# l8 H& `}}+ N2 }' X# X' Q- k
" k5 `, z+ l3 d: M. i! C0 h, R) f
8 h; n2 l! h% V4 C, o! h函数模板使用示例:3 {+ g5 v* m. ~) W; S5 e- g
在以上那段代码的后面加上以下代码:
. h4 F, i* s' W* L& |
: `5 f5 `2 @) ~- I) @: ^+ n: N # r0 Z( o" r; \/ k
4 |. y6 ]- [* m1 {- V4 e8 w程序代码:
& l. v d/ ]& L/ n1 n9 i8 ^/ ?3 ~( g5 D7 o: _& d; G/ z
#include<strstream>
# A8 |8 o$ W* ~& p#include<iostream>
% I, F* _; b1 V) `#include<string>
- C5 B, f7 A+ |: b, qusing namespace std;3 t4 J% @4 U5 p( `- b2 @5 |
int main(void)
- I N* \) h- ?* [& c{
0 j" a! W+ r! h1 H# W4 Y6 J string s1;
" i' J2 D0 h2 G' p) W while(cin>>s1); @. S4 l% v* ]% x9 u! y
{5 y. f2 I2 |+ v9 F! ]* A+ ?: f
istrstream isin(s1.data());* H/ v+ O' h; F5 n. P5 e. }
double d;: F: }* ^' S! R: p5 s8 O* ]% y8 z
if(fy_Exp::GetExpValue(isin, d))4 m$ i0 m7 F4 R) q4 e# ]
{
8 E& {) Q, y1 K4 K5 |7 Y! L4 y cout<<d<<endl;
m; |/ W) H+ \ }& k. F/ I' Q& I( a V9 Z
else
( n6 d2 @, {) l {
; I8 w) g# ~. ]+ D* q5 M: r' ?7 H" i cout<<"ERROR"<<endl;
; B. n# Y+ U# ^ }* D6 n* R& U- K
}9 B( P, h; a* ? e, X- m" S3 K- f
return 0;. B/ ?' R+ a1 D9 u q9 b v4 D
}
' i0 N5 [7 Y% U) C3 l
( l7 P9 J8 W% s- U' K# Q0 @
* \ _* @( Y$ ]& |; y' l9 p z然后编译执行就可以了(*^_^*)
7 j9 g2 t5 x, \* j( `其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 U( V8 s9 C7 l+ D: ? 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|