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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
7 f& j* c: m" |4 G0 A. A. g2 m& _一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
4 _ n5 {7 n3 `& l# s" o只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), Z9 q% R4 J% ^3 u3 Y; X- F
参数解释:
) H& a! q1 O# f, l9 Wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& E W' }- i% k" L* L3 i# d& f7 o" F8 {nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
/ x5 ]. m, I5 z& N" c# H$ d返回值:- ]3 {6 r( N3 q, ]3 Q: L7 k+ {
返回非0表示计算成功,0表示计算失败有错误- e6 U# S6 v; |8 k& u/ I: d
- R; R% a! x# [6 E% S
8 z8 I) P) B9 O4 b/ h1 g) S
: @. W" H. E6 p/ ~1 j! C6 a程序代码:
$ @% q5 I2 @: T7 A/ m9 I2 T
3 g7 T* ? ?5 q/ A7 U9 m# enamespace fy_Exp{! u5 b0 }, D; q1 A, o h! v8 l+ Q8 R
namespace {template <class _T>
) `5 x/ }7 ]- |; g5 `4 O$ \inline _T GetExpValue(_T t[], char& csym){
9 T: y" g# y: ]% y1 b8 T3 B& B( U char c=csym; csym=0;
: `! [) r9 A* s" A& J+ Z switch(c){
; s( v' {" v( _' @5 k( a. O: l case '+':return t[0] += t[1];7 C1 W# w) @8 Q: e* X& d
case '-':return t[0] -= t[1];
& A9 x8 o6 b# ~% _' i7 X case '*':return t[0] *= t[1];
5 I- W3 I; E; \ ]8 U5 g7 @ default: return t[0] /= t[1];//case '/':
$ \: Z; V, P" g$ X/ V. B' V) U }& v4 c1 ^' S j+ A# B3 b. y
}}3 X3 M. ~) j2 u d) a( W4 C! X
template <class _T, class _Tstream>' v9 z' Z# }* _$ `; v: x( r0 R0 s, B4 Y
/* _Tstream: inputstream, _T: get return value
# {2 ]2 k! u5 E* Return nonzero if get value successfully */
3 g* S5 p# l$ jint GetExpValue(_Tstream& istrin, _T& nReturn){
6 C' X' z) p4 {5 w7 ~ _T t[3] = {0}; //雨中飞燕之作$ q# W! X7 p7 N$ j8 w# X# S
char csym[3] = "++";
@2 v, K9 \0 ?0 Y' Z, f int nLevel = 1, nERR = 0;. U; p6 v8 G0 l# M7 @/ @
if(!(istrin>>t[1]))istrin.clear();2 h- j8 a2 U% U( Z7 l
for(;;){
0 W7 S: I8 Z' S$ G! x' S if(istrin>>csym[2]){
7 [* d. n) d) ^+ q7 L7 S switch(csym[2]){
0 Q: H5 ~$ z7 \- P8 x% W! o case '(':1 n* @, J: Q8 L6 K, e: ~
if(!csym[1]){nLevel=0x100; nERR=1;}else
$ z, N% n" R* q, ~, e1 Z if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 f/ I+ ~2 I1 D* `; j5 u! ?4 a
else{nLevel=0x100; nERR=1;}. F; ?& Q, [- t' n
break;
, b$ }" _+ ?. z$ A case ')':
4 N3 [" O* I) ^( M1 x4 l {nLevel = 0x100;}break;
- W8 n. o& ]. A$ z# c* H1 X case '+':case '-':case '*':case '/':
7 ?+ Y @3 m! @" @/ \$ J8 b a {csym[nLevel++] = csym[2];}break;1 W, Y% _& }# f
case ' ':case '\r':case '\n':case '\t':continue;' z0 p9 ?" a; g3 W% O
default:
( v7 p! o" V/ g8 ]8 R1 k8 K {nLevel=0x100; nERR=1;}' z/ x3 S0 L, K) i: u. m: `7 A
} g1 N( T+ V/ Q7 [# p" B5 `2 z
if(nLevel==0x100)break;& T0 Y% u9 p7 z% K5 @
if(nLevel&0x10 || istrin>>t[2]){
5 X& p7 |5 a1 F( r! M. N3 w nLevel &= 0xF;/ s; T6 y& o9 p0 z8 z+ L
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
% Z4 H+ b- ^ z/ n) G if(csym[1]=='*'||csym[1]=='/'){5 s: i1 c6 L* {0 i( x) `, c) d% p
GetExpValue(t+1, csym[1]);
8 Z$ M. ]4 U, K. G" } }, c) ~- q* G+ R, c1 x
else{
' A0 D, T! u; ~( C! Y- d; Q GetExpValue(t, csym[0]);
& d/ k6 H" Z3 m) O8 Z( q/ E7 P8 v t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' }: U3 D q" N; T, ? }, z6 k! F/ u. t$ j i M u, l6 T
nLevel = 1;
# j* p' z! v9 g5 [5 F( I }, v( v8 b# V. t2 n0 R* {9 L
else istrin.clear();
' @8 Z' z: N$ v }
0 D8 v! F2 b% D' a2 C0 g( h else{nERR = -1; break;}5 G( B( K" P/ b
}
2 k1 i0 Z8 t; S; M h if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& @& h7 X$ I6 ~" X$ k4 g# k else nReturn=GetExpValue(t, csym[0]);
$ N& D, b( c8 x2 N- O. T return nERR==-1?1:0;- z" O! m( L6 d% R* T
}}9 S. }( u! U5 U- A+ O3 i
" {+ g& D5 a0 q9 w0 T1 w8 E
# _. b9 c! b# f0 U* t/ H2 t
# [( t4 K# l3 l; s; h5 f4 @函数模板使用示例:1 s; L$ ^+ W$ a7 Z5 p4 J; X1 B
在以上那段代码的后面加上以下代码:
2 Z E6 z- E( B5 U; a" Y f% y9 ~' [
2 \/ V2 H/ ^# l7 N
9 P! D8 a5 y2 H. ?, |- f
程序代码: : k5 U2 O6 M1 P j
6 M1 J; ?. l% Y
#include<strstream>4 Y W) j# ~/ Q
#include<iostream>
3 p. V) ?( Z9 }( r#include<string>3 k. `/ R F: J4 O: D
using namespace std;3 i* o7 G! e$ e$ m
int main(void)8 O( }, P- \6 o5 C5 v5 V* R; P, j
{4 f! T- t6 n' ?9 e: t/ ~! I$ S
string s1;
4 A f7 A7 x& R7 R7 @( D# e while(cin>>s1)
: d3 }. u: i* @: P4 H3 K {& f0 _6 `$ |- ]' Y7 L
istrstream isin(s1.data());. j& z) a7 X; H, g
double d;9 V) i' H7 o; j7 r
if(fy_Exp::GetExpValue(isin, d))
* f! F4 K. X D8 b& M, A {
: I8 @8 |: q6 n* ^ cout<<d<<endl;# ^2 t/ |+ L0 B0 v+ L3 j
}
; `$ w' i% s2 _) ~6 E4 I" H else
/ x% n0 N' E3 t {
1 W# [2 U# Y5 o! a4 C( r* p- x cout<<"ERROR"<<endl;
! N2 H% q/ E& c8 ]0 \, ] }; J# r) b# \& o" B4 F7 h! B1 k& @
}
* a# Y1 M& |0 X4 c5 _ return 0;
2 D' K/ D5 ]) w! l2 r. w$ u1 [}
' @: C) q. Z$ N) r* E: d
7 y M" ]7 Q$ {0 V1 A& C3 \( x K
1 m4 |* E: x( a3 d: @; O然后编译执行就可以了(*^_^*)( \% f0 D* d1 \$ d/ J
其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 l1 E; u) Z& f' h$ w
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|