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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,- T% V. E& h. R! e
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式: l' Z( b0 z6 Z4 c- B" B- W
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
$ ~9 [& \/ `) v; D1 F参数解释:, Y8 j1 Q4 f- f* l4 C
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流. b) {2 {8 E2 k( a# ?( ]
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定$ O4 m7 r3 V5 z8 m
返回值:
7 |/ g" \/ h5 c6 q; k8 a+ v' Y" Y* R返回非0表示计算成功,0表示计算失败有错误/ k' ^) ^+ G) s G( k( M
% s" a, O/ m0 ^7 w- P
- d6 F& q* R9 Y# P2 k. _2 x- N
1 v8 @5 q: P3 z" j8 B) Y
程序代码: * f4 H, A# i' F4 n6 j
( u& A' Y8 E4 t& q6 I3 b( Bnamespace fy_Exp{* A- E+ T6 g0 c7 u0 k
namespace {template <class _T>
$ @& g5 b9 m2 B8 m0 W5 z5 i# E4 Tinline _T GetExpValue(_T t[], char& csym){+ \- |1 B$ z+ l% i4 U
char c=csym; csym=0;
& e. ]- l5 |' N0 m) ] switch(c){
& r9 x1 S+ x( X4 C0 o case '+':return t[0] += t[1];
0 m- {+ Z N. c; F& A case '-':return t[0] -= t[1];
0 l% z3 N6 k& U9 Y t" A case '*':return t[0] *= t[1];
- m0 D5 O$ i; Z' y3 s; M default: return t[0] /= t[1];//case '/':& g9 C% l4 ~- I
}, D L9 C% R( g/ g3 H/ x
}}
' K" g/ }/ L7 z- U3 Atemplate <class _T, class _Tstream>
0 @ T8 q0 E) C4 S: m- n/ ~/* _Tstream: inputstream, _T: get return value. F. W6 D j4 q- O2 v
* Return nonzero if get value successfully */6 q K3 m! O6 z9 e7 S4 e4 L
int GetExpValue(_Tstream& istrin, _T& nReturn){9 ~% m7 P. z, ]" n; y
_T t[3] = {0}; //雨中飞燕之作
/ A' Q& f2 I1 @" u7 A char csym[3] = "++";# C5 w9 w" A* U3 G. k. ]
int nLevel = 1, nERR = 0;
7 N. [/ k& R U4 Q if(!(istrin>>t[1]))istrin.clear();6 h, Z1 T% f' @3 n
for(;;){. e* F4 X5 l" O7 ?2 W2 p
if(istrin>>csym[2]){
4 D* k" J% P% r( q switch(csym[2]){
& t2 d9 Z8 A! J0 w( N8 M Q1 n case '(':5 u _/ S0 a6 n' ?
if(!csym[1]){nLevel=0x100; nERR=1;}else [5 b: `! l( E) b& ~
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
X# u# k" m" E9 u) S else{nLevel=0x100; nERR=1;}; F% g! [1 h; j' E2 u8 S1 o
break;
9 ]6 B4 D, X3 d case ')':6 j& H8 @" W2 a
{nLevel = 0x100;}break;
5 A! r) K* k0 H/ E$ W( G case '+':case '-':case '*':case '/':
X- ]4 U4 T0 H8 @ {csym[nLevel++] = csym[2];}break;
/ z" r/ T6 n$ l4 u6 m2 J/ V case ' ':case '\r':case '\n':case '\t':continue;
2 r6 E/ `. S9 F default:
# _9 C& b9 i" _' g0 s7 U4 M {nLevel=0x100; nERR=1;}% C$ @8 T6 }; `
}
% k0 w% c2 [! ^6 g- Y; B7 E2 `( z' n if(nLevel==0x100)break;2 d' ^- }. x t M0 ]
if(nLevel&0x10 || istrin>>t[2]){
% t0 L8 _; C3 O4 q! j nLevel &= 0xF;
& _$ x @" P8 E+ {1 { if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 D# c1 z) }2 ^. Z' r1 A if(csym[1]=='*'||csym[1]=='/'){' Q( D) n8 z: E6 K8 H9 M
GetExpValue(t+1, csym[1]);
, N( T2 ?' ~. }) b' Y+ A" K }- ] b2 u: d* u2 Q
else{
: U+ @/ W; I2 s GetExpValue(t, csym[0]);
8 Z5 Y# V) W& u1 z" \3 l9 l t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ G5 x: _ x+ J* ?( k% g& S7 \/ q
}1 k7 J! q. w: w( p8 \) B7 B+ K" R
nLevel = 1;# O1 S8 J( u, X# p
}$ |* v d/ `% {3 m6 y5 f
else istrin.clear();
* w; ^4 w3 T7 \& }' T- h$ O }/ A' D% G" S- }
else{nERR = -1; break;}
7 \' \! n0 w9 ]! g }/ c6 ^/ E* l1 F( r
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ Z" ~5 E. C2 w5 I" D. T else nReturn=GetExpValue(t, csym[0]);
( o. S" c( |7 U: i Z% P return nERR==-1?1:0;6 J/ | h5 }, c6 o
}}
# v: v! n6 p/ _/ P6 W, O1 B
7 l0 a4 r6 S' a6 `% [8 m6 Y' g
: P" H0 ]" W' m
8 n ^! e0 U! [" ~2 D% I函数模板使用示例:, ^( e6 T8 G8 g1 v3 t' ]
在以上那段代码的后面加上以下代码:
# [- C& E0 u% v0 r/ u$ | F. D6 ]0 Q9 }( K: C5 q, U# J( _- \8 Z
9 P' [; X) @" p% c ^; U8 @5 H( X6 u6 l, M
程序代码:
9 j+ h: b8 a% b0 L
: Z1 D- i$ H( p* M! R' _#include<strstream>, P$ ?7 |6 |+ s+ `
#include<iostream># J* z1 d7 M1 o5 f
#include<string>
) I* P( j6 t/ p, pusing namespace std;, `2 H( T. w5 u% T5 q0 g
int main(void)
/ G0 f: t: Q7 d0 ~{
4 L# d/ b# N' S8 d; |% ] string s1;2 Y) |' p. v7 ~5 n( _! {; a8 {
while(cin>>s1)
7 Z; j" {! g$ F' i3 e7 i {! ]2 \" t* W- `
istrstream isin(s1.data());* I5 r5 E( X+ r- b- R/ G$ f
double d;
2 I0 c8 M5 W0 S$ z# j, @ if(fy_Exp::GetExpValue(isin, d))
2 ?7 T; |" N/ C6 t0 e# l5 L4 _ {+ u9 Z: K, l7 C6 P0 l2 z
cout<<d<<endl;% n6 R8 I( _( _1 b3 [3 ?% F
}
7 ^: m6 a* ]5 M, h else
. N2 S6 g* C' }+ y4 o; g: _ {5 x2 V8 M# r5 ?
cout<<"ERROR"<<endl;2 C* z) S$ r1 E7 v0 z9 B, t) N) u6 p' N
}( Z7 v% q: d8 Z! Z# J4 N" K
}
% P1 B: x9 |0 Z! T: Z return 0;: @9 B' r7 C4 z7 O! c3 e; \
}4 c+ z; J; q% n! W3 E7 {8 U
2 j& Z, v+ M1 @ \+ I7 x
7 L/ W9 G. C T* f7 U. D. L! h4 P8 T( V然后编译执行就可以了(*^_^*)+ c0 }; U+ P6 h! T4 l2 {
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# r* f0 v0 y/ P1 i" M) q+ W' u 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|