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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,( \( w% z1 |0 Z3 A' a
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式. `" n8 e$ ]- |6 K% J) B
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): i X9 o& t8 F- S/ `1 \
参数解释:
5 j/ X: G, x5 N" m$ jistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 E6 R1 p6 @/ PnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
/ K: w9 u- f/ A返回值:, `% s" l! B6 i) F/ K: \5 ]
返回非0表示计算成功,0表示计算失败有错误! L( M# e: ^- M! z# ]
6 E$ L; U8 c4 M6 K3 r& u D
: K8 n9 N) n u% I" U
* H' ~) K! e3 r
程序代码: ; ~9 L% M/ y6 w T7 u8 {
) X# F- W& q/ s, t4 n; W; Anamespace fy_Exp{
/ ~4 W" K+ p' p: s& @namespace {template <class _T>
8 J+ f" e! \/ ?5 K5 jinline _T GetExpValue(_T t[], char& csym){
/ \7 P/ H# p5 G$ [' _& Q1 q char c=csym; csym=0;
( q: m) Z( n3 E9 } _ switch(c){
4 L* {: _& r) o0 I5 U1 n6 ] case '+':return t[0] += t[1];
% k: s3 [8 s# H" W7 N% e0 h case '-':return t[0] -= t[1];* Q+ b6 ~1 E. _! j; t; L b0 Z
case '*':return t[0] *= t[1];
) r+ ^ g' {0 H default: return t[0] /= t[1];//case '/':' z: P0 Y, d1 B3 j. s# w% k. i
}
) z# J" c. M' Q) I; H, m}}
5 y2 D* Y% \4 c v. T4 Utemplate <class _T, class _Tstream>" @1 |3 ]5 B$ @- f7 R) s
/* _Tstream: inputstream, _T: get return value [$ h, T/ }: j& k$ ~8 U6 k
* Return nonzero if get value successfully */' ], b% N) @" O9 ~0 A
int GetExpValue(_Tstream& istrin, _T& nReturn){
. N* k* ?: w' e, j& Y) l _T t[3] = {0}; //雨中飞燕之作. h B* u6 \% L) Y
char csym[3] = "++";
) u2 ^8 M9 R9 E& m* D8 O int nLevel = 1, nERR = 0;
, |. E B: `, b& t. y. V" D if(!(istrin>>t[1]))istrin.clear();1 P8 o' ~. ]. v/ `
for(;;){
3 p7 }# T1 X# N3 j% p T if(istrin>>csym[2]){
9 V5 n! a: R# P; F M+ s switch(csym[2]){0 R) v- A! K3 H7 P1 ^6 w
case '(':
$ e1 t" q4 d q5 L D if(!csym[1]){nLevel=0x100; nERR=1;}else
1 e: J% w+ P% M @- L if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
* u) }) ~: j* p6 J1 d1 ~0 Y else{nLevel=0x100; nERR=1;}
+ J) Z/ b2 y4 R8 {9 x; a1 } break;2 s; B' p! |+ G# M
case ')':
" g; u; y0 Y" A$ X) p! a. t {nLevel = 0x100;}break;' e- \8 d3 S' j/ x! y0 F
case '+':case '-':case '*':case '/':, ]% n! x+ `8 v: j1 j& D
{csym[nLevel++] = csym[2];}break;
. s, p! r3 ]8 {+ q% E; L9 Y4 Q case ' ':case '\r':case '\n':case '\t':continue;$ L$ @. [, T6 d- {+ S+ X
default:
Q+ ^: S- N4 E6 G$ D) f2 L% N {nLevel=0x100; nERR=1;}* p' M# {0 W2 G m. a
} m! y' H0 @, x' g2 c
if(nLevel==0x100)break;
. V8 A5 ^, V5 s$ } if(nLevel&0x10 || istrin>>t[2]){9 H# d/ O+ U4 [8 w8 q
nLevel &= 0xF;
3 m9 g0 R( y, P Q if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. z4 [4 o5 E% E5 M8 j9 X if(csym[1]=='*'||csym[1]=='/'){0 |1 F" ^; n; F+ T1 U' z+ q3 Z' K C
GetExpValue(t+1, csym[1]);
4 ^; C, F& l1 J4 s. @: j& a }) M9 o8 d. G/ A$ l6 `
else{
9 u4 _; k, I9 ? f8 n GetExpValue(t, csym[0]);
' Z2 {4 ?: I+ B/ J* ], g t[1]=t[2];csym[0]=csym[1];csym[1]=0;' V/ g2 g" v7 O2 H' P
}6 T& M% c- m6 z9 I0 h& Q# A6 I+ _7 a4 E
nLevel = 1;
8 X$ J3 S! ^! U# ~! d }
2 Z4 F6 \5 R* F% I2 A else istrin.clear();
% Q0 L5 |0 D$ p1 \4 ?) L0 D9 d }* T( q+ |$ X, T1 k
else{nERR = -1; break;}! ]+ }3 L9 {0 H6 z6 R
}
3 [0 ?- w3 |5 h4 U. Z if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);2 S/ |3 v% T$ g6 }9 O
else nReturn=GetExpValue(t, csym[0]);
; j4 e; k. O1 Q5 Y' ?" j. N return nERR==-1?1:0;
- v; ~3 f8 r+ {0 P. t) Y% {3 z3 N+ o}}
% m: B) g {; K! j" `) c8 y1 c& R8 c: x4 I7 U1 a) Z
! R/ M; L& L/ S- S2 H% D$ J
2 Q3 w/ `8 z ]( I函数模板使用示例:6 V0 o/ M ^& V& ^0 d0 Z; k
在以上那段代码的后面加上以下代码:
( a+ A3 ?* `5 K# p) `& Z2 a; ^: i8 ~. s! }
: P6 h& ~( ] @4 H; L- Z
5 X3 m/ Z/ S9 y0 F$ E程序代码: / W3 a M1 Z2 Z; A% {/ n
, N7 v# `# W# `/ Y `- X% K#include<strstream>
: J2 O+ _. ~9 b1 r+ g8 O#include<iostream>
4 ~. F- l( o2 ]#include<string>
6 R9 ~9 Q0 }3 f4 f, S0 a0 p, Tusing namespace std;2 {7 x, T7 a7 Y
int main(void)
6 u4 ~5 h+ Y* E7 W! H$ x7 b{
+ P8 ~6 P5 A$ g+ k6 S; _2 i8 a* T string s1;
( p; f4 x+ o9 @3 f: j6 l while(cin>>s1)- S! \0 B6 q4 F1 m. G( \8 o( p
{
* J/ ~9 m J, W7 Q* t" h istrstream isin(s1.data());
& p! c' [/ P, z2 L double d;
' Q, \; E( W9 }( |9 E if(fy_Exp::GetExpValue(isin, d))6 `4 T; g" f0 F) @6 n8 d
{
; d* v: i q) }: C" w cout<<d<<endl;- S! q4 T6 S# b) K/ w8 D1 {
}( ]: d: E: Q% ~$ q, z. i/ E
else
! E0 d8 |" b; T4 C {
/ M% H* V3 `! \+ O& Y cout<<"ERROR"<<endl;
( V6 L3 g$ U8 B }
1 O* \0 a* b% p! ~ }
3 d# ]3 i' r0 h! s$ z9 Q1 D- j1 D return 0;1 }+ C5 I1 V$ _! n; p
}
0 ~/ e; c9 b- S; M% l$ t) \, g) ^8 H
# k( Q; ^5 L: f: C3 t$ W
然后编译执行就可以了(*^_^*)* W( T3 I2 s! n5 Y: F
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" ^0 ?5 E/ C" O( A0 d 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|