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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,) H/ I3 _ P' i* s3 y! s
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式5 ~( t _9 P9 V! C% k6 ~1 X5 s
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)) s4 b( a% G& s8 ?( N# ~
参数解释:0 l8 }) H; r7 D
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
* i( J4 L, j- MnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# k \2 W" p, g返回值:+ ]! s! Z+ m Z
返回非0表示计算成功,0表示计算失败有错误
\; i, B4 K9 M
; d3 j1 n& x8 I% X# i; V
1 ~3 F" Z0 l9 M0 d8 T3 r, }# v- q1 E L# L
程序代码: ( Q7 [6 ?5 W' D
) v% y2 Q7 q& C2 I6 anamespace fy_Exp{9 D+ m( m2 N3 y6 X4 t
namespace {template <class _T>
6 V' N9 z% y7 v+ Dinline _T GetExpValue(_T t[], char& csym){
& x9 q, e# ?" K% Q+ ^ char c=csym; csym=0;. R5 }3 S7 C6 C- ^" {
switch(c){& z* z' a0 F! B7 m+ d5 u
case '+':return t[0] += t[1];. o/ W, f# d8 M- z& [8 S
case '-':return t[0] -= t[1];
% T4 y/ W6 O# i, R( l. f$ j case '*':return t[0] *= t[1];
- @/ N# |# A( N# _ default: return t[0] /= t[1];//case '/':3 x0 o& O# n3 |4 R: b7 F
}
1 `! A7 B& |0 @& V* [/ V0 z}}/ y/ c. q+ E, I0 q5 i
template <class _T, class _Tstream> @4 z( W \7 q' x4 b+ q
/* _Tstream: inputstream, _T: get return value( e1 x& L' D' @& p% r
* Return nonzero if get value successfully */2 T% Y: E5 j! v+ m" \' L
int GetExpValue(_Tstream& istrin, _T& nReturn){
( d) N9 E, l+ h7 l _T t[3] = {0}; //雨中飞燕之作1 a; k1 S7 Q5 v U2 o6 f$ y ~
char csym[3] = "++";
% O. p) N2 J8 A3 Q, C int nLevel = 1, nERR = 0;
/ n! |0 c5 ^# x$ F. ^3 N& {2 W; H if(!(istrin>>t[1]))istrin.clear();
. |" ` a+ d3 @& Y' T6 H$ L for(;;){
) q$ `) _7 B& R9 [" T# x% G if(istrin>>csym[2]){
2 s! z7 h0 x7 _7 [9 k switch(csym[2]){
& \, Y' j( T/ c1 t case '(':7 w- N& M! n1 L& M2 W7 L7 t$ K
if(!csym[1]){nLevel=0x100; nERR=1;}else
' J7 C8 R6 o! o$ N q if(!GetExpValue(istrin, t[2]))nLevel|=0x10;" D) h+ w; P( O. B' J
else{nLevel=0x100; nERR=1;}
" C+ L0 m; D) H# y# m% ~ break;
& b- |3 \" N/ `# L1 ], L0 } case ')':' M4 C# v( O s A! _6 h D) l
{nLevel = 0x100;}break; d" c4 N. l( h2 W9 O
case '+':case '-':case '*':case '/':7 ^1 {0 O5 q' N( } z
{csym[nLevel++] = csym[2];}break;" V8 F e. q! J: s Q; ?
case ' ':case '\r':case '\n':case '\t':continue;
+ V9 k4 T7 g3 Q' w+ e default:( _$ [7 a; q% Z3 A3 j6 x
{nLevel=0x100; nERR=1;}
$ V' O* s% K# N% G! F1 w+ d, ^ }
3 R2 U9 S7 f$ r' S if(nLevel==0x100)break;
: R1 `( W, S9 L$ A* ? if(nLevel&0x10 || istrin>>t[2]){
3 C3 L, E/ N) }. s' o nLevel &= 0xF;
# d4 a7 T m( D4 t# C3 } if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* B' k7 p) p3 t( K6 v6 j% S
if(csym[1]=='*'||csym[1]=='/'){, V0 R6 P( Y0 p1 q8 O- y
GetExpValue(t+1, csym[1]);
& V. a% Q/ [$ R$ ~0 q }
6 @6 P7 v5 ?/ Y6 O& t else{. [+ L! R, a1 M& w8 o* _. e+ h- @+ r
GetExpValue(t, csym[0]);
* Z* o) ?) H+ z, T( d t[1]=t[2];csym[0]=csym[1];csym[1]=0;' E2 |. J8 p' u; K. D5 _+ t a
}
X9 w( u( P/ }: j2 ?( h nLevel = 1;1 a9 c7 \, {" |4 u! _% m# }/ i
}9 z1 ^: B. Q9 C/ g/ U# H
else istrin.clear();: V! O% f& g4 Q2 P5 |' J. _0 t& g1 ~
}
$ g* H8 h/ o) w2 G$ j else{nERR = -1; break;}
/ o" e* ?4 f% l }
% v! J2 Z& G- h' v if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
0 `: }! g+ v5 N( U! C [ else nReturn=GetExpValue(t, csym[0]);
: W% |1 z, t% U; |7 T; l/ n; N2 } return nERR==-1?1:0;( u) O' W' y/ k7 G0 N. t* s2 \' h
}}
. d3 P2 X( a" v" V9 F, ]1 Y
* B7 D' E+ w2 N; Z; |, o
! H; ~ o3 R1 I3 e
, A& y& ~8 w# V* [函数模板使用示例:- ]" t- M% r2 r# }
在以上那段代码的后面加上以下代码:
" q$ u# m6 e& ]9 z$ g, m7 o' Z8 f# c0 R$ L4 D
* q1 N4 }" A/ F0 p: J7 U# }0 V& j: o4 N7 _, ]+ A7 _' R9 o
程序代码:
5 t8 {" W2 Q1 e8 l# F+ j( {9 Q2 N, e6 D; j# ^
#include<strstream>
; G' N3 P" G2 A- @$ ?8 `#include<iostream>
' v3 |7 u; K$ T' x# e& i T l#include<string>* A" h4 a& ~/ h4 n
using namespace std;0 [% ], I. ]) B" Y" J( G" E2 T
int main(void); I8 `9 c) L0 i. H5 b* v
{
5 X# H& u+ V3 K& f$ d/ @ string s1;
7 R# g+ E* D+ h: _# ?0 N while(cin>>s1)/ i0 ]6 X+ G# V3 E
{
+ e0 v( Q1 A8 O. m$ d istrstream isin(s1.data());
( S8 d: ]8 z; m+ i0 g5 T double d;
! Y% b( T) B) n% t$ [* v9 M if(fy_Exp::GetExpValue(isin, d))5 R' S+ O0 q2 i3 O* `% Q
{
' `3 M# t) T/ a4 l9 i' E cout<<d<<endl;
+ @% W& n$ ]# |8 q& g+ A0 P }
: ]% F. t/ V e/ n: [ else
. }: h9 A- ]" Z4 z, `. R* s, l {% E `' P+ h# t' O3 F- s
cout<<"ERROR"<<endl;+ u/ E+ b5 N4 h" u: V" g% _: y
}
2 R7 v/ }& }3 i7 [ }
5 n2 [3 `7 U# ]" o, h8 @) M! \2 V9 D, M return 0;) h% v5 t: j$ I* k' @* {) J
}
% a0 A( O4 ~- c9 [! W2 @1 H6 h9 z4 E$ K8 e
* Q& r9 N* X4 ], \, s
然后编译执行就可以了(*^_^*)
, s' a% G6 x( S4 _0 X其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 G, a" q) a- P9 }3 j) U, b0 ]2 h
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|