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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,, ~ O* ?- O) g* K
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ l, L! X' o- j+ ~
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)# o4 h# K# d' T5 c# {
参数解释:, q& T" J% M8 B$ ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流# T2 E1 x0 K8 D1 C, F7 G; B
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定/ o& K) y) q5 t; w5 o6 u/ E
返回值:( Y% X. [/ [! S) t+ u; h
返回非0表示计算成功,0表示计算失败有错误# B8 n$ r! n( O* C( N
) ?3 `5 a/ q. J8 a0 G% ^2 Z2 \ 6 h7 }/ h# {1 [$ L, v( ^$ X
( s# g1 ]2 _, h程序代码:
! f4 d% ]! [4 x! Y, h2 |* N1 k2 H% m0 r& m5 y' P
namespace fy_Exp{4 e- L0 J6 A/ Z, y% U$ Z: X
namespace {template <class _T>
5 q- H, Q- ?/ a- C+ d& |: R9 |2 C: Finline _T GetExpValue(_T t[], char& csym){
( p- E2 S* C& g" x3 t6 s char c=csym; csym=0;( m% T* v9 A7 Q% s5 `- V
switch(c){; u2 T6 k5 F5 |4 z$ @% ?) N! m
case '+':return t[0] += t[1];
" d. V8 K& i8 g/ ? case '-':return t[0] -= t[1];$ a& [% t# u, C. D! \
case '*':return t[0] *= t[1];7 F9 Z1 p' Y% {% w# B8 o
default: return t[0] /= t[1];//case '/':
$ y! `$ j' |5 ~: O* e0 N8 K. g }0 d! q* o9 |1 j( ?/ _
}}: p3 B3 l$ h3 u% ]7 T& T1 B
template <class _T, class _Tstream>5 U% _9 m1 F& n8 y! K, `" V
/* _Tstream: inputstream, _T: get return value
7 ^7 i: H* a8 p: ?$ D% u* Return nonzero if get value successfully */
' X' D" m3 e* l( v& k& u9 w2 v& g& Gint GetExpValue(_Tstream& istrin, _T& nReturn){
- I5 Q% A R2 ^ O/ ? _T t[3] = {0}; //雨中飞燕之作
2 l' G- L! J) u @ char csym[3] = "++";
5 f4 G$ e7 o# e% ` int nLevel = 1, nERR = 0;: W9 g4 {* B8 L; e) A5 M
if(!(istrin>>t[1]))istrin.clear();
7 d4 U9 o y) p4 O8 } for(;;){) k% y2 m$ c5 x6 O, @
if(istrin>>csym[2]){
4 Z0 f6 f* m, R# t switch(csym[2]){9 a* k5 c9 E; f1 r# Z6 H5 r
case '(':
# z6 y' O3 g1 g) V" k7 i if(!csym[1]){nLevel=0x100; nERR=1;}else
9 i a- i0 B, r if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, x# M& z2 v) L* E8 M/ z8 f else{nLevel=0x100; nERR=1;}# F7 ?! _# b2 @6 {* a1 Z Q% y
break;
- ?4 ~) N/ b8 B9 D case ')':
- t! Y( e, n, p- ~( v1 T1 B {nLevel = 0x100;}break;+ J* B& I$ g6 f- Y( ~5 C
case '+':case '-':case '*':case '/':7 x0 Q5 v/ L; ~
{csym[nLevel++] = csym[2];}break;: P$ h9 Q5 E Y( A
case ' ':case '\r':case '\n':case '\t':continue;. {9 L% }- l) M! M7 {3 a; F
default:
4 |" P. Z* j, s/ j7 ~+ A" e {nLevel=0x100; nERR=1;}" V' q/ j* x+ X
}
, E# n1 w1 `; `- j if(nLevel==0x100)break;
& u( g! f' O B' u if(nLevel&0x10 || istrin>>t[2]){" f; o8 _3 @5 Y' f( O6 M& n
nLevel &= 0xF;; T' b, J% C: P+ c; x
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, B1 w3 t* Z9 j% `
if(csym[1]=='*'||csym[1]=='/'){: D: ]& V1 i8 Y4 f# K& u
GetExpValue(t+1, csym[1]);
1 l+ L3 r6 V) y4 I L" h: c+ Y }; h7 r) a4 q) J( {1 {; F
else{3 I1 A4 g, H; P4 V5 k
GetExpValue(t, csym[0]);7 U# t; P* z+ r
t[1]=t[2];csym[0]=csym[1];csym[1]=0;9 K' H% c4 p) ~) c
}
4 @& x {0 [* [ nLevel = 1;# C1 I! J1 l# [/ F5 Z
}- ^& Z7 S. r; ^2 T6 e2 O; Y& |, C
else istrin.clear();
2 A: ^2 e6 B% Q2 }5 t: W7 F7 p. j }4 ~! E' C. f) ^, `( s7 e
else{nERR = -1; break;}0 _8 c& I) T) a9 i+ d9 j2 m: ]
}5 p0 I6 w" p# u) L$ C4 p; @& J
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% b0 e) |. q( C; Q5 z
else nReturn=GetExpValue(t, csym[0]);
. o6 g0 c% J9 Q2 x* D% S; E return nERR==-1?1:0;
9 v) D) A- Y# z; l! |0 q J}}- B; X; ]+ e; x. g
/ z& V* A5 ?2 g. Z7 j& Q8 |0 G
, o2 J& b8 f) Z! h% p
p6 q3 K0 Y2 r4 c, O! _ }函数模板使用示例:# b$ w ~% L% O
在以上那段代码的后面加上以下代码:
6 t- R7 p- `" m' Q4 e7 ^/ I% e- R: d9 S9 ]' i X# L7 j- B7 ^8 C/ Q
! _ X6 ^# g; g" C9 H8 e2 O9 i6 ~- p* |. t" r
程序代码:
) d s' s* e/ Z
( ?" H9 o% ?2 l1 W4 }; C#include<strstream>- \7 L. x4 }: J# E
#include<iostream>
; x5 |* B4 ?# C+ z4 a#include<string>
% T0 @( z/ m1 lusing namespace std;
& I5 \$ \: A0 C* Kint main(void)' y3 r: r8 _$ S, L
{
, \* r8 ^3 i) K/ z3 i string s1;
* h& J4 G: p7 J( ] while(cin>>s1)
& U! ]* f4 u5 n3 }9 n+ K {
: e3 B. s7 |* C8 z istrstream isin(s1.data());: w$ V8 g2 O+ A! h: ]
double d;
; U% @! ]. o) c7 q' c if(fy_Exp::GetExpValue(isin, d))
; a3 s- }! @$ C/ w% `; l- \ I {
: c- _ S! w: j& j' E% A0 x cout<<d<<endl;
: r K6 u* ^! z2 ^" T }
4 t/ m+ ~1 }3 _6 k8 X9 X else0 D+ Z ^ \% r3 ]
{% r5 {7 z, {+ c: }9 I' W* q
cout<<"ERROR"<<endl;; p, @8 J6 H1 S i( k
}. z# t4 @0 \2 b
}
; Q8 |. Y' i; h return 0;
( L* H7 q, _, f4 d8 @8 n}6 [7 w% ?4 q d( n& B6 T# e3 _, X
( m- v. Z+ ^& b1 s5 T
; y9 V5 \% _! ]; L然后编译执行就可以了(*^_^*)
# H7 q* s& p" o3 L/ Y9 W$ {其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 P3 V& O$ m4 S
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|