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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,) s$ T& R- N% o- J: D
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& D: r0 |4 f1 H6 }7 ]$ K
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( p6 Z" ~( Y$ n
参数解释:
' c3 j' q$ U4 V- D' mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" o$ ?- e) ?. p7 ]; b) w
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: g3 w( a9 \# L2 E+ c返回值:
7 z7 C2 [: F3 T5 z返回非0表示计算成功,0表示计算失败有错误- ?7 Z, Y6 z4 g5 C( U
& w; c8 A: Y' ~! M- m ) r) ~1 Y$ M; c' e! V2 b# j. `
9 [9 z8 m, m( P& B, S8 q8 g4 D
程序代码:
& f/ ^6 p% j( Z+ \4 w
/ Y% J# Y6 Q5 H( L7 }namespace fy_Exp{
R7 W- g2 L: A. Q8 Q; ?namespace {template <class _T>% W1 @' A3 T9 s: x& }! s& ~
inline _T GetExpValue(_T t[], char& csym){( G' X- U- {& X. y
char c=csym; csym=0;
/ t- E* A: K2 R5 } switch(c){1 c# k4 v3 j+ ]. C- f# A& ?
case '+':return t[0] += t[1];
- ~ x7 I# ]' c; j, d* T2 [/ Z case '-':return t[0] -= t[1];
& ]9 j$ _* s- w6 R case '*':return t[0] *= t[1];" m0 p- G/ E, ?& Q
default: return t[0] /= t[1];//case '/':
; ?: V7 n2 r" x t k } b: E. X1 T d) m* d1 E2 A
}}
; b0 `- N0 U& u6 t* @" Mtemplate <class _T, class _Tstream>! l: }1 I& y4 {. A5 |9 P( l
/* _Tstream: inputstream, _T: get return value
$ T% M# d% @8 g% ~+ l* Return nonzero if get value successfully */$ k) U! m6 S- J/ u1 q9 ^% P4 _
int GetExpValue(_Tstream& istrin, _T& nReturn){; U# F9 k( J8 ?+ O% v! E
_T t[3] = {0}; //雨中飞燕之作
" [2 q8 T% o: I8 s char csym[3] = "++";
3 l( i) O, z7 ~1 V& V( c int nLevel = 1, nERR = 0;8 w0 q; A$ L/ r" M$ P
if(!(istrin>>t[1]))istrin.clear();
O6 q5 R# @+ f5 s( N( K4 [9 y$ n for(;;){/ m. R5 D& S2 U
if(istrin>>csym[2]){
; I6 K& B: D) I1 V6 q" G switch(csym[2]){: r1 \% }9 a$ j$ ~
case '(':! A! Y. f7 v! L2 |9 @
if(!csym[1]){nLevel=0x100; nERR=1;}else
% k) F8 t" N& b+ C4 P. C if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 M5 N' f+ C: r, g( L0 i9 q& o else{nLevel=0x100; nERR=1;}
, V+ x. x4 Y! t break;7 [; w9 J" N& L* m# x/ @- }
case ')':2 q4 y" T* i4 H
{nLevel = 0x100;}break;
( }! X! p# Z s! M( S- N case '+':case '-':case '*':case '/':
1 M% Y' b! Y/ R1 o {csym[nLevel++] = csym[2];}break;% [& T- B7 U- y u
case ' ':case '\r':case '\n':case '\t':continue;
; c% J8 a& y3 V, }5 ~+ c default:
1 b- U( V- T! [ K$ z7 u0 G {nLevel=0x100; nERR=1;}4 w+ } H; n6 e
}
- W/ g( i$ i* H if(nLevel==0x100)break;0 J6 p H3 R0 A# d
if(nLevel&0x10 || istrin>>t[2]){$ g' e; Z, s: {0 J
nLevel &= 0xF;( L4 m p" M6 `, f! U( {& @( }
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- ~: p8 A( S0 j if(csym[1]=='*'||csym[1]=='/'){& n' V, x; J1 D5 D
GetExpValue(t+1, csym[1]);
8 k0 l0 F( Y3 w0 ^0 r5 F }
6 T; N0 m; Z: a/ l7 q else{# H% E( j5 e! J6 p6 s
GetExpValue(t, csym[0]);
8 y3 { ^! X6 ^; V+ ~* C9 P) a# k t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# o0 D e6 I# E( l4 E: b }
- b9 P( R- }8 V2 ]; ]. Y3 Y1 f nLevel = 1;' ?: _+ w8 T8 \% w2 B
}1 \1 p5 ~6 W. i$ g" a" V% r
else istrin.clear();- C0 N& ?3 ~! c8 D5 y0 ]+ u
}
- I* X5 J+ L+ u! [ else{nERR = -1; break;}2 O4 k' S7 h! ^ C0 B3 {; H; A
}1 U; A f5 e9 D
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 j4 o g& [- O# [- K3 ]# D else nReturn=GetExpValue(t, csym[0]);
- W! v: i; r0 \+ r, I2 L; ~ return nERR==-1?1:0;3 k% R3 a, X x! H& I# F
}}
% p% A4 z4 [# w; I1 w d
. E. Z, g1 m2 L0 {' H5 O3 [
. [" m# p! L' x' s" U( ?! X9 `4 i. ~4 u7 ?0 [
函数模板使用示例:
. b; L& G! `! |在以上那段代码的后面加上以下代码:) k+ q- `! S) C/ T) @. A7 s7 m
5 z: `7 T" t( _" }) J5 i
: z6 ^- K" S1 m k2 k
1 J; `9 t+ `+ i" V% p8 x4 `. P程序代码: : H; C& U1 K* C
5 Z0 g! \! L7 I |#include<strstream>% Z. t' J- i4 s/ \) s, N0 z" L
#include<iostream>4 n1 _9 w& U* Y; h
#include<string>
: ^" |+ E' N: Rusing namespace std;9 | m+ c: a2 T' \' {. c/ B4 g
int main(void)
1 i# p5 w4 W' T9 F. v3 |' Q{
+ x* f9 J" H0 `# N; e7 W string s1;
% m! `, }: B# G while(cin>>s1)
K# U& ~% v \ {1 O' X, z5 f% ~1 B% n# }
istrstream isin(s1.data());; R. ^$ u& k* l1 r. W
double d;% k) ~8 k. |" s" {, C3 H% D
if(fy_Exp::GetExpValue(isin, d))& p* V2 ?' A# y& J! q1 }; |* V% P2 k
{
- ] @6 J- l% j- l6 E- c7 n cout<<d<<endl;9 }1 M Y6 f0 ~
}
# a c6 t9 P, k0 r3 C else
/ |, z$ u! w0 t% Y& c {, K7 G, z) H! _# o) p: f; Y
cout<<"ERROR"<<endl;( A$ g: c7 X$ i0 S5 v$ o
}
! [# O! V4 F( x% k+ p8 ~8 z }
- P/ ]% |9 ` n! V return 0;9 g8 A4 o6 W2 }( v+ Q
}
+ c/ C) @3 w3 o5 R% @0 D6 N- ^$ `, [% P% g4 A i
0 H: s+ q- p# C: Z然后编译执行就可以了(*^_^*)& F) ~9 q1 I, T: e' q$ F
其它:TC++上一定编译错误,不保证在VC6上也能通过编译: i- B( J; w9 j$ [, C0 P
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|