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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
* ?& z$ ^, [" D( G1 h+ L4 R一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ j8 C$ C6 d' r# M3 t/ b7 a( [3 ^
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! z2 o- A6 I9 c. C
参数解释:
2 c( |0 {3 R1 e. x/ {- i, bistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流- `9 U) F5 r: T% F1 _2 c" Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
2 ~0 t- p: r3 j/ j' H返回值:
7 M" k' t, |. g- Z! T. N返回非0表示计算成功,0表示计算失败有错误
1 {: j5 Z' Y5 f& `# F
0 R: e# D9 B8 b, Q2 s( K/ [2 m
2 T. u2 o! e" U( B" Q8 x G5 l: ?2 Q
程序代码:
" h* A& E: g6 I+ `7 Z z$ w$ l' a. t0 h, }$ [* M
namespace fy_Exp{
/ L. ^0 d' O3 o5 Snamespace {template <class _T>
; b+ Y% J) H9 H3 _& p3 e6 Ninline _T GetExpValue(_T t[], char& csym){
' ~" b) I, F1 J1 L8 F6 I. p char c=csym; csym=0;
' `& k3 z, ~: O7 ^$ s* ^ switch(c){
. V4 E" E# Q, b! K. j& F' y! n& v case '+':return t[0] += t[1];/ U: w* A( p2 K& v
case '-':return t[0] -= t[1];$ B9 N# }/ T0 m' E
case '*':return t[0] *= t[1];
! o7 w! M- C9 Q, F6 f! [' c8 ] default: return t[0] /= t[1];//case '/':* F! v! ] K4 B& _0 V2 _
}' m! q/ T( ?3 ~" }( L
}}
[1 G8 w; u! ]" Q% `template <class _T, class _Tstream>8 ~9 ?+ E6 y, `; O' y
/* _Tstream: inputstream, _T: get return value
* G; q( x0 E; |3 j3 S* Return nonzero if get value successfully */
0 c2 H, @9 X6 R3 a" @ F( J4 rint GetExpValue(_Tstream& istrin, _T& nReturn){
$ E; z* Q/ o, s0 n; c' m _T t[3] = {0}; //雨中飞燕之作; e# N% O8 b) P) b) F
char csym[3] = "++";
$ C8 x' ?; \3 b int nLevel = 1, nERR = 0;
# N9 r) G' C% V+ D2 u8 W- Y if(!(istrin>>t[1]))istrin.clear(); Z4 ^# g+ K! j8 c
for(;;){% Y% Z, }3 j( l! A! [; R
if(istrin>>csym[2]){. g6 v/ e, }* D2 W
switch(csym[2]){; e3 [$ g- e3 d) @
case '(':' F& V' C' Z0 [2 ^4 \/ x
if(!csym[1]){nLevel=0x100; nERR=1;}else' u0 }7 p6 X- H' N, h
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 I# Y7 G$ I/ D7 C
else{nLevel=0x100; nERR=1;}
& ~6 M6 j: O# N( z# ] break;
# K8 W# \! Q6 m. M case ')':
! z7 s) s- I! y) W9 M' Q% B {nLevel = 0x100;}break;
6 O- ?" g1 Y2 j* q- X case '+':case '-':case '*':case '/':
* g( ?0 C; q) _ u3 E9 A7 a0 T* ? {csym[nLevel++] = csym[2];}break;
`2 ?0 S' t. m3 u3 q: i1 L case ' ':case '\r':case '\n':case '\t':continue;- P$ V2 q- ^/ u6 S- w2 m
default:
+ s6 m! }/ l9 W% k" d {nLevel=0x100; nERR=1;}
/ R$ L: @- ^% A }% `4 ~3 m( z& ]
if(nLevel==0x100)break;
7 K: m# ]( W& x; Y/ d5 ^0 S if(nLevel&0x10 || istrin>>t[2]){
$ f3 q* O3 ~: C7 z: `0 j nLevel &= 0xF;
, U8 K+ B+ G9 } O if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# t2 `% s! `' [/ x8 R4 S( T if(csym[1]=='*'||csym[1]=='/'){1 C' O0 K$ ]5 O9 V/ T
GetExpValue(t+1, csym[1]);
: x. E4 `2 c) P$ w$ ~! O1 m }3 u& m& ~+ V7 I8 W: [8 D$ @
else{- [ n7 Y- p' o2 H1 t
GetExpValue(t, csym[0]);* V8 F2 W2 i o( K0 b. |
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& C: q. h" Y( F' U! f9 e }
" b7 Y- s& y) N1 } nLevel = 1;
. T2 w6 Z; A* Y }! w9 w: r3 l0 @7 ^
else istrin.clear();9 K* L" h/ F; `8 M, }
}
6 s2 I/ K9 p' e else{nERR = -1; break;}* c' ?2 ?; f9 w5 A/ y
}
+ D2 z- n E* H4 Z, Z8 q if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" a7 Q3 ^0 {" \4 w! D' e4 y else nReturn=GetExpValue(t, csym[0]);
/ G8 x( w+ }$ ] return nERR==-1?1:0;( d$ r. V$ }% Q, M; H1 \
}}/ ]+ I3 [7 C8 p; A: Z; M
+ W. l0 i" L) a
/ w; o, Q" c, V' W
; C' | ?" }* R" E% M函数模板使用示例:4 A) k$ \9 p, z1 u5 f/ z N
在以上那段代码的后面加上以下代码:5 s1 ]- Y* j* H
/ u8 ?9 [* l' r , C* M& M8 c! e9 M1 z
" `5 ^* a; n: {6 S: I& v程序代码: , ^2 e7 e- k1 Q" U$ D2 n
3 R( L. `& v* h% x#include<strstream>& c6 B" [- h) _1 i8 J- x, W; ]
#include<iostream>% `7 {) h3 }6 T6 e
#include<string>
9 u6 F( m5 i: i cusing namespace std;
6 y5 r! |7 J) I* P, hint main(void)
4 O6 v4 e; E* ]) @7 P( S0 i7 Y b{
; _, W0 e: `2 {4 B string s1;/ N: b. o$ B. _% @$ }
while(cin>>s1)
) u3 a* a0 B$ l& x" y {! _0 W6 t/ x' m. ]2 p6 i
istrstream isin(s1.data());
4 S0 y1 k8 w6 ], ?7 h9 w- R8 b- s double d;
, w- H$ g+ c' o1 H if(fy_Exp::GetExpValue(isin, d))4 v2 }" a0 q" l4 j4 R' M
{
9 \+ V$ q. e- x) O/ X cout<<d<<endl;
) u5 Q0 ^+ U! w; T4 ` }2 U+ ?+ l. L, m" o( ~' o. d: m8 O
else! g3 Z5 R$ e [! P& I
{6 j$ d& k8 O# m. O6 A% C
cout<<"ERROR"<<endl;% p0 E9 ]3 j( _1 g, G
}& n8 L2 \3 B# w( V9 N& r
}
0 O# ^9 x, o! @4 t5 Q6 x return 0;
: C J6 s$ Q( V0 C! v0 O3 t5 H}- _/ o+ W/ b) r6 B9 V6 s7 x
. L L9 s! s& h6 a: m. P! G* {1 R( S, u3 T/ B
然后编译执行就可以了(*^_^*)" [; O) p/ H; |7 w* I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 M6 h3 {! h. k; B5 W" n 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|