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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
8 U) V; Z" n1 _) |" l, `一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 o% F+ t. L4 N8 c3 p+ `( v4 N
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 I3 w: N4 `4 O7 `. }
参数解释:
% W2 d3 R/ ~4 h8 F; N; [istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流5 ]) H! n' I6 @/ R
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( I% M A) |5 I2 T( ~# ~
返回值:
9 D) A( h( V7 H1 |返回非0表示计算成功,0表示计算失败有错误: z9 L' Z- R+ _6 ~0 j3 Q& }* h
) r2 R$ `" Q8 M f
: @- g1 `/ g8 z% l+ z
1 l0 Z0 R1 F# `7 F$ U6 n" v
程序代码: ; ^% a" w$ l4 Z0 z1 Q5 Q% I8 k
- Y! D* ~6 D) S' Xnamespace fy_Exp{ Y- z1 }: {; b8 P( D2 Z: ^! }/ y, h
namespace {template <class _T>' y% J( K7 d4 ]( `) n0 q' V
inline _T GetExpValue(_T t[], char& csym){6 X3 r l1 i0 W; i4 ^5 U, a
char c=csym; csym=0;. x1 t9 g6 y& @$ e/ B
switch(c){+ u7 F# ]. M5 T1 b2 d) y4 r
case '+':return t[0] += t[1];
: N7 x0 ]5 h; n6 N$ R5 E case '-':return t[0] -= t[1];
/ U! d9 z2 N& c8 R2 g; l# Y9 ? case '*':return t[0] *= t[1];
8 f$ M: s* q3 L: \. a default: return t[0] /= t[1];//case '/':- F+ w" X" `9 E9 |* g1 N7 M7 i$ V
}
3 e! W. f0 i" E" a6 Y}}* [' ^( } f1 s) @% c' j7 r5 d, _
template <class _T, class _Tstream>: R t+ y' w3 [
/* _Tstream: inputstream, _T: get return value
' R) Q4 }) Q' i9 e* Return nonzero if get value successfully */. H: |8 J O- o* `" }, p: D
int GetExpValue(_Tstream& istrin, _T& nReturn){
4 ^' I# J3 }1 N- x; m3 V8 K0 r _T t[3] = {0}; //雨中飞燕之作
& E- m- W; w3 j7 y char csym[3] = "++";* A N" ?. M9 D, f7 _, @. Q
int nLevel = 1, nERR = 0;
, a' S5 A/ ]- `3 k, Z( T9 k if(!(istrin>>t[1]))istrin.clear();) s4 f7 R9 E& k8 A& V
for(;;){! Z" G- Q% B& S* w2 Y
if(istrin>>csym[2]){
2 l1 X! ~" b$ W- o9 J# r) i switch(csym[2]){0 }6 n& [: F) z; d2 F' n
case '(':
4 l0 a! j. _) U% j, y7 F if(!csym[1]){nLevel=0x100; nERR=1;}else
/ C7 G( f$ G, D+ H4 B0 U5 X if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
" ~: n9 c( F2 ]$ T( G* ?# l* m5 {3 O else{nLevel=0x100; nERR=1;}# `7 n f2 X7 K# T
break;
5 T) K* n2 [3 V- ]9 D& ~ case ')':
: V5 ^( X8 w0 Z# K1 v; [ {nLevel = 0x100;}break;
0 f0 l; O m$ f" Y5 A% Z case '+':case '-':case '*':case '/':; V. ^* |2 |) O! ^
{csym[nLevel++] = csym[2];}break;
D) C4 o7 D t2 o3 u# l4 M- E case ' ':case '\r':case '\n':case '\t':continue;
+ \/ u/ G6 f( E5 ~ default:
3 W/ W2 r8 O1 o( W# f6 d- K {nLevel=0x100; nERR=1;}7 v' X. ]! c: I8 X
}7 Q% T; R) t6 ]& r/ ?9 V+ t
if(nLevel==0x100)break;
: X- U) o x" z if(nLevel&0x10 || istrin>>t[2]){
# `5 D" i" }" U$ |1 i y nLevel &= 0xF;( U: d$ l4 w. @, ?* n& f
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
( ]+ B; @1 u+ L# ]+ g if(csym[1]=='*'||csym[1]=='/'){- O% ?" Q% u$ Q% u2 s: Z/ e) o
GetExpValue(t+1, csym[1]);1 F2 a( ?5 U( R8 a! K+ M* V3 ?- x
}
* v4 k6 q6 J" k U5 K' |/ p4 V9 F else{5 x- ?% G+ V6 g# b, f- [9 ^+ ?
GetExpValue(t, csym[0]);0 h$ }' b; g8 ~! k8 y
t[1]=t[2];csym[0]=csym[1];csym[1]=0;; w. v4 q0 \' s8 @, |& M+ k: `
}9 Z+ G8 g; ^$ M2 ~8 c8 d
nLevel = 1;1 ~$ _$ j" [. p' {, E& {
}
% ~9 O a' }$ S5 B7 V V9 | else istrin.clear();
9 _( C5 J A0 ~2 J1 S3 c6 o- A }
8 t6 E5 b9 ^6 H$ J- @/ X else{nERR = -1; break;}3 U, P/ o: ` w8 u/ E
}# H* W, f2 ?3 t( n& O: {
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
G; Q% E. {1 T! Y& }6 n else nReturn=GetExpValue(t, csym[0]);
0 v7 @- N7 y" \ return nERR==-1?1:0;# T% j; v6 o9 @
}}
% H; W- H, }& e2 k& ~4 B. z9 C6 _0 d5 y8 [* }# B2 m
: r8 J5 c* ^! e4 v" j- C/ p6 D
, I' Q! U1 { u: {6 o函数模板使用示例:/ m' {) {' n) y! u) o8 b7 i
在以上那段代码的后面加上以下代码:
6 ~2 D2 b4 q+ b: X' ^4 s& B6 d
& y+ a" H3 f* b7 B$ T7 Z6 w( t% {% j : U1 b u! \* T9 s' w a
5 V, j8 R/ l& A0 `程序代码: 4 h% Z G7 p$ y8 I2 o- w9 G
. G% ~4 d! N$ z) |
#include<strstream># i+ {! m) E+ s0 K1 w: {
#include<iostream>
( P1 `; K' U/ K: C#include<string>
8 |3 K: V. K! s. cusing namespace std;( }8 B2 T. q, v% ?* ~$ G8 u
int main(void): k- \7 J) |8 d1 h7 I' e% {' I$ A
{
# P; z$ _! k- f) z( j string s1;
8 L+ o0 i6 }$ R6 \- F- ? while(cin>>s1)! T. c! Z; ]$ N& Y( m: O1 d
{
$ \7 x# K' b/ I% H5 s5 I- j istrstream isin(s1.data());
& B. }' ?/ m* I/ `9 K; C double d;- L/ ~* I. g8 w
if(fy_Exp::GetExpValue(isin, d))
. j- K% q" n0 s' b1 K9 G; T {
9 d' a1 U! E: ]- c: j/ i cout<<d<<endl;
! S* o& d1 c% x7 s }+ s* q8 F6 K; Z1 X) |6 u5 K! R4 F3 F
else, D" }7 Z& i- V: G* U
{
6 _- Z( Y) r- ?$ H2 _7 ^2 n, K A+ c cout<<"ERROR"<<endl;/ s! W. A0 S r. a) j
}
, D% s& R* M, |. W0 u }, z" o; R& G& K% p5 ]! x L5 S4 K
return 0;
& q7 b8 {7 k5 x5 K9 Y4 G, `* r. Y}
( Q6 w0 ~+ \( c5 r
: e" X) X x' u* ]# V; o1 H/ {3 @0 M: f9 l( [! g/ E
然后编译执行就可以了(*^_^*)5 \6 c5 g- p: d9 v
其它:TC++上一定编译错误,不保证在VC6上也能通过编译2 m1 x$ X+ L; J
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|