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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,& e7 a0 y( q. h1 E0 v
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式, Y3 F9 e5 u7 U- W
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 `% Q2 J+ D+ z参数解释:
7 D* o. G1 s* ? tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* K# M- _" C c6 Y
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 D5 z2 Z5 q! w; i9 e7 v
返回值:
6 g! T4 u ?6 v; x. a" U. [* x% z返回非0表示计算成功,0表示计算失败有错误+ T: G/ n+ D8 C
3 A# ^$ R, J! W/ U; @7 L, _% L
4 q6 @0 k- @3 U9 y" ~* O
- [( \! g$ |& b: v; M: I& X程序代码:
7 C0 i2 _2 |7 @" f
) q, O% K$ t( S$ i5 F6 C$ znamespace fy_Exp{
1 M3 @# j% k' w$ Ynamespace {template <class _T>/ {0 n" H0 K1 b9 }$ P8 C
inline _T GetExpValue(_T t[], char& csym){$ S6 L9 @1 L. n/ M/ g; i
char c=csym; csym=0;
3 Q7 o7 F& r$ H! a2 E; o" E1 G+ n switch(c){: M/ F" ]$ z6 f# D6 T+ z
case '+':return t[0] += t[1];( H( l% {9 w, X2 |
case '-':return t[0] -= t[1];) K! m* H' Q5 T) B4 \4 a8 Y
case '*':return t[0] *= t[1];( ]+ y) W1 w/ H0 G/ I7 X
default: return t[0] /= t[1];//case '/':
. u$ I! }& ?0 H; S6 ` }; w9 A& H: k2 ?1 q3 n( J5 d0 i
}}$ x; Y2 L* ^3 D) F6 A
template <class _T, class _Tstream>
( o; Y1 m- p+ A. ^/* _Tstream: inputstream, _T: get return value
x# ?/ h) U% V8 m* Return nonzero if get value successfully */
" {$ ^% J- d1 G3 c' gint GetExpValue(_Tstream& istrin, _T& nReturn){
5 @0 F+ ~. l% J1 ~ _T t[3] = {0}; //雨中飞燕之作
8 h$ E3 ^4 Z1 V& F( }0 P, k' ^- |, R char csym[3] = "++";* W$ E S H3 h( |# t/ B8 a9 O
int nLevel = 1, nERR = 0;' l% \" c2 c! e3 q( q6 q3 F
if(!(istrin>>t[1]))istrin.clear();
, r. `- I, u+ R6 V* J for(;;){/ C! ^: ` V3 ~, ?! @
if(istrin>>csym[2]){- J# B: Y8 N- }% r/ z- n' X
switch(csym[2]){5 j9 t! Z, s: o- M
case '(':
( G5 B! Y2 R$ m8 j. [/ [ if(!csym[1]){nLevel=0x100; nERR=1;}else2 c$ u; T& o$ n/ a0 n' T
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;+ ?8 B$ i1 _: n
else{nLevel=0x100; nERR=1;}
* K2 Q- Z7 z X9 r. q break;
1 K+ \3 H2 Y7 u3 V5 x3 ^8 c case ')': h6 k6 F' X( e' R! [6 }/ Z
{nLevel = 0x100;}break;8 f1 `) O: E$ N
case '+':case '-':case '*':case '/':
( z/ y5 f0 c+ P# e1 F" j7 [ {csym[nLevel++] = csym[2];}break;, f W* M! e! q0 C$ m9 o, m
case ' ':case '\r':case '\n':case '\t':continue;" Q) H5 \& m+ ^2 z6 K* Y
default:
: p% o7 R% b6 h( n" ^ {nLevel=0x100; nERR=1;}1 G0 T% l5 `7 s% h$ A- p
}, h- |& `- t! f6 V6 M; ~9 O) \
if(nLevel==0x100)break;
" B/ w) m$ ?; e$ Z$ v; e/ U# k" | if(nLevel&0x10 || istrin>>t[2]){
! W* K, a4 y6 { nLevel &= 0xF;
) p+ p, N) d, ~. u$ U1 ]0 J if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
+ ~8 _ {" |1 c/ ~5 @+ {# {: V6 K if(csym[1]=='*'||csym[1]=='/'){
( b4 r) {: D) E% |( M6 b# h# Q GetExpValue(t+1, csym[1]);
; M8 L/ w5 y7 r; L6 D }
* @0 u5 C4 n. \$ C7 C9 w else{
5 }& E/ l; w2 A; |. k F GetExpValue(t, csym[0]);
7 j7 n) W( F& S; Q' ]& c t[1]=t[2];csym[0]=csym[1];csym[1]=0;' ]' a- l2 ^5 c
}% L! Q- R& a+ v$ V9 ~
nLevel = 1;% t' m( P3 X# \" w7 j. n1 m
}
. [4 q4 J# D0 S* E else istrin.clear();1 |+ F& a5 s8 W4 F4 Y4 u" `2 m3 s; m
}5 U K: p- x. r- {$ [) T
else{nERR = -1; break;}
2 K. v/ a+ J! E$ l7 }1 C }
: U: L+ I' f# g5 ~ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) t6 Z; x! ^* h; x0 g) ~
else nReturn=GetExpValue(t, csym[0]);' p! k+ L$ f* G% V2 o
return nERR==-1?1:0;
( [8 N: ^! U3 J/ T7 c* y; C}}5 m5 o6 L5 L7 o* F, G; j( f
: z& }" S2 y; E9 L
, E) e2 ?% W" M; _( X: X) h z4 e. P& |0 `4 N% Q, X
函数模板使用示例:4 Z* [2 C- B0 d; i7 R9 P: Q$ v; @
在以上那段代码的后面加上以下代码:
6 K: a6 A/ ?: d4 f' r1 H) j8 M' I/ l! w3 Z5 C$ t( V
( H" i; u$ c& r# O4 F: `! ~. K7 D8 Y' k0 P8 n
程序代码: * a% a: O; x7 k& z3 U) j
" h# i, H! l- t) E4 Q+ t
#include<strstream>
0 {2 }# ^* s4 \/ d) [0 R$ d#include<iostream>
8 p$ P) G% { b: x6 @& f#include<string>
& p7 i* k- P" K7 }+ b" K" X% `using namespace std;; [% S: O; {; k% L; B) [
int main(void)3 ?1 M+ d6 I" z) c) D% o
{2 \/ E% [/ Z: D' E. K3 _' C& {
string s1;
/ b6 y! Y5 t4 F# b! P while(cin>>s1)
% D$ Q8 a. c: d0 ]1 v3 T {1 K$ y, r4 k+ J: m9 `' J
istrstream isin(s1.data());
2 m5 B5 L* }- h2 Y7 {1 S double d;
, R% E$ z; m3 \( l4 u# Y8 R! A* } if(fy_Exp::GetExpValue(isin, d))
& T* @4 k; A; s) [; ]. u0 i# m {
5 \, ]' L# V! z7 \ cout<<d<<endl;
: L6 V) G' z* [" ~9 b0 R9 L2 f }
J3 w9 y. L% n9 N' u else6 _5 A9 O% M5 V, Z7 j+ v
{) F" _3 Y( y7 j$ c
cout<<"ERROR"<<endl;' Y9 x& \5 K4 \6 s
}( G8 y% ]8 A# K: @
}) E; [7 ~5 \# t
return 0;
: e+ n$ M: V) \3 z% m0 T4 a2 Y}
9 t7 w( s) [+ L* W+ h& V/ G5 Y& k# s% T! x0 `$ ]. _
T2 l5 O; }* e2 ]然后编译执行就可以了(*^_^*)3 J: ^1 T2 D, b% [ I/ w5 ^/ ~7 f
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
8 N Y- s* t) H) g 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|