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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
7 A# U8 ]2 q# @ L( X; j一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
* g9 l" l# S( E3 w, c( h7 t只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 }0 N$ ` |$ m. J
参数解释:
9 m' f( K8 J5 {+ Q Distrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
5 ~$ R1 k6 B& u: M; a. N% K8 HnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* C0 m5 N$ H* {$ D0 L
返回值:
* M* G8 W* S; B) F) d7 s返回非0表示计算成功,0表示计算失败有错误; E! ?- [) G7 E) |% s
7 {4 b4 B- J' ~+ M2 l
& P# g! D+ X/ r6 N' d- ]2 G( s; R* s- H! I7 L& l
程序代码:
, n2 O D$ R7 @3 F" h. h
1 B4 Q6 h. r* v- wnamespace fy_Exp{
`. W" t4 R7 j* Z5 N: knamespace {template <class _T>4 ?4 K! j% |' q& N3 ?
inline _T GetExpValue(_T t[], char& csym){+ w7 g1 M" g5 \: ?
char c=csym; csym=0;" \ h0 G8 i) q8 I
switch(c){3 t+ `/ q( p( I' `
case '+':return t[0] += t[1];, K4 X; c% ^" [% ]' t
case '-':return t[0] -= t[1];
0 v3 N2 [8 x9 w0 |+ `* i6 ` G case '*':return t[0] *= t[1];
( f6 O; C1 {3 e( D+ r) [6 F default: return t[0] /= t[1];//case '/':8 s0 u+ ?' {; j
}, I( w6 C. K5 C: J6 O
}}& i( z( n) K4 R5 g3 I/ f8 f* w
template <class _T, class _Tstream>) t. d) ~/ H- g$ t: Q4 `7 Y4 V
/* _Tstream: inputstream, _T: get return value
& z" k$ E4 ?1 U, `) ^2 u* Return nonzero if get value successfully */
( m8 m# K2 v. l# yint GetExpValue(_Tstream& istrin, _T& nReturn){
, p% r5 a2 S6 W: O) b _T t[3] = {0}; //雨中飞燕之作+ Z/ j& J2 ?) q
char csym[3] = "++";$ G: Q. O& g8 e- p
int nLevel = 1, nERR = 0;6 | g) u1 v! w( X2 I: _( v. ~0 @. L6 a
if(!(istrin>>t[1]))istrin.clear();
7 S+ }& g+ E- l& m for(;;){
7 ?' H* d$ i: p/ Z if(istrin>>csym[2]){
( B, O$ ~- d0 L& F6 D$ @" } switch(csym[2]){
. M. S' h, ^, Q# A! P1 B case '(':
8 `2 z5 u, t# V* t! o if(!csym[1]){nLevel=0x100; nERR=1;}else
+ G3 V3 G5 a' V5 c if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
& R+ P8 c( T8 R else{nLevel=0x100; nERR=1;}
; G% A' X: s9 y, d6 ^ break;
. Y6 [2 N$ i- y8 W5 m case ')':' ]5 u3 ~6 [ ]4 v7 b- C
{nLevel = 0x100;}break;
% r% N2 |& P, Q6 b& Y case '+':case '-':case '*':case '/':$ ~) {+ w& q9 D4 p% h& K
{csym[nLevel++] = csym[2];}break;
: L8 P3 x9 O' F* p case ' ':case '\r':case '\n':case '\t':continue;
& W- \4 G- ` }" a6 a# n1 j8 Y default:4 f1 d0 Z, k" z) Q
{nLevel=0x100; nERR=1;}
) |0 l% H g2 m4 } {+ f! Z9 h% t }$ G7 H$ ^4 u, \! Q8 X
if(nLevel==0x100)break;
/ j9 H4 [$ B( c if(nLevel&0x10 || istrin>>t[2]){
$ c; C) N+ R8 n8 @' t4 W nLevel &= 0xF;
7 `5 T- @) i! d$ T+ w( f* C if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ y/ V2 _ R0 R! ^0 ]6 f! e- H
if(csym[1]=='*'||csym[1]=='/'){6 E2 c0 q: h- O6 t* H8 z" k& a8 r- Z& E4 n
GetExpValue(t+1, csym[1]);5 v. J( O1 o% l% E7 D
}5 o5 X* f7 S0 x& K( p4 v& t
else{- ~ c8 ~8 B: \
GetExpValue(t, csym[0]);7 g, G0 P, K! D- M* ~: H# P
t[1]=t[2];csym[0]=csym[1];csym[1]=0;$ h6 w/ {: W0 b) U; n
}
* a6 W# A @/ b nLevel = 1;8 Q2 `% ?1 \) D7 W
}* s r! O j7 {! a0 X0 d0 I
else istrin.clear();2 f8 D$ }% Q1 ^0 h9 B) K& ^
}! H; b# V' b4 X, X" r2 s% P8 L
else{nERR = -1; break;}8 @$ P+ O/ Z; R, d, A
}0 Y. r9 ^5 M: q* |8 W
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 S4 Q( ~/ b" o6 P! N
else nReturn=GetExpValue(t, csym[0]);
% L* ^# ]) _6 p9 h: R4 a: O2 T return nERR==-1?1:0;
# A, @/ B! C6 n}}
) S: ^1 Q3 ^: {2 U& e$ q& \$ I) i' ~, m" v" r5 U
: _7 a8 I% o5 ?4 m* Z
* h" e5 H3 f7 U" E函数模板使用示例:# M3 k0 q- e9 P4 s
在以上那段代码的后面加上以下代码:
1 I/ N; E* ]* F, t
: }6 ~; K8 D4 n' U. b" @ q ! s: w4 e; n/ o. U
8 n1 |# F0 K8 C6 S3 [" b程序代码: : O8 D6 Z3 m; H: N
4 |- o! w, t- B
#include<strstream>
2 F: T8 u! Z; r3 B; s$ H' S#include<iostream>
) k: F) o# R$ M. l- W! F#include<string>
" M# Q. h! F, [) I7 O7 Lusing namespace std;
" n7 R" f0 p* T5 { C6 ?: ]int main(void)8 e/ r( \% P" f0 p; \" }$ o* P M% J* b
{$ q g) x5 e$ B, F, K6 |0 A; B+ p @
string s1;
( r4 [" y4 J: C2 M0 p' |$ K while(cin>>s1)
* U2 F' @. B1 F4 f9 L {
+ e6 X) `2 O7 @6 Y: I istrstream isin(s1.data());2 L# }9 j. M/ J! O P
double d;
2 O0 t9 n8 s* z- d% x4 h: @ if(fy_Exp::GetExpValue(isin, d))
; x1 f" ?) H3 M5 A0 N: } {
3 x& @0 ^+ T2 d. n cout<<d<<endl;
) {& Z3 G; p! x6 x }
5 ]1 i' W# m$ w5 a1 Y0 l9 l% m else
7 X) r9 D& }6 ^+ c& G {
+ H/ C5 Y2 e V0 T# u6 ^ cout<<"ERROR"<<endl;
1 j& w# z: I4 w+ z: C# [ }1 S% N# @8 x6 o: y8 B% Y
}& _8 E2 B$ \1 V" k
return 0;! @/ h0 S% U# T% I
} c. r7 T8 ]) G- C$ Q
# h: U9 k; R1 w8 }. I' n. }% Q# z: _( l; \
然后编译执行就可以了(*^_^*). m y9 _& [: R* z( S/ b
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# P; y5 f- k2 y3 x 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|