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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
) }/ n. i7 o: F4 R8 c2 `0 V一个很方便的函数模板,可以并且只可以计算含括号的四则表达式0 c: ^, \9 v2 s8 D
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. d: I- X+ c* ~: Y; }参数解释:& C+ e/ M1 L/ e2 V; ]8 _
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
0 ^# }% {# J! ~9 N5 I# b8 |2 ~nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
' z' R" W! }& s. @8 @6 p返回值:
- @7 C/ L% x& j返回非0表示计算成功,0表示计算失败有错误
1 L+ v+ K/ i% ?9 i2 K" {, V
/ b9 j9 v6 ~! q) t
$ L, x% c& S4 l
+ `7 n6 [" c3 S9 x9 g- |2 C程序代码:
* d$ a. l' s4 l F Y7 | p t+ |1 G/ j3 S* N0 L7 x# P" e
namespace fy_Exp{
9 g) p+ n! d6 F3 k0 knamespace {template <class _T>9 H, T7 S5 X0 p7 ~. n/ s
inline _T GetExpValue(_T t[], char& csym){
, ?+ I9 ?! C5 r char c=csym; csym=0;6 Z3 @& x5 i* ?8 i- V; l
switch(c){
! Z+ \1 @" c" @) n8 z4 w1 h case '+':return t[0] += t[1];) d" j& g; A* k( w
case '-':return t[0] -= t[1];' {# _9 t9 d/ F- n7 Z2 n: z0 O
case '*':return t[0] *= t[1];% J# T1 C8 E4 [" [2 A9 G, I' \; t* l
default: return t[0] /= t[1];//case '/':, F4 B# p7 j+ K3 O0 l- }5 Q
}
8 T% G' l3 Z3 y* _9 Q" p}}0 c' L% ]3 n, g5 Z7 g
template <class _T, class _Tstream>
. H& N5 H% I3 p+ g/* _Tstream: inputstream, _T: get return value
2 ?+ E! d- h, A: B0 K5 n- o% M* Return nonzero if get value successfully */ y: V1 z* X- F8 X! o) B; V! n
int GetExpValue(_Tstream& istrin, _T& nReturn){
( A6 T% l6 K7 P: Z _T t[3] = {0}; //雨中飞燕之作
$ W0 F$ i3 @( g# Q( ~) { char csym[3] = "++";
7 `7 w5 P/ k! b int nLevel = 1, nERR = 0;
5 N, A3 F* X# e: v. W if(!(istrin>>t[1]))istrin.clear();7 O F/ p. W6 _$ P* N
for(;;){$ \+ B( a2 f8 M
if(istrin>>csym[2]){8 ]0 P) W* M; f
switch(csym[2]){& P; B% T- ?( v8 l
case '(':
# V& M% K( e" c4 N$ }1 Z if(!csym[1]){nLevel=0x100; nERR=1;}else4 [0 _7 F; C4 G5 b @4 Z5 }
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
% P6 Q/ Q$ g+ x, b0 ^" ^% W else{nLevel=0x100; nERR=1;}
0 N3 h7 V0 Z- u# p, P break;
1 p: q9 t: n$ [0 b. |+ l" M7 o' J case ')':2 m5 E$ R9 _) a) C* Z( R/ K
{nLevel = 0x100;}break;
& M9 E' W, P5 y1 q+ |' o$ Q" O% v case '+':case '-':case '*':case '/':
( }! q) c! r" G3 Z {csym[nLevel++] = csym[2];}break;
& k' a7 ~9 h6 q5 z4 A( B case ' ':case '\r':case '\n':case '\t':continue;
# v$ [0 R% H/ h$ M: G' k default:, m; s/ A# h8 r/ c5 J0 N1 o( r0 r/ b
{nLevel=0x100; nERR=1;}
3 V2 B( @; M$ s }5 v& }( `) p4 \/ v0 b9 ]8 s. U
if(nLevel==0x100)break;
2 R* P0 J% ?8 P0 f if(nLevel&0x10 || istrin>>t[2]){/ s' p( x4 g3 R1 T3 m
nLevel &= 0xF;
$ B0 Y8 L' m; Q( c2 r if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}/ D* }# ^- e* R$ h
if(csym[1]=='*'||csym[1]=='/'){' c. ^0 V( a# j( b
GetExpValue(t+1, csym[1]);8 W" ^/ N0 V3 U- L7 V9 G; f
}0 z9 A, |. x8 `( v
else{! k7 J8 W) S% u' E7 W7 X
GetExpValue(t, csym[0]);3 V, O& U. }" } _0 ~
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
0 [5 k" v% b: b% _' O. A0 W) M }
0 J, a3 V" U, `7 E nLevel = 1;- c8 Z3 M+ D. @) ^0 h% k
}: b) `+ S U# R$ C8 `* N* x5 O
else istrin.clear();
" e! K; X5 h, [ }
3 B3 L' U* S8 k @; c else{nERR = -1; break;}
, p5 `! Y2 |$ {/ y5 |" } }6 w) N" s- N8 y/ j* w$ x& r; P
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);' Y# D( T0 T& `' @( P1 P/ e
else nReturn=GetExpValue(t, csym[0]);
# l) a. F# w! e0 a0 w return nERR==-1?1:0;: P# P4 k: O2 a2 N
}}
; E, y4 t1 \7 M+ n' W! K# X4 L1 ?- K. R( y! ?( F
# Q: ]- H0 }! {. t( v6 Z
( O+ d4 y# L Q; _6 y& x! }函数模板使用示例:
! N. V4 S8 I. |- b; G: f7 j在以上那段代码的后面加上以下代码:' c2 A: @" S& [ |9 S
* I2 y- S4 Z1 W8 G- S4 ^
, Y! y' T4 @3 a* d" r' R |1 D3 h& p i; l u3 R* a, M) L7 e
程序代码:
" a9 S/ f0 P0 }2 U* G5 a$ _
- Z7 |. t0 F3 M#include<strstream>
$ }3 c) p; z5 {3 @#include<iostream>
$ Q0 G' V2 J1 o6 ?" r#include<string>
1 a2 \' t5 A1 }6 kusing namespace std;7 [0 R t) E. z6 Z( M( @$ b8 ?
int main(void)
2 t* ^0 i* ?; M; I# h l{
4 S5 S$ K) W% l# n' f string s1;* n/ |- V" f" [; D+ v. w* e7 b7 `
while(cin>>s1)
n. w0 `! H. V% J% c3 ` {/ t+ A9 f5 i* p+ e# q" D
istrstream isin(s1.data());
( Q! e+ Z6 v( m+ M* p' j6 E double d;/ }2 [8 v0 r# @, n
if(fy_Exp::GetExpValue(isin, d))6 J/ z( J0 O+ d
{
0 m/ f# \* y( q4 R/ ?' Z, K4 p+ w cout<<d<<endl;) H, x2 t5 s w0 r
}
" c' d) G, H' e( O" T- l. m9 m else
- g y$ x& B; _2 s6 }' B: k {
' g4 G& `( _+ v2 x$ l/ F cout<<"ERROR"<<endl;
4 |" Y( R: ?4 i k$ q" w3 M }) X* |( j# b8 H7 W& a
}
8 d, l( @$ C/ X7 n8 ~ return 0;' W/ K U, Q5 ~+ a3 Z$ u
}. g- m! I E6 p: u8 j; H; ^- T
6 Z) F0 `$ X+ a% R: k6 l2 L2 C2 c1 h- l
然后编译执行就可以了(*^_^*)- U6 s+ h. j& g& B
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& l3 p( s) \$ ~, m8 D6 |5 j 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|