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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
) R" ~, ] |/ D% N, _! X$ R- k* q$ z一个很方便的函数模板,可以并且只可以计算含括号的四则表达式( t8 d' {3 M; u/ O4 Q: p7 T
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)- a y8 t2 i$ U1 ~
参数解释:7 H1 Z1 ], C+ u' A
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
2 J \& I- |: f3 T; |: P7 E$ ~/ nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ C( k3 k( l5 p6 q) z, @
返回值:; K0 O; W1 F9 z7 F
返回非0表示计算成功,0表示计算失败有错误
( s0 C5 S+ X3 x7 C1 ?% `5 e# m- \# l, p! V
- R# g6 z! U4 s2 L' r" w" Q1 q3 D% w0 I# n8 A
程序代码:
' k4 P& y# u! y! i7 R. h- T7 ?3 ]1 O! Y
namespace fy_Exp{
. Q C3 k( |/ C, w5 R6 Q6 Y4 Anamespace {template <class _T>3 y: n2 p5 b9 M- [8 `# e5 f2 n
inline _T GetExpValue(_T t[], char& csym){
4 Y% H, T9 w) ^% ^: W& U8 G% ~* L char c=csym; csym=0;
1 h7 U! J8 m/ p( ?, p switch(c){8 H5 k" @) `' m+ ~( L
case '+':return t[0] += t[1];$ W: l0 w. @3 W
case '-':return t[0] -= t[1];
" R2 y% }! s2 i# Y! S case '*':return t[0] *= t[1];9 I* L& E4 k X6 A: S! w3 Y% J5 X
default: return t[0] /= t[1];//case '/':
* x" ^, ]' K, |4 x" v }! U% l) m" w0 Y1 G
}}
; \9 Y, L; d0 [2 L( o7 b5 I% ptemplate <class _T, class _Tstream>
. A) E; G% d9 Z0 x- h. t/ X, a/* _Tstream: inputstream, _T: get return value
7 X: z6 \7 ~& u3 O+ W" y; v* Return nonzero if get value successfully */2 P5 r: L( ]- I9 l& f
int GetExpValue(_Tstream& istrin, _T& nReturn){6 [- N$ O q4 s
_T t[3] = {0}; //雨中飞燕之作
9 h9 i: G O3 V1 |7 q* C7 k% X& [7 V char csym[3] = "++";2 k& a/ p y+ X% m! }9 O" K2 b8 ?
int nLevel = 1, nERR = 0;/ J6 n2 v! b7 r F: j' X
if(!(istrin>>t[1]))istrin.clear();7 k8 N$ Y7 g6 w* y3 j
for(;;){! Y# k1 {0 K0 Q
if(istrin>>csym[2]){
% K( ?8 X" ?& L6 H$ _ switch(csym[2]){ S6 b9 t- A# O3 N
case '(':5 k+ g( r" V6 N5 e$ p5 Q
if(!csym[1]){nLevel=0x100; nERR=1;}else
! x; y4 x3 O! d" i4 R if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 h3 H, Z$ P" l$ @: ]7 @$ ]5 l
else{nLevel=0x100; nERR=1;}" }' I# o2 j0 Z
break;
1 G8 e, `6 q% D0 B" n. |) e case ')':
/ R6 `* Y/ x: E. ~1 B% N {nLevel = 0x100;}break;
; g! f: F2 f' p( p case '+':case '-':case '*':case '/':6 s: {0 `" f& f- r- }8 `; _
{csym[nLevel++] = csym[2];}break; y+ g. n. Z q7 e7 O: A
case ' ':case '\r':case '\n':case '\t':continue;5 B* V3 ~" x- K+ x4 E
default:
: k) m; T1 v4 s+ P {nLevel=0x100; nERR=1;}
7 Q! w4 h8 L* T& s6 ~: D: v }
- I* y- `4 Q. [! _1 X4 v4 t if(nLevel==0x100)break;
; z! `2 p1 v/ ?! t9 ]& M5 ]) I if(nLevel&0x10 || istrin>>t[2]){
* I2 S; ?1 s5 W7 K nLevel &= 0xF; j5 R) `" u! V h/ K( B3 c1 G0 L
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
' d5 Q: R8 h4 J- `5 [! H if(csym[1]=='*'||csym[1]=='/'){, g8 v( C- Z% q( E3 i2 @
GetExpValue(t+1, csym[1]);
( o0 u( P/ C1 D6 A) H- H: p }! \. a0 q5 N4 Z0 O* p
else{- S$ r- X8 P4 f( P. z4 I
GetExpValue(t, csym[0]);5 v$ w! B8 Y) t9 v; |( t% A' s
t[1]=t[2];csym[0]=csym[1];csym[1]=0;" I5 ]" K6 X! N0 Y \: Z
}
# m3 J1 h: O+ F V nLevel = 1;$ p, W8 p* o& r* F! i* Z
}
" A6 q" `$ k# J4 z! F$ f: w else istrin.clear();! S T6 b$ l: M2 i; z
}6 ?" E8 w; Q4 T7 V
else{nERR = -1; break;}/ c8 r& U, d" C1 K/ M
}# [; N) O. z% ?9 D9 J
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);: Q3 G6 U' h v3 i/ y7 _2 K" K
else nReturn=GetExpValue(t, csym[0]);
: E) t- U. @. `" a" k, p% R/ t return nERR==-1?1:0;
+ ?% Z4 c n6 Z( ?$ t8 W}}3 ?6 f4 x+ h1 C1 E
; {8 |3 w1 V* F) T
9 L! q! @. Y1 M* O* `* O$ ?' x/ s# f" C; h8 d3 O1 j1 e
函数模板使用示例:2 h! @* X5 G: P; b3 M( W0 |
在以上那段代码的后面加上以下代码:
0 g% p) p) s/ B0 I8 U# z1 p! X) [6 a- c K9 N
' Q( t, l, h, x. ^' u3 n9 f
6 Z N0 @; x8 o; _% f" u程序代码: 7 @6 N5 d" S0 U) f
4 E! K$ a' Z% L6 d! S+ y
#include<strstream>
6 l: |6 F" |$ q#include<iostream>
0 E7 E1 j7 J% B8 r#include<string>
" k3 G6 _# T& q d( Musing namespace std;
" a r5 G, W: s& Z7 w, e) \int main(void)8 y+ ]" c2 `$ g$ d$ Q
{* M6 r: |3 o9 D4 C- j( u: _! k% n
string s1;
% b8 K- q3 W; D while(cin>>s1)' b# ]( S8 X ?# \
{
0 n4 l9 C% d* c1 N$ h. a, d6 b$ T7 l istrstream isin(s1.data());
) y Q( [$ k: }5 ^ double d;4 U A Q7 j. n+ k: P s
if(fy_Exp::GetExpValue(isin, d))/ S0 L; U6 C" g' W
{4 f" ], b( g8 g; i1 ^/ m. b! v
cout<<d<<endl;
8 {# i3 V: s4 T/ b( x! }! r) A }
+ [& Q/ v/ D$ Z1 J* u7 Q5 ]" r; K else
' N! D# F( U, Y6 }, B C$ |- m F {* e1 A# i1 _% N' b/ d6 T
cout<<"ERROR"<<endl;
) ]5 C# f# p0 z( F4 x }4 g1 J' n7 b, u( L9 C! n0 l( A9 J
}+ ]9 m9 ?7 z0 k5 [3 R& A
return 0;+ E6 J& Q4 y& U6 t
}, T/ N0 H+ F6 v# N
% s0 ?1 |0 p: B' r5 K Q. B3 R
% r, c7 i% m# }' a* ~$ ]& j然后编译执行就可以了(*^_^*)
7 ?2 W* w+ U: c# Q! y其它:TC++上一定编译错误,不保证在VC6上也能通过编译" r) C- q, I0 `6 d: \8 H
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|