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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
6 D9 j! }8 x8 C" B5 p/ a; J一个很方便的函数模板,可以并且只可以计算含括号的四则表达式( Q; N% ~7 a# Z2 f$ f0 q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn). v+ B5 {" h$ F/ g: j
参数解释:
* N `8 [/ ?2 v, D( wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# B: ]% O* X4 y# W* Z7 ?& [nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
; M+ t2 p( ~, e# W; S' _返回值:. [0 R7 n- G8 @. Y, q
返回非0表示计算成功,0表示计算失败有错误
! o: b4 H& P, W8 e) G) f3 u- ]: ~0 |9 p/ @
2 W$ Z) J* y5 l/ m* P7 P
- ?3 {) j, Z0 Q6 d) M/ J w
程序代码:
7 b# I$ N" x+ A5 Q
$ l8 L- L5 ?! j- B3 G2 Enamespace fy_Exp{
8 S, h9 W3 z# U8 D2 enamespace {template <class _T>! l8 |2 ]$ f+ b$ ]. J% d* H
inline _T GetExpValue(_T t[], char& csym){4 a/ f" G# h5 e9 R) @* y+ J; q) C) k
char c=csym; csym=0;4 O% V! q% p$ V- z2 ?; o) ]: E3 X
switch(c){: U3 N6 C! g- x2 M1 f! ^1 b
case '+':return t[0] += t[1];+ d0 ^; V: s3 l9 X
case '-':return t[0] -= t[1];
, {* w+ C: X* M9 h( I% P case '*':return t[0] *= t[1];
) X/ }& F1 W; [2 P$ @; N default: return t[0] /= t[1];//case '/':
9 @2 L/ D- I7 s! S b$ @* u+ s2 G! i) |- | }
2 o- K' t& X: w# \2 ^: d}}
5 U/ _$ v& R: c+ n8 stemplate <class _T, class _Tstream>
1 t$ w( F; ]" q/* _Tstream: inputstream, _T: get return value9 K) z+ t$ g R6 ^) ]
* Return nonzero if get value successfully */
; p( I- Z0 u$ ?" x. E# o4 U) dint GetExpValue(_Tstream& istrin, _T& nReturn){
& G: G# c6 N4 ]: S8 j _T t[3] = {0}; //雨中飞燕之作
9 c" g! D2 V* V6 S* t7 t3 F! ^ char csym[3] = "++";# `* x2 y; c( e2 A6 C8 d( Y6 ~- E* I
int nLevel = 1, nERR = 0;
+ W" ]2 v- x+ o1 h7 C7 T if(!(istrin>>t[1]))istrin.clear();4 n5 c$ o9 u) ~2 e
for(;;){" i$ `; s( p) }" D! P
if(istrin>>csym[2]){
- Q$ R1 j" p4 ], `5 \3 M( G$ R0 s switch(csym[2]){
{+ G2 m0 J. i: u, s7 y) U case '(':$ N- q( @7 C) a
if(!csym[1]){nLevel=0x100; nERR=1;}else, \3 K+ W- r/ B1 ?* I* F
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 B9 _0 q/ |1 d; ?& z
else{nLevel=0x100; nERR=1;}
& k* F" J/ i _# \ break;
9 ~5 f, M* I* u9 a4 ? case ')':, E% E5 k& M6 O/ O. D
{nLevel = 0x100;}break;
( y* S& g( b" b& y% Z& `+ R case '+':case '-':case '*':case '/':
W/ b9 I9 x: ]" Z' \9 @! I {csym[nLevel++] = csym[2];}break;
9 ~; `3 {' c! ?* O case ' ':case '\r':case '\n':case '\t':continue;
5 L) a7 `' ], w# _9 M$ h3 X default:& Y2 T- O, T O
{nLevel=0x100; nERR=1;}
4 \: V+ e' i- @. P; d9 t2 ^, _6 e }
9 o+ t1 k: Y6 Y if(nLevel==0x100)break;
# ^9 n9 f% s* h. w' l4 l2 F if(nLevel&0x10 || istrin>>t[2]){' L& x2 Q* S, H; }: w
nLevel &= 0xF;+ V8 h1 L; K6 N3 p# K) ]1 i* l: }
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 m! e* K+ A$ c3 q# s$ \# V if(csym[1]=='*'||csym[1]=='/'){
$ M8 F& j I6 \- p8 a. c$ b3 | GetExpValue(t+1, csym[1]);2 S1 J' S5 t' F
}
' }, o# `9 \- r! Z else{
) Q8 a3 c1 ]. s# u GetExpValue(t, csym[0]);
" p+ G) W4 V: ] }: J$ M t[1]=t[2];csym[0]=csym[1];csym[1]=0;% c( P! C; o! ] E% D( n
}
" K# |3 H9 t+ F nLevel = 1;+ {: f6 a1 I" ^' `( p: ^
}* r. q8 J5 O! I- r" v" c8 I
else istrin.clear();) x) k4 `0 q: Q( Z) b
}
) `- ?, n) w( @. @' \ else{nERR = -1; break;}* }: P$ d4 r2 ]; s/ z& s% T, y) @
}/ P4 `+ J/ x* K4 p1 J2 D& H
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);' F- }& B b: A, J3 l+ X
else nReturn=GetExpValue(t, csym[0]);7 g3 o% \0 O( p* z
return nERR==-1?1:0;
3 H, o' f; y- V6 U% }}}
' _, E# F0 g6 a$ ]% A. g }. X7 M
! @6 S* C* X; X; t. _& t; f7 V4 R
( R+ ?4 B% e0 Q7 r9 E8 w& v! M函数模板使用示例:
) p5 }: l {1 N) j0 n在以上那段代码的后面加上以下代码:
7 N( X! c( v+ A; t- r8 G ^- Q- I7 {0 G s# U7 ~) K8 @
$ r& s9 b, E# g q* K* g& X8 E5 |
. S$ P! o/ H& L! x! a; u' D程序代码:
" d* E! Y- e4 k) ~) y+ [" k7 ^1 M
#include<strstream>
; V8 M- B1 a9 E1 r#include<iostream>
7 ?% N* m( }; c/ q( S4 x#include<string>$ X" H$ G- i8 y. ]) e! C
using namespace std;" h/ s0 `* `! {* i C" u
int main(void)8 ?1 l( x) O5 {
{
5 H$ M, J- C" A! O$ l7 S( g. d' ]6 ^8 F string s1;+ w$ K/ D# @$ | R/ |
while(cin>>s1) V( p( f: B6 I+ m ~# z y+ L
{" Y' ]) W" o$ ?* N5 ^
istrstream isin(s1.data());" B: P8 Z; l f$ w
double d;; n% f/ d! l/ o1 y; O1 W w
if(fy_Exp::GetExpValue(isin, d))
# ~7 n1 J. P* Z3 Y& z {
$ @. M& [' r( Y cout<<d<<endl;
( Y6 U' Z+ x; e/ \ }
# p% a2 Z; f+ f7 v else( A' q- t/ W# S
{
( z, X7 ^) s; |- T3 q9 l cout<<"ERROR"<<endl;' w. {7 t8 V( W+ y
}
8 `3 U; w+ Q* [5 l$ m- C. N4 w* c }
& V. g4 W @$ k( B" Q% ~- ]& i+ J return 0;
; a2 z% k: u( e+ i' |* O; W0 N. ~}3 x4 Z+ s, U% K0 s4 `
1 m+ }. t: h+ o" \4 b6 _
( T; D; f6 }7 r% i1 ]然后编译执行就可以了(*^_^*)- ~, y# g) O/ m" V
其它:TC++上一定编译错误,不保证在VC6上也能通过编译( d+ B4 ]5 | N1 @$ F3 t( D
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|