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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,9 A* Q* c( W3 r$ U
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& o1 r2 s& p6 s( F; I只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ N( ]3 I" d- L4 ]! i5 S& I
参数解释:% ]* p4 n5 A" m: s
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
+ B" H% G! f6 s! e8 YnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' ^- F6 v7 E& n- f8 H% H
返回值:
2 {, o- }8 ]* R$ }( D/ Q4 o返回非0表示计算成功,0表示计算失败有错误
' z* c9 N7 G. B# c0 D- n6 D5 X, H) @2 _4 D* f& R6 n, f+ q
- Z5 {# o4 \ f# r2 `
* }& A0 w6 r: i. P3 {
程序代码: ( \7 \& a" O( d8 {; r& G, Z) F
" P6 Z% ?; \0 w" @namespace fy_Exp{) |& u. m( M# n' T- f, s$ v! L
namespace {template <class _T>' ?2 M. q& f+ W0 S( Q/ g
inline _T GetExpValue(_T t[], char& csym){; A, O) _1 R" W) ~
char c=csym; csym=0;
^( K& e9 B0 p6 j7 [' Q switch(c){
0 v& B( d+ ]2 V& S0 f2 i1 e# s case '+':return t[0] += t[1];7 b0 `1 L/ Y9 R4 n
case '-':return t[0] -= t[1];
! `9 F, B& X8 J case '*':return t[0] *= t[1];' q& ?4 F# K4 f) x8 @
default: return t[0] /= t[1];//case '/':
4 { L( z: q5 {, q& n }
@) q0 t5 v1 O" ?# L) ~ y! h}}
$ j2 C& q( o$ ]* qtemplate <class _T, class _Tstream>
* j! b5 ?1 r. x; k/* _Tstream: inputstream, _T: get return value
- p8 r/ S+ } u0 P! |; [: ?- Z* Return nonzero if get value successfully *// K, ]& c& L7 B% _1 z
int GetExpValue(_Tstream& istrin, _T& nReturn){
) E; M7 k% x& \% l- w1 Q _T t[3] = {0}; //雨中飞燕之作* {( T* H U: `) ^
char csym[3] = "++";
! G+ r- o. j7 Q int nLevel = 1, nERR = 0;8 h% J, b( s1 m7 j# l' @% j
if(!(istrin>>t[1]))istrin.clear();" B; o7 z1 }, Z J. `
for(;;){ V- ~( s2 n: ^, O' _
if(istrin>>csym[2]){
, m5 A6 X6 _7 l! d1 Y0 L& a switch(csym[2]){. u4 |$ H# J( d) Q
case '(':, i8 Y# c$ t# H
if(!csym[1]){nLevel=0x100; nERR=1;}else
# {- M6 A* u7 Y4 l- g9 G if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ j ^6 K+ S1 e' M2 w else{nLevel=0x100; nERR=1;}
- q8 m4 Z4 }0 N0 Q! l$ q* l* S break;
8 X6 p* d8 K3 I2 X" M0 v- O case ')':
9 G1 g! @+ h- c! H+ ]- e# A {nLevel = 0x100;}break;5 @! p- D" V4 B
case '+':case '-':case '*':case '/':+ Q( o S3 G7 r* f
{csym[nLevel++] = csym[2];}break;
; z# H. A7 q" S; j case ' ':case '\r':case '\n':case '\t':continue;" x1 V& X7 m( y' {9 L9 i
default:
8 \- P! S+ |0 E/ e. C4 x {nLevel=0x100; nERR=1;}2 R* Y+ i# ~0 U" o& Y% N2 P2 j, o
}
. x" }/ C/ e* \: e3 {8 D if(nLevel==0x100)break;
`/ m. a6 E! g( ^ b/ g7 Z; O if(nLevel&0x10 || istrin>>t[2]){
3 N* j" ?. O) C1 \+ ^0 }& s) ~ nLevel &= 0xF;! G6 X0 T+ X. ]6 F
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, F& F Y/ z; a' `% v* D
if(csym[1]=='*'||csym[1]=='/'){; `, ~8 h9 o/ ~7 }* j3 Y+ J
GetExpValue(t+1, csym[1]);$ M% n; u7 J6 J1 ]; T! B2 _
}
0 s2 x" B+ Z0 a( Z/ I9 d else{ T& A) U- H" \8 T- t( k8 L( z
GetExpValue(t, csym[0]);: x" Q9 W2 N& z$ ]) J
t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 a) l5 w0 {# c* x# f! c
}, ~- @, o( H, y+ [+ x/ q1 V
nLevel = 1;
, T9 u) ], G) E4 Y0 z& ?. ~ }6 V* V* ~5 m! \1 j4 V3 J4 F8 }
else istrin.clear();
, L* ?; }& ?' b Q: Q }
0 R* M/ ~! |* W( B else{nERR = -1; break;}
* N! \# s, F3 i, c0 D( @, Y. u' b }
5 I- A; C$ z3 n7 j if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
3 p4 ]8 h/ `/ @% e else nReturn=GetExpValue(t, csym[0]);; q" g2 y- \. ~( q% m5 Y: D) G
return nERR==-1?1:0;8 F; n' e- O1 f. l8 X H
}}/ A9 ]2 n" p' h6 I/ \% k: g
% v3 O/ p9 s5 A& @# X$ o5 u7 e
* J, ^ l: a" g# H4 V6 x& P
4 L) O5 h) c2 D% ?5 c" w函数模板使用示例:! [: X% e7 `; X4 m2 ?
在以上那段代码的后面加上以下代码:
- H; s2 }4 {) o& ~/ G- F) R$ H6 L+ P2 R" L7 B
' c4 A( B- B# t% h: N; T
$ F5 o2 a2 V8 R% H! B- z* q9 w u6 z程序代码: & d4 E3 W! f, d
" z: F, T' d& |+ Z$ z: q#include<strstream>! P ~8 B3 N2 o" p& V
#include<iostream>
! ^# \ ^( n4 ~; v#include<string>: z5 y/ z0 N$ X; ?9 _8 {" C
using namespace std;
; c! X5 y. @# h: Jint main(void)
0 O1 v. y: K3 b{
$ O0 D$ W: n/ _ string s1;
' X; e; i7 Q. p/ a7 \ while(cin>>s1)
1 m6 |9 I5 B" U4 P {# u+ }: ^( B. [& l& w5 Z
istrstream isin(s1.data());
2 V% z( f, N" ~# G double d;
: H0 y S* C& y# l* z( u+ H if(fy_Exp::GetExpValue(isin, d))
1 C; C* O" v6 T4 _! Y& ? {* l4 E6 A- p. T( W' |6 W
cout<<d<<endl;7 a0 L3 B F- y8 p! Z" P
}
6 e2 Q6 \' H, { else
* X# F! M2 _3 l% i- n3 f* y7 X0 D {
# o: k6 U. o0 R cout<<"ERROR"<<endl;
; P4 [7 \- G; R9 k9 W ~7 O) `9 ` }
5 ^- j) j6 H/ } }/ M+ s* K: l2 s( C
return 0;
. x+ l3 w/ }. A3 f c}
) r$ F5 G, A" t# q; c# s/ u( U7 A& N# x
: ^! {" { Z8 Y然后编译执行就可以了(*^_^*)" H; q4 e1 G* { W
其它:TC++上一定编译错误,不保证在VC6上也能通过编译( m3 {( \& {, a, G% ~
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|