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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
% D) }) H* B* E5 Y! v5 v ^& k一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
4 o" b1 ^' E; Z& L6 y$ f! D: k只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)* Y$ e, f1 b8 h6 e
参数解释:+ B- j0 h( n$ }4 L3 p" ?' v
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: J& b+ h% b h" a; u/ `nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 P! K ?/ V# w
返回值:0 |7 x8 I( ?* T$ O1 m
返回非0表示计算成功,0表示计算失败有错误
2 V5 h2 G: B' ?, x3 P5 d/ U$ ^9 b, ^7 u8 g: Q
4 c' K. f9 Y6 B1 x! f# S; { h4 H
& V; ?7 m; K' @' |) K- _ r程序代码: % i j* ?/ @% l. \+ s# Z# C
6 w" ^8 u2 r0 J6 T; a* anamespace fy_Exp{, b" G0 [6 d- ]; ]
namespace {template <class _T>
/ N8 A/ s% W. Winline _T GetExpValue(_T t[], char& csym){
4 z& S9 r% ^: b& M1 N. L char c=csym; csym=0;
4 s4 T) e; T# F7 F$ v. n switch(c){
% d7 {) b; ~( m1 X1 V case '+':return t[0] += t[1];
& N3 @6 I1 W5 ~) x% ^- i case '-':return t[0] -= t[1];$ L/ [8 k0 k: R3 B
case '*':return t[0] *= t[1];2 i4 h1 |8 T/ Z0 h- }1 A, q8 m
default: return t[0] /= t[1];//case '/':
& F. Y* ^2 ?# W8 p5 ~/ P }
: I, J$ K/ F7 S) r! Z}}
. ^+ }4 K; b% P0 ~3 I, atemplate <class _T, class _Tstream>. a/ F4 v- b& M$ C
/* _Tstream: inputstream, _T: get return value
% T1 l# c* w# D& E) S* Return nonzero if get value successfully */: q8 ~4 S8 f: K6 A5 r) j$ V3 x+ R
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 s. k2 {& H+ X+ d/ @/ W, e9 \ _T t[3] = {0}; //雨中飞燕之作
% g" E$ ~- w# A% ~" f& q char csym[3] = "++";5 X9 J) x" l- n& I" i
int nLevel = 1, nERR = 0;& G3 @: R7 f/ f- Q
if(!(istrin>>t[1]))istrin.clear();6 B/ j0 M u8 G6 g+ f2 N" a) R
for(;;){
0 i# v. ?( `$ u; u; l2 f3 Z U if(istrin>>csym[2]){
( o1 j- y/ }- s# Z4 n switch(csym[2]){
: g2 q3 c, K$ i# B case '(':
" A' q- C; }5 i; \# M if(!csym[1]){nLevel=0x100; nERR=1;}else
7 V; B% ]/ O. P6 u: l. P3 y) M, Q if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 S3 J' Q' l& a, v' F7 p
else{nLevel=0x100; nERR=1;}
; b. o/ w% e: Y8 G0 H; F* c break;. X4 O l# d8 S! V) h
case ')':8 @, @; n# B* w( x
{nLevel = 0x100;}break;& G2 H7 B+ |( ^; O3 E' {$ h6 S
case '+':case '-':case '*':case '/':9 r) d# t/ T/ c! \" S5 T
{csym[nLevel++] = csym[2];}break;
; B( O9 v* ?/ e case ' ':case '\r':case '\n':case '\t':continue;- E0 Q2 e- B! i7 X4 i I, D8 m
default:
! ?( @7 X" {( i {nLevel=0x100; nERR=1;}
8 t* ]; d* T7 w" ?! ^/ r }! b/ i: ~ W" k# Q9 Y
if(nLevel==0x100)break;( M/ J5 F& s/ F' M, ?
if(nLevel&0x10 || istrin>>t[2]){' B8 ~5 P( R( p& P8 g
nLevel &= 0xF;7 l0 t" x2 Z5 m1 ]& }
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- W0 q# o: Q- V0 T! l$ y# H3 G if(csym[1]=='*'||csym[1]=='/'){+ m! J9 D8 c$ H+ A
GetExpValue(t+1, csym[1]);7 A( H- E, N9 T1 T1 ^
}
1 x6 c6 F' l1 Q' H/ p else{
6 s" a! g: V* V( P9 d9 E1 b: j GetExpValue(t, csym[0]);
5 [ ^, u6 \6 L- W0 j! x. u t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 y7 U7 X1 r, t1 v b: A }* @, S6 e5 y% w% V0 M! y. h
nLevel = 1;2 D- G. x7 j4 S5 g2 Q$ |
}
0 S0 b8 R/ z4 s else istrin.clear();! \' ]0 q. J% N9 T1 A8 k2 V
}
3 H4 n' F& d8 p8 C3 a else{nERR = -1; break;}
. @6 B2 t$ D8 f, Y6 P) X }4 G7 l! ]4 `4 m* B5 }
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);2 M) Q" b: f/ |* U" P9 r9 }
else nReturn=GetExpValue(t, csym[0]);
7 o, G2 x F# P6 t1 p, N f6 | return nERR==-1?1:0;
2 j$ U4 \$ N0 z. S a}}3 W Y" v/ W2 \- x" c x/ C
7 e) G' F5 }( y0 ?- o" ? H, l0 r Z+ Q& |. l
: q) n( X4 T' H/ m- \函数模板使用示例:# v7 B$ M6 f- b: O: k ?6 Y
在以上那段代码的后面加上以下代码:
2 b% H- G5 h% H( N9 b4 a- d) ]" M7 y; I7 J3 B
6 s5 f d' g6 L% M' H& Y/ u) P2 u ^
2 @2 \* Q5 W) ?4 w- c程序代码: + X- w; t4 U7 g' c; V+ ]. t; r2 f# l. N7 S
; F( e9 K* [% N( a7 o" F5 j
#include<strstream>4 P0 o* }1 l9 k- |4 g
#include<iostream>
+ l5 I8 e$ S+ `3 b5 u+ p! K+ O% n#include<string>+ K. j# H# m( b. e( z Y
using namespace std;
' i2 m2 C: k7 ~+ Q5 w% ]+ Y, B9 b- tint main(void)9 G6 d Q: l0 W& p# V
{
, }/ v) z9 r0 j& O string s1;
; K2 g4 y9 F3 T- @ O while(cin>>s1)
0 {/ C/ F9 U1 X9 r1 Q8 T% H! C {
* v0 V5 Q! O+ z4 y istrstream isin(s1.data());+ ^2 x4 X& r0 b! u
double d;
. v+ A) O4 U! ]+ j/ p2 z if(fy_Exp::GetExpValue(isin, d)), F$ _1 l# Y! q/ c/ L( r2 p. O! I- F
{, d: y2 X7 \' S- z6 H+ |
cout<<d<<endl;7 h6 Z6 {% R2 L8 o Y! H
}
1 o: I( {+ ~( w, |- J/ H% i, P else
1 k( I7 K; r& b9 k$ A w {
1 F' r5 |2 N1 P9 y/ E3 o' U cout<<"ERROR"<<endl;
0 M2 D$ n) f2 [! w }
# x0 A% }" e' I }8 E' w+ W5 [0 D6 _! t L
return 0;
0 P3 H7 S! c% h: M& f/ V}
0 _$ D% [5 U# |/ S+ T) G- p
5 E, }1 J {- _9 I3 Q3 B: g) \. P. a$ f8 o) f( a/ {" J" P. E
然后编译执行就可以了(*^_^*)' E. q% X- L0 ^* N2 f& V+ V
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# m, ~9 }4 W: k- H0 L/ O$ k 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|