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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
. M3 C1 C$ P/ {8 J7 p一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 I, `# l( s, N& {6 v只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 Z8 w" Z N( r( g参数解释:: H# V* c; v) G' x+ b/ S
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% F+ K, ?5 ~8 H0 T
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; }7 Q5 r5 C5 k# p( D# e/ h
返回值:
/ i: x; y6 l/ H, z0 H返回非0表示计算成功,0表示计算失败有错误
% K$ e- X' c. x0 j
8 n# q$ S, E: @' i& A + l' I9 z$ }2 g+ l& b. E) T
& w" l# o* F2 Y F
程序代码:
# }* e N/ D3 l7 O8 s7 N, I' ]- }, k+ ?. Q- [
namespace fy_Exp{/ U# h7 b7 q( p' x! X
namespace {template <class _T>, d# H" g" ]- R3 I
inline _T GetExpValue(_T t[], char& csym){% L: C8 i. S9 s3 Y. ?" `" e- f$ M
char c=csym; csym=0;- A5 o, y- M C
switch(c){
& |& }" b% S- d1 ~, f7 X case '+':return t[0] += t[1];
9 A( c& p. q. t0 |! V1 z8 e. y) _ case '-':return t[0] -= t[1];' h6 ~3 I! a: \& m
case '*':return t[0] *= t[1];2 @: N; h! l, I+ e/ \1 @% @) G
default: return t[0] /= t[1];//case '/':: r0 n9 v) @7 |5 O
}
' e5 N4 Z) D8 f}}
' @4 T, t& D- u4 Q; stemplate <class _T, class _Tstream>. L" _, {' a# _6 k
/* _Tstream: inputstream, _T: get return value `# b( \( X2 J& o* u, R5 B' b
* Return nonzero if get value successfully */0 u ]4 b* L t
int GetExpValue(_Tstream& istrin, _T& nReturn){
" _5 i/ X0 F' W7 ]* b, V _T t[3] = {0}; //雨中飞燕之作
% c+ d- l+ m7 y5 b0 ?+ Y9 f; Y char csym[3] = "++";$ g' G; E) M0 W5 s' h2 }( Z
int nLevel = 1, nERR = 0;
( o2 m/ u# y: K/ R* j( h6 g if(!(istrin>>t[1]))istrin.clear();
) _0 l- ~# c7 R" }2 d for(;;){
) z Z" |) E. G0 F7 e# T' F if(istrin>>csym[2]){
- `5 J6 N9 v! N- o1 e switch(csym[2]){ ~! n( {, o' t1 i( H
case '(':& u' o( i. b" u# ^& F0 D+ K4 A* C
if(!csym[1]){nLevel=0x100; nERR=1;}else: E% X+ z/ g0 C0 ?' `
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 N9 v- \6 M- b- q* y else{nLevel=0x100; nERR=1;}# S) b+ w# j% R! U' k
break;
$ z) {) N1 p; a2 e) j- D3 }( k# {2 p case ')':
0 h( q/ R& g. z4 g7 p {nLevel = 0x100;}break;
# R- F, Q% t2 u7 k case '+':case '-':case '*':case '/':+ l- T8 [7 R- S! s9 i- ~/ a9 I, ?" Z
{csym[nLevel++] = csym[2];}break;' B5 n) E# x5 E3 P
case ' ':case '\r':case '\n':case '\t':continue;( @' [0 R5 B, |5 @# m
default:# A3 j4 P* X( r- O! ]
{nLevel=0x100; nERR=1;}7 U1 [- R/ q1 Y4 \. V
}, `, j9 u: z; K+ g$ }
if(nLevel==0x100)break;. x/ N+ j0 H- d2 [
if(nLevel&0x10 || istrin>>t[2]){6 b* Y! E- u2 |2 B
nLevel &= 0xF;/ A7 S! ]/ j, P
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}2 }9 \ }) k$ V; z+ C
if(csym[1]=='*'||csym[1]=='/'){! B( A2 }. Y. J$ v4 r
GetExpValue(t+1, csym[1]);4 v0 ^2 D# r# I% k1 |2 s, o, A5 B. w
}) c8 d ]3 e2 N, _/ z
else{
( j( b+ p% T9 C" n1 L' R* E+ R GetExpValue(t, csym[0]);
- ~+ ]$ J$ F- q7 K, } t[1]=t[2];csym[0]=csym[1];csym[1]=0;
- T& x! \( N7 l5 o+ \) S }7 G# O) l) Q; @
nLevel = 1;
, \: P) ~5 d/ E2 U0 L; S. }9 T }
8 e! N% G9 |( C2 U1 Q0 z else istrin.clear();( g( N3 ]) ?8 |% b6 W& R/ u
}2 C, I7 S- H; Y# ]$ H a
else{nERR = -1; break;}
3 M) b+ q1 e+ ^ }+ x- e3 x3 a0 N
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 v( b2 T# ]$ @$ [$ \( u else nReturn=GetExpValue(t, csym[0]);
2 d! F4 \0 e- \3 F return nERR==-1?1:0;
) d+ }; l: w6 M& S5 s, V}}
7 k1 p V# z V9 t& l4 l" O) B/ E. y; ^- I M
+ v% b% G; w9 x1 G7 C
+ E0 _) g7 ^' s" E! i: S! z6 \函数模板使用示例:/ T! Y V/ c# N3 k0 H$ j9 k/ \3 B: t
在以上那段代码的后面加上以下代码:
+ B2 V. B) D, z7 r5 ~* N! |6 f. k1 F# S/ K: E& f
8 ~$ ~9 T# W1 p Y/ b. E! w. D3 V2 x( D) `
程序代码:
: Q w1 P1 H* }/ D6 ~1 \; A7 }) y! _- B; j
#include<strstream>
3 D- T% M& e2 q0 X8 B2 i0 j. L" \% k#include<iostream>, ]7 E8 V+ x1 N+ U& B; J; {
#include<string>, m1 ?# c. ?( r: J& G. N! F
using namespace std;( }7 a- b; a& w/ I6 `
int main(void)* a& X. s7 ~ y% x
{
2 H- m5 I3 N7 C7 {) g+ h4 c8 J4 E string s1;
# A9 ^' w9 a3 r0 s# ?8 l while(cin>>s1)
: s6 I" q( y! u7 o* J' R {9 E9 v# W8 J" W* t" A1 O k
istrstream isin(s1.data());8 H* v. g. O4 Q: e4 C6 O2 t8 B5 J
double d;
( J1 I* D( M3 G* X1 p M- v6 K if(fy_Exp::GetExpValue(isin, d))8 J% G7 f# e* ~/ x; h1 Y. H/ K! |
{: p1 F2 P! r) E; h+ |9 c
cout<<d<<endl;6 N$ `6 `! v- w. e: P
}
7 i7 j' J% ~* ?! M" }* r% k* ? else" `6 b! ]# X. H$ ^* U1 z
{
* m8 O* j6 H4 [" w cout<<"ERROR"<<endl;
# M: l( K a1 F }
# b f$ c% M& y! S& q }! T9 d9 @3 K$ Y9 E- w& @
return 0;$ D9 S4 J! q, o9 P1 y* R
}0 x/ X% E$ Q ~% \* J
5 b$ E) _( s, B1 Q
0 V! |$ B# [% b: l, J然后编译执行就可以了(*^_^*)- V4 D k; I8 h2 A; i* W( @9 r% S
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 m3 f8 Q1 [; K 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|