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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,; S, h3 x* a* R9 C
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ q2 ^+ M- W2 B$ n' C
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! d* t( Q) X% f# o& i
参数解释:' \1 h/ E% ?8 k& G/ C
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流1 o, A2 k* d$ [8 b* @6 J! z5 Z( p; T5 P
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 `, J$ K! R; p- c2 Z' i6 p% |
返回值:
5 R- }8 u0 K- c+ E* w* e0 K% ?- n返回非0表示计算成功,0表示计算失败有错误
5 j! i' w! R( x" _; v! |# {' y: C8 K; D. x# j
`/ c8 g/ s* L
" b5 N4 X" N: ]$ S" O9 }3 M z程序代码: 7 t) i0 D0 v/ b6 K! m4 q
|& j* E$ f4 {* l/ V3 }. Cnamespace fy_Exp{
) X: Q6 T9 {2 q+ L1 Dnamespace {template <class _T>
. z0 u! O7 e" d( q! S6 S3 Q# Iinline _T GetExpValue(_T t[], char& csym){
' r; a' ^$ N1 X5 r2 Q7 { char c=csym; csym=0;
) v0 t+ D; p& V switch(c){
8 `, w0 V' _( K+ J. R9 y case '+':return t[0] += t[1]; E6 y8 f' d6 W @+ c5 ?8 c/ g
case '-':return t[0] -= t[1];3 w1 H5 R: U# H2 Z
case '*':return t[0] *= t[1];
$ e/ \0 I* R# o! Z1 O default: return t[0] /= t[1];//case '/':4 q1 j* R- B; C( I
}
3 E8 g4 ]8 {5 L6 B7 A) ^* D; H% W}}) l+ f$ a) w S/ B2 \
template <class _T, class _Tstream>$ z' I2 d9 ]8 y0 Z& s+ h# z
/* _Tstream: inputstream, _T: get return value
9 I: [# l, x+ R2 f. c( f6 m* Return nonzero if get value successfully */ ]- ^4 Y6 Z9 M
int GetExpValue(_Tstream& istrin, _T& nReturn){5 N0 k( `9 d( t8 S" w- R/ s
_T t[3] = {0}; //雨中飞燕之作7 m& S1 _0 ?$ i2 p5 g
char csym[3] = "++";
& u2 K: y1 I! d2 T( l, b2 T int nLevel = 1, nERR = 0;
- `8 j; r" R6 o% P: @6 a: B if(!(istrin>>t[1]))istrin.clear();
; j e/ R1 ]5 L, Y+ a for(;;){( K1 P& W3 [/ q5 c! Y
if(istrin>>csym[2]){
0 {) a( Z8 j; V9 [; |6 Q+ }4 C0 N! E switch(csym[2]){
/ [/ Z, k8 ~. l; Z case '(':
6 y! I" v+ A$ p' j: V if(!csym[1]){nLevel=0x100; nERR=1;}else
. u2 `* f' i% g& ^ if(!GetExpValue(istrin, t[2]))nLevel|=0x10;4 s9 Y, f- }2 c! b
else{nLevel=0x100; nERR=1;}
! Z! l" l8 Z" ?- L break;- I) t% z# p. K b! S6 f
case ')':
" {2 v7 O. s3 Y) _' _4 D {nLevel = 0x100;}break;: H, j; V$ z3 k6 L- N7 v, M
case '+':case '-':case '*':case '/':
' r3 I# h8 Y. ^* R3 f {csym[nLevel++] = csym[2];}break;
; [, y" S+ k3 I# E1 u3 p, M case ' ':case '\r':case '\n':case '\t':continue;. N1 H5 Z! y# r0 y
default:7 {! R$ H: Y) Z3 ]" M- _' @
{nLevel=0x100; nERR=1;}
; `5 S4 @6 g4 i" k" u1 c' U }
& Z/ H1 ^4 i& {! I if(nLevel==0x100)break;
' m% C+ {- D; M' _% ? if(nLevel&0x10 || istrin>>t[2]){
) \% b* y) J) _9 B8 G" G$ h nLevel &= 0xF;
- w, [( X2 g) ]4 ]( _5 ~ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}5 s' W0 Q! W% d3 M" `$ [
if(csym[1]=='*'||csym[1]=='/'){
, Y) k, p/ H$ [0 {2 ~) M GetExpValue(t+1, csym[1]);' g) h! r4 }' U8 L! |. ^0 ^( k
}: f: K9 V( H! T6 K
else{
4 ?* E _: T# m GetExpValue(t, csym[0]);
6 J" y( o+ C1 G* K0 F) t6 q t[1]=t[2];csym[0]=csym[1];csym[1]=0;
. _6 n% p, [, E7 H9 p }7 B2 _# E9 g2 m8 k" Q% s4 U
nLevel = 1;
3 `( A' q" Y% h4 _: f }
0 f x( C8 Q: E; l5 F else istrin.clear();- ~0 V- \1 y3 g
}( q" m' S5 t0 G6 J2 s9 g
else{nERR = -1; break;}* Z5 L7 u# W% y! j
}7 x# `2 b) [( ^4 g, f
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. c% A! J3 e4 i% j1 ? else nReturn=GetExpValue(t, csym[0]);- e& E* J/ m/ @5 L
return nERR==-1?1:0;% I" K; M" {. [& ]4 O! l. i; w
}}$ q/ d# ?- @1 E9 G
& s7 Q2 B! }/ L; D: {& d- Q: z1 k+ k
' Q5 T( _2 f2 z' l; i
函数模板使用示例:4 I8 B( _- d3 N
在以上那段代码的后面加上以下代码:
8 M5 \: j& o# z1 o4 ?& a
# G4 z& c; a# K4 ~5 n / m9 C' T: i1 X, Q3 k
& h* H/ h- O2 k8 ]* N" G* v2 o
程序代码:
) l- D# Q' y$ r7 g
7 U" Z$ H* H+ { i2 L#include<strstream>! ?0 C( C7 S/ u" G# x# `4 k
#include<iostream>
. {4 v) V; ~! K6 `5 ~; E. V#include<string>
9 c- ^: ~1 X% X3 z nusing namespace std;3 [& Z8 P- P6 u: `: `( D0 z1 f
int main(void)
; a+ a9 l# i8 s8 J{% K! y' S* A6 q- ]% q7 L, e
string s1;( U, S4 t0 N2 J
while(cin>>s1)5 c8 {% H5 c, n9 b& K
{
3 ^- G& d% A# Y" ?8 d istrstream isin(s1.data());
8 y9 T' z* Z% f double d;! @; Z' d6 e$ }7 h7 e
if(fy_Exp::GetExpValue(isin, d))
: D& d( l& \$ ` [8 [ {
" f! R( J) L- d cout<<d<<endl;3 N5 \4 s) A* H) ]) r
}8 W: x9 U3 T6 J! \7 h- {0 r
else
9 c* o, ~$ B5 \1 U7 C! g+ h, ^ {+ I# m5 u' T! ^8 U w% Q/ ]3 x
cout<<"ERROR"<<endl;' _( Q$ [2 W! f7 L
}3 c3 C" ^8 x6 Y4 x( N8 ]# \
}
- k, g1 M) |4 b. A* ?% o8 l+ n return 0;
( |. k. M8 J, P# J' _}
! K% E& @! {1 z/ r( V- ^
: U- V, B6 K2 m; k0 t/ H1 d$ l1 C2 l u# C1 q# t. ]+ Y
然后编译执行就可以了(*^_^*)
4 J$ C0 t- ~4 J( |其它:TC++上一定编译错误,不保证在VC6上也能通过编译. G8 {$ Z y8 |/ y! ^* ?* {( L% u
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|