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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,1 ~, C7 L/ G' }8 W2 s- a
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ ^9 `0 a) R/ q r R* n( J; F* z
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)9 _! ?: j# F& j: B7 I5 p* T
参数解释:
4 l1 H+ u# C! Fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
) c3 n$ m- W+ M% SnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定 Y' O+ n9 z1 N+ \
返回值:5 l4 ^/ `, P) D( A: {4 k9 L6 [
返回非0表示计算成功,0表示计算失败有错误
* j3 k) D, @; U1 o9 o
/ L/ U, L) z c" A5 j. }
2 A1 n( t$ l% @. F+ y+ R3 b
: H. ~; E: |0 e) F8 h/ A程序代码: 4 P' k: L: u7 ^+ Y
) \2 Z5 ~; H8 Q$ G5 w; \5 |* y9 fnamespace fy_Exp{$ R3 V& P3 s. A& T; d* s4 A
namespace {template <class _T>& l/ B2 _ k. @# O0 l
inline _T GetExpValue(_T t[], char& csym){( s+ H( ]3 s Y F
char c=csym; csym=0;
: y+ f9 [; S/ ^* u1 g switch(c){9 J2 i+ } M( q) ~5 x
case '+':return t[0] += t[1];5 u/ o$ @1 R6 U
case '-':return t[0] -= t[1];
. w- y1 b6 t \& D/ b case '*':return t[0] *= t[1];8 \% y9 G1 M! S5 r0 R1 I0 _4 v
default: return t[0] /= t[1];//case '/': z7 B0 y+ j5 L
}
_- o( _- H! H* q}}
* J$ A. N9 v5 u. dtemplate <class _T, class _Tstream>
+ T5 _5 K- y0 O9 z& l! T/* _Tstream: inputstream, _T: get return value# G! j6 q! R# W
* Return nonzero if get value successfully */
0 a7 P$ A g% q; Jint GetExpValue(_Tstream& istrin, _T& nReturn){
% W" i' }6 J1 ? K _T t[3] = {0}; //雨中飞燕之作
( A5 I9 V+ u; d/ _; [: W char csym[3] = "++"; |. S2 _6 ^- q
int nLevel = 1, nERR = 0;
1 Y1 ?* m7 t& ` if(!(istrin>>t[1]))istrin.clear();9 Q$ g! ?- [' K. t" y* K
for(;;){
5 t3 w" a' r% O! m [- X6 z if(istrin>>csym[2]){
2 o! c, d, p; S6 P# g switch(csym[2]){% I# q5 Y( G0 T" R8 K
case '(':" S) ]1 `) C$ z- W% q) g
if(!csym[1]){nLevel=0x100; nERR=1;}else1 r2 c3 w* |- f- C" `. ^
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 e1 s; p8 W( t% d7 B+ q else{nLevel=0x100; nERR=1;}
8 H8 c' ^' ?+ m4 F break;6 B: d: h: T) w" |" n6 V/ J3 Q
case ')':5 N# O: F! `/ H& {; y( N* n
{nLevel = 0x100;}break;% H/ I/ ^+ P P0 \
case '+':case '-':case '*':case '/':
( p0 Y7 d* r: @: w7 _! ]5 m# h% B) | {csym[nLevel++] = csym[2];}break;
5 c! G4 g. X3 c9 T; U! y case ' ':case '\r':case '\n':case '\t':continue;
; R5 `1 q1 L! f0 j# n default:' d& G- d! U+ J1 j( ^
{nLevel=0x100; nERR=1;}) D( I" ~& i ?) A+ Q: B! \
}9 I. L3 K& E& |/ S
if(nLevel==0x100)break;/ I% S5 C6 j4 u; u1 w. V/ U0 T2 w6 d/ X
if(nLevel&0x10 || istrin>>t[2]){
9 a, ~1 {+ O# |6 y! z6 S- d* M& | nLevel &= 0xF;" K h- p: M) u" y
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}% |# z. o( s3 A- {$ M
if(csym[1]=='*'||csym[1]=='/'){ |' A8 i, ?2 n' C. k+ E) C
GetExpValue(t+1, csym[1]);
& ~6 ?' T( B9 \' `+ h }
9 h7 D' J, d; C( d: C else{
' s9 r. f6 r% t) v7 \* i: C GetExpValue(t, csym[0]);
1 p' l" \1 w; G t[1]=t[2];csym[0]=csym[1];csym[1]=0;: X3 e& p/ O: h8 i$ v7 [; D9 W4 F
}5 Q* o' ^# L; j: V
nLevel = 1;* t# ]& q7 u7 ]0 D" w* X9 t
}2 Y f T( c& [8 Q! r1 W5 u2 F
else istrin.clear();: s0 b& W: E" s! p. |2 o, U
}! S0 Z% Q( X$ F5 D/ r
else{nERR = -1; break;}) m7 D2 ~1 N+ z7 o
}
2 P0 d L9 r) L8 R% I if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
* p( I8 r+ E- _3 R else nReturn=GetExpValue(t, csym[0]);* N" w# M0 m) v
return nERR==-1?1:0;( Y4 y% t) a: \$ C) @& m- W% q: E
}}
4 d. Z* W5 q w; K+ ~0 P3 J
% p# n+ J6 f5 h. O8 P$ a" V/ N% t$ o F
|- u/ n$ F8 R
函数模板使用示例:$ @1 p$ A. ]4 Q; m7 j' j# C+ \/ J
在以上那段代码的后面加上以下代码:
' J# Z' x$ g# ~! i5 c0 Y0 X/ |; Y; p) A. k' o& X# Y. Z
4 W5 H6 O/ F& X5 \9 P8 x
6 v% X5 [! m2 Z/ A程序代码: # g- z8 |6 U) \7 c7 C
- e5 e$ P/ G5 s+ x6 c, X% ]3 {0 O# p: Z5 F
#include<strstream>
& C. U9 u) x' \8 b3 Q0 ?* ^7 R#include<iostream>
% r) R! H& `% T ^( H& B- v* u#include<string>
" a- E, L Q( [/ W A' @* L$ nusing namespace std; M3 `0 {- i1 a3 `
int main(void)
+ h% n# I4 g! R) x+ T" a; }7 I/ ]# [{
' e* J% S3 Y, `2 F. t1 u: [ string s1;9 X- k0 g) P& ]9 h7 o2 f) o# }
while(cin>>s1)
+ d3 q7 l( ]4 ]/ Z1 h4 l {
' i$ Q' L; l! \" P" B' c- Q8 [ istrstream isin(s1.data());: b2 } q: b' N; u6 U+ E. y% q
double d;6 D W+ m# t# g4 E; ]
if(fy_Exp::GetExpValue(isin, d))
9 t* [8 y1 Y1 l, } {' @2 z( F0 }% P( Q
cout<<d<<endl;
. P; x0 [" ]5 n! z& e( z) _/ E3 \ }
& `2 L$ w& C' b' k else* J; |: K: i9 g( {3 R' z/ c
{
. Y& b: a. k4 @3 k cout<<"ERROR"<<endl;2 I5 ?. k8 Y, m9 s2 L$ X( _
}
7 J6 _& f0 n# G4 n$ u' {, S }
4 U/ q5 ~9 Y, q, A7 s# D" n return 0;
# }- {1 P1 R. Z d! j# e}
! h- m9 D6 B( G
+ Y, C8 F) T9 ^0 n! L7 ?3 M$ ]
7 b1 D/ H& ~/ f% N& i1 ?然后编译执行就可以了(*^_^*)$ O7 i! s( `# u6 x7 [
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
, o1 o5 R9 N o3 `" z 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|