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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,) U( d4 l# F7 b! ?- x, E) U' @
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ o( o$ W2 q; J) `3 l只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn) ]" d0 A' ?, O Y' d1 ]
参数解释:
1 i8 f9 P/ U/ distrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 \6 J1 z4 l- t- a( r" VnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
?6 }( o- Y* f9 n0 O$ d返回值:. ]- o) ]- e, @2 @7 y. m! D$ s
返回非0表示计算成功,0表示计算失败有错误# s5 Y" s+ |- V+ a
2 E/ N0 D6 s- a D9 l
2 g" w2 |- W; z& _/ e' s4 D) |6 L8 R$ a# p
程序代码: 6 ~+ w; A! n& ^. Z& ?. {
) L8 S2 t) i* Dnamespace fy_Exp{8 {4 m* B2 x6 x* b" G3 o
namespace {template <class _T>$ [. ~* b! c( v3 e
inline _T GetExpValue(_T t[], char& csym){
, P2 y5 X5 b+ ]% o char c=csym; csym=0;
7 w: s( W5 M/ _; z0 q$ ^ switch(c){
B3 F- L& o8 z case '+':return t[0] += t[1];
4 J2 [) D3 w* [8 Q4 R case '-':return t[0] -= t[1];5 y( Z1 g! v! m& C, ~
case '*':return t[0] *= t[1];8 k f" m' Q1 s' [) i
default: return t[0] /= t[1];//case '/': ~# B# d7 W- ^) m ~8 E, Q6 ^& V( q
}
6 {* N, m! a2 `. Q" C4 q0 Y}}
' V1 {: C J" K }$ c2 k8 itemplate <class _T, class _Tstream>
T1 m+ E$ r' c! M& Z! _/* _Tstream: inputstream, _T: get return value
5 K) H- M" T, @( x" x+ c* Return nonzero if get value successfully */$ s4 j$ `# u" C1 A
int GetExpValue(_Tstream& istrin, _T& nReturn){$ l* I3 R) r9 }; ]7 {
_T t[3] = {0}; //雨中飞燕之作+ `( D4 L/ V% g6 ^7 b( g. M e
char csym[3] = "++";; ?; ?( B5 O- {3 _" t
int nLevel = 1, nERR = 0;
% Q8 b/ ]1 T |' V9 Y2 Y0 \ if(!(istrin>>t[1]))istrin.clear();
! T/ W6 e2 J( j q for(;;){
# A& W- U2 O% p- f: H if(istrin>>csym[2]){1 F7 r3 ^2 i, M# z' @( f$ _5 Z
switch(csym[2]){1 ^3 A( x; q& A U6 B' V
case '(':
% l# x" \: E1 Y: k, h5 Q7 F4 M if(!csym[1]){nLevel=0x100; nERR=1;}else
* S9 {" H+ T& U- ?. G. | if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! s2 B6 V# m0 V% y2 I% v
else{nLevel=0x100; nERR=1;}$ k2 F. b, M0 b( O
break;& n1 W t- e2 G
case ')':
|4 A! B' i7 A6 l) a {nLevel = 0x100;}break;
2 ^8 j+ I4 q) }# m8 b! u8 g) D6 q case '+':case '-':case '*':case '/':; u, p& [+ l1 ^" b7 c6 S! Z( W
{csym[nLevel++] = csym[2];}break;2 S- Q& A H( \0 n
case ' ':case '\r':case '\n':case '\t':continue;3 ?( N5 a1 D$ b' c7 N
default:* I) _% O3 Y- w( s0 \4 c9 m
{nLevel=0x100; nERR=1;}
! B: U! E- u. C( ] }
) J! ?; q$ V& t if(nLevel==0x100)break;
, h8 O/ Q/ f+ [& K# n$ i8 Z& ^& q if(nLevel&0x10 || istrin>>t[2]){
# F4 D$ R, ^4 z nLevel &= 0xF;
9 n, H. f9 p7 t3 _ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! J; _% l! q& ^+ h* Q
if(csym[1]=='*'||csym[1]=='/'){
D) ]3 r) S6 W/ N2 B GetExpValue(t+1, csym[1]);! ]7 E! W& t4 S" R4 q/ z
}
0 M% Z1 H* A. Q* Q2 E) e/ d else{; H6 k9 `1 d0 e" y! w
GetExpValue(t, csym[0]);5 U8 j! O x$ d' v* t' b
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ b0 N" o+ i* b7 Q/ f }
: g5 {$ X$ n& m( G1 {; B& a3 m nLevel = 1;3 e( J8 ?8 d; e& ?
}3 a9 {8 C; k. Q0 N, m, L
else istrin.clear();
3 r* v: l# f/ H; V: ?) U+ Q }" `+ t3 L% N) a: E0 D
else{nERR = -1; break;}
! X; j, j4 |( w' A/ U }
k0 @4 W y; V3 f0 g6 A3 B if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ H; p T' e; u- r! H
else nReturn=GetExpValue(t, csym[0]);5 X. e3 _: `, ~- H! @* Y7 I; i
return nERR==-1?1:0;
( w, v' @& {1 }% q! b2 y g' X}}7 ]' t3 L0 E3 J2 c) q
0 P" S, r* H$ X, q5 r) c" [( F7 j$ p) M/ U6 s* @- q
8 t' j; R( O% Z J% C/ u: Y函数模板使用示例:: Z) T; O2 M6 O
在以上那段代码的后面加上以下代码:
. D0 d& S8 b8 x' c, W( z( j
. z2 S+ \) ?4 F) w7 e* B8 ` $ z8 Q( ?* E; `' c# l2 E
& j' M4 G: k6 m c
程序代码:
: K9 f; a6 N5 m5 E$ Q% K8 k* t+ j; q. h$ [; q
#include<strstream># [3 y4 [, t8 T- I+ L% T9 B
#include<iostream>
' s) r9 p* y" c8 U#include<string>% u8 s+ U7 z7 h. t% ]5 x
using namespace std;
3 z; Z9 n2 U4 T3 R/ Y" z& Uint main(void)
P; F, e0 G/ r% F4 J1 t4 G Q{
6 ?; G, X$ \: w3 ? string s1;; `- M, D, z. g7 X9 X
while(cin>>s1)
: R7 H( {6 |7 `3 Z3 F9 u {
# r* D8 e$ @4 [( V3 P) z' E/ _ istrstream isin(s1.data());
E# k0 b; R! V/ h7 }- V3 R2 _ double d;* b( d9 \% B( Y4 Y$ e" y; l2 `2 `
if(fy_Exp::GetExpValue(isin, d))! l* D5 O0 j1 R4 \) {3 L7 M
{, f& ~* a5 P3 y8 m0 R: r% |
cout<<d<<endl;, o7 {/ S* A0 D4 f* k1 J* |. o9 h
}
9 a4 s5 J5 F% p- Q else4 {/ w# H u: @
{( V+ ?( E5 _( O$ I \
cout<<"ERROR"<<endl;5 W; p+ u) I e+ R2 N- F
}0 z" v3 ]/ P; L
}) w) x; `( ^: b4 d+ a2 _
return 0;
& C7 f( l4 S g U' _. C. c}
# A) [4 t) a( m& c3 C( @, _+ X; X% m! a+ K" w+ S* q
1 n, h: m) }' i) ?: ?
然后编译执行就可以了(*^_^*); n6 f/ |( T) }
其它:TC++上一定编译错误,不保证在VC6上也能通过编译5 U7 t- S5 i4 [- L# X: S: O! _
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|