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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,- [ O! L: R$ z4 ]- h' Y/ G
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' z3 U _8 E& r4 A* `
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' y" c# A8 v3 W参数解释:
4 G! k+ s! \5 O6 y3 V0 iistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
* Y; Y) r/ L: [1 m, Q2 HnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
. H, D1 g- C5 v返回值:
4 }2 l/ P: Q' G返回非0表示计算成功,0表示计算失败有错误
) I: h4 x4 N! Y& d, @+ p: l1 \
& ` {. M, m- G$ l) R# {
5 q' @+ T/ I/ C) k- P7 H2 E0 }5 R程序代码: 4 R4 }( `! n6 e- }& G3 V3 y
% T% O1 E1 z0 b1 i8 ?, K: Jnamespace fy_Exp{
' z( {5 x q2 |! h5 \. J0 W9 S" wnamespace {template <class _T>
" {3 @" @/ D- Q+ J/ b8 Dinline _T GetExpValue(_T t[], char& csym){
, d- A* o+ ^: S char c=csym; csym=0;$ i. a' d7 P2 Z. j$ L ]) |9 p
switch(c){
1 v3 j5 A) d$ g* K case '+':return t[0] += t[1];/ H+ f( R' K# f6 y
case '-':return t[0] -= t[1];
1 D- U. Y9 q7 { case '*':return t[0] *= t[1];
! l1 Z5 H( i/ F( X m default: return t[0] /= t[1];//case '/':1 g% h. n+ r" B, J5 k
}
6 ~' o" x' a5 x% u# A& Q3 y4 \}}
! K+ _! e5 ~4 L( n6 Z. Itemplate <class _T, class _Tstream>
- z2 _' ?! V9 p1 r/* _Tstream: inputstream, _T: get return value4 E C# [( J. H; |% D
* Return nonzero if get value successfully */" L0 S0 p7 @; w: o0 ~, x: B
int GetExpValue(_Tstream& istrin, _T& nReturn){( E' L# z5 {! s( y" a( E
_T t[3] = {0}; //雨中飞燕之作8 A8 v! N( {" U' W8 R+ p
char csym[3] = "++";
6 w2 M' L& x$ |6 c int nLevel = 1, nERR = 0;
2 }* G$ l3 Q+ F" A3 D if(!(istrin>>t[1]))istrin.clear();
# K1 T- O4 j& z for(;;){
* C- V F8 }& C. G- T if(istrin>>csym[2]){% ?- h- o" o7 @( i
switch(csym[2]){1 M! Q' ?' s: @
case '(':
1 A/ d% y( R. s4 a: F if(!csym[1]){nLevel=0x100; nERR=1;}else
8 S8 s3 B% ~- C; _: q- R! T if(!GetExpValue(istrin, t[2]))nLevel|=0x10;) S( [& `( m9 k! }" M+ A
else{nLevel=0x100; nERR=1;}
! m! ~0 D$ Y' i2 X% e0 V" V7 U break;
4 }; @ L+ S0 t, t case ')':2 o- Y4 {4 C/ I! z
{nLevel = 0x100;}break;( [: d; v4 G$ s) Q6 r; g4 k5 \
case '+':case '-':case '*':case '/':
, q. ?1 a/ M8 Y: ~% { {csym[nLevel++] = csym[2];}break;- i' n- H- _9 a$ M
case ' ':case '\r':case '\n':case '\t':continue;
% R/ U6 F5 Z. y+ a3 ^3 p) V default: {) y( Z, B7 Y( E* M4 B
{nLevel=0x100; nERR=1;}
. D9 t+ {1 a! q- ?' D) E+ U4 b }
( n j0 z" o; v( s2 `) q+ \ if(nLevel==0x100)break;
+ p# A" n; d, Z" W if(nLevel&0x10 || istrin>>t[2]){* k; Q6 \4 I# X6 u
nLevel &= 0xF;5 m) u; @% `& v: A
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; [' q1 z1 `! c/ f) D if(csym[1]=='*'||csym[1]=='/'){
1 C6 o+ B0 D' p5 N ` GetExpValue(t+1, csym[1]);$ I! O) ~3 K& K, h
}! w$ ?2 O; D: e% A9 X, ~
else{
& o' a: J0 Q+ a: G1 _ GetExpValue(t, csym[0]);6 m% X$ o1 Z6 O0 z
t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 L2 \8 L' n( U* V4 `( r
}: i7 {1 q* p- U$ R" k& f3 ~
nLevel = 1;; k: O* H- Q' I; x8 `7 _3 A$ A
}) O; R. Q. N) e2 Z) T
else istrin.clear();2 \# v# ]! a2 x. D) D6 Q4 H# L
}
' i. F' e6 f' ~5 r else{nERR = -1; break;} Z7 x2 ^# L" M% }
}
' a: h E6 b4 k if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 [% ]% p6 [# M% H/ r+ T& y
else nReturn=GetExpValue(t, csym[0]);) Y4 o2 J- G. X5 S7 h6 A- J, v/ o
return nERR==-1?1:0;
" [6 ~0 \2 {+ u5 ~}}
! Q4 M+ M4 C% |% c
' K, `( w1 ]' _: W) f3 m+ a2 V/ s5 I8 w9 c0 L9 O# F5 |
! c' d5 U0 [7 b. a" t) g, Z5 \函数模板使用示例:
; ]% Q& @# B0 B0 Y3 @! }' Z在以上那段代码的后面加上以下代码:. ]+ s$ g8 `0 |8 N
* a7 U4 W9 `5 {/ l
6 L+ r% O* B8 y/ r4 G. H- d/ ~* L7 r, g! Q. S; U9 Y
程序代码: % N2 K7 ^' J4 B6 a
8 j: e4 A, d) U' E
#include<strstream>+ D- V, ^, H K! C! Q j
#include<iostream>
$ {9 ?; J9 \, D) }2 k9 H#include<string>
, R+ P0 X8 r4 V4 F9 l: A: e1 ]using namespace std;
+ [: ~. `) {' f- y9 }$ Zint main(void)
3 E/ d2 f+ v' u+ B, g& n1 N$ F- ^{) Y+ E, K* M, e+ y2 e3 f
string s1;
0 X3 ^( e9 \, \. d+ L2 H2 [2 t. e while(cin>>s1)8 @) ^/ ?' I8 d
{
* J* V; K5 O1 r- w1 A2 c istrstream isin(s1.data());
; z( T, U/ s5 v; S double d;
6 e% T8 d5 K$ ?. v if(fy_Exp::GetExpValue(isin, d))
% ~7 ]* X, r6 W5 \; H" i6 {# W {
. z/ V$ d+ ^! K7 @6 x5 S8 c cout<<d<<endl;1 ]5 T" `% b. d
}
# w: X! C0 B# b; G3 F1 e else% M3 k% m$ z3 P$ n
{
/ z3 g/ L L, B4 m cout<<"ERROR"<<endl;
% O7 v& j. c0 Z }
9 B4 I6 ?: r' Z9 ^ }7 W- H, Z( i/ `% c5 w
return 0;
1 I1 t! B% r$ n4 r, D}
* R- p7 K3 R$ J9 ?6 a! @% v8 E
7 ^ C2 a; g. B& A/ }, n
: G3 f7 r; \, O( W4 ]然后编译执行就可以了(*^_^*)
5 k( f# L3 t4 K/ ]其它:TC++上一定编译错误,不保证在VC6上也能通过编译& \9 g. ^+ X& ?
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|