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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
- L. [# T7 w0 E$ f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
; M) z+ n( W, g$ B! I: k只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)# y1 n5 K) J5 p/ M4 z% W
参数解释:! h& y8 Q! e& l5 m% r2 j& p
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! L+ |' b) l) a* y2 l/ M7 @" c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* V" A- z3 ]) F$ ?7 Z* D. t
返回值:
1 E+ Y/ j; a9 l; U" ^! s% [# d* a: `返回非0表示计算成功,0表示计算失败有错误$ c% V ?/ u- n4 [' r: O7 C
5 f( |/ P; T6 y' t0 a2 y' K& I4 @
5 B/ r) m0 |" i1 y/ O4 |( ]$ Q. X( a7 c ~2 r" d0 D
程序代码: & N+ O) }9 Q9 j) Y
, J& ]: X5 l' e+ d
namespace fy_Exp{
8 r( z! l7 f0 K" _: g- |) ~, `namespace {template <class _T>
u2 n: Z9 l4 o3 i4 }; h2 Yinline _T GetExpValue(_T t[], char& csym){
$ O$ }0 x0 Q, f( |5 t char c=csym; csym=0;4 T. ?* [: e. r+ w
switch(c){
) d7 p& @7 _, B% E case '+':return t[0] += t[1];& B4 |( D' f4 x, T1 Q$ z! g+ Y
case '-':return t[0] -= t[1];. y, f4 L9 x1 O! [
case '*':return t[0] *= t[1];! r6 v5 `2 X- [! `1 l# e, d
default: return t[0] /= t[1];//case '/':
6 P" Y7 J6 M- |0 g) ^8 H }# M( Z) v7 L y9 x- G) X& k
}}7 C9 f; p3 O# }9 G2 r$ v- b
template <class _T, class _Tstream>& D% [: d! I' S& X) g- ^
/* _Tstream: inputstream, _T: get return value( e, s1 L2 `3 G2 i
* Return nonzero if get value successfully *// G! R) M; m! [+ [0 [/ Z; A; G0 a
int GetExpValue(_Tstream& istrin, _T& nReturn){7 [0 c3 y$ v" F. O/ i; E' m$ K
_T t[3] = {0}; //雨中飞燕之作
8 P* X1 A9 C4 Q9 ]# @ char csym[3] = "++";
& k3 R2 U/ Q# H4 Z& ?3 N int nLevel = 1, nERR = 0;
- ]" J/ A, `4 z; x% Z. ` if(!(istrin>>t[1]))istrin.clear();( l k. C- @2 n W; d7 Q
for(;;){
' |. \0 K: w" f. X1 I/ z if(istrin>>csym[2]){ @. i5 O F' F$ \) P f2 ~* ~
switch(csym[2]){
2 i; d; O: \* a$ t% b! R( Q; B case '(':
* Z( T1 k+ d6 k' E if(!csym[1]){nLevel=0x100; nERR=1;}else
6 [& G+ g4 ]: }6 q4 l& U' R+ @8 j1 B if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 a: g$ m- H" w) j+ r4 @" Q
else{nLevel=0x100; nERR=1;}/ \& h5 j6 S; c2 j
break;
, R3 ^9 a3 O5 M2 W case ')':8 h7 A3 H5 A' H4 I
{nLevel = 0x100;}break;1 p, ]4 Q# G4 l* n9 E6 b' u
case '+':case '-':case '*':case '/':7 y+ g) f4 U# q) w$ J" a# f/ S; p
{csym[nLevel++] = csym[2];}break;
. ]1 G& B4 n6 c4 l) i* x case ' ':case '\r':case '\n':case '\t':continue;
- ]6 }5 ?& F8 N+ r1 e: z default:
( g5 e1 W! }9 {4 h {nLevel=0x100; nERR=1;}5 K2 e2 }) g+ T; P4 K7 m
}
0 {3 }, n8 N! b, C0 ` if(nLevel==0x100)break;( T* Y& g$ D. Y
if(nLevel&0x10 || istrin>>t[2]){+ E+ L, L: M' c M4 Q/ F
nLevel &= 0xF;
% u2 H' h* U( |! S$ \ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}7 P/ M6 a/ p! T) q0 e: A
if(csym[1]=='*'||csym[1]=='/'){% G4 z& A- F: N2 z3 @. b
GetExpValue(t+1, csym[1]);
; P) I# _( S& Z- d8 e0 R' Q }& a$ j' z$ |- o5 w8 w2 \2 k
else{
4 @2 m% {6 Z$ t/ U( n" i/ V GetExpValue(t, csym[0]);
. @5 T+ A4 d3 x5 z, A2 [ t[1]=t[2];csym[0]=csym[1];csym[1]=0;
. [+ y# l5 ~; \3 H( H9 p }) [5 N6 @5 p: M
nLevel = 1;
/ D$ p2 K& v' }$ f) W }5 `3 j5 U9 d$ h8 t( p
else istrin.clear(); Y1 ~' u: v% j
}
9 {5 v8 R* {# r+ T6 H% U8 { else{nERR = -1; break;} ^+ e8 o' W1 o+ O1 `+ l" f4 U
}
P+ p' v* G% L' w j: y8 V if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: v# w% [* p9 @ f9 | else nReturn=GetExpValue(t, csym[0]);, s' h1 p/ i" T' N6 l. Z
return nERR==-1?1:0;+ u/ s5 L: R" {# j* ? @$ |
}}
) d; w* M& z# j/ b6 h1 w" M7 A' x) F/ J
7 i7 \ a Y8 I3 r* _, c/ h% c# \" @; t( Y0 A# X4 k, q' R- `
函数模板使用示例:* m, M/ {$ n! W
在以上那段代码的后面加上以下代码:
: }- j' @, I& L# n7 W, y4 v& h7 _+ y! i# F* ?& i# Q
) _/ C/ F% x) l: b
* d& \: I1 B4 @
程序代码: ' A- O9 g) k) D! a
, Q) V2 q9 [. J7 r5 f3 F#include<strstream>
$ ?8 E, {5 s0 S; j/ c* {#include<iostream>, L: [0 T6 _* }8 l
#include<string>
1 ]+ z5 M6 U" n4 t; x9 Iusing namespace std;. N2 W7 G5 C% m% V* |& Y
int main(void)
; G, ~% }1 a0 s% o z{1 h$ P: o0 |, X- w2 n5 k
string s1;+ R% e3 j/ U: J
while(cin>>s1)0 d$ e9 h/ \) q* z8 V8 w& b3 D B
{
( O, u2 _5 E( x0 n istrstream isin(s1.data());' Z* s% R' i4 s( [
double d; s+ o& Q1 i# a1 z
if(fy_Exp::GetExpValue(isin, d)): T; k6 x% n1 H0 N8 K$ B. G
{
) U$ @* `: ]4 x8 ?1 W7 \ cout<<d<<endl;
. W5 Z7 o& w( U; { }' o$ U: f2 e% a1 V+ a! ^7 a+ u: ^# w
else
# N! \( k0 R0 N ^/ @7 O- H {! [* f: x! r ?0 l
cout<<"ERROR"<<endl;. ~- `1 a y4 @5 f; G
}2 }" ]. j) y6 P' H8 S! d- y2 m
}0 ]: E+ r. A2 b4 S& G+ h
return 0;5 A \+ d5 O' P; b
}
9 P W( S, r, p5 H q
/ R. I2 { @; n5 ]: D$ p$ ~3 O1 p5 z ?8 \5 M$ D
然后编译执行就可以了(*^_^*)
' B$ P, _, W; i; Y4 ~, }$ o其它:TC++上一定编译错误,不保证在VC6上也能通过编译
, w; I' j' {5 B$ G) K 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|