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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
1 ~4 r, l3 ^& t# ^一个很方便的函数模板,可以并且只可以计算含括号的四则表达式8 x' _+ W1 O9 i: {: P1 Z
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
, g2 g2 o2 N: D& A- `3 Y4 I9 b参数解释:$ s5 C* {6 g8 o b1 U8 s$ l4 E
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' t8 s. c# B( q) p5 U' |
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 {+ \& A7 U6 d0 a/ ^
返回值:
9 `; B( E* n: H7 x) @6 `7 N6 u6 F返回非0表示计算成功,0表示计算失败有错误
, [% K: q9 L; `, f$ Z* P& h( }6 D
% a* Z0 Z9 X" @7 x
, D* d# i+ R: ?0 m0 y l
5 r( e+ T( Z3 M, ^; O; D! x+ u4 L程序代码:
9 j) y4 k7 L6 h* T+ \: M& P& p( R# ]; i9 A! Y
namespace fy_Exp{! X$ d6 S0 k; b# T4 [
namespace {template <class _T>" D' m; @* _3 [6 ]
inline _T GetExpValue(_T t[], char& csym){9 C1 \8 K2 R' b) o; F1 |
char c=csym; csym=0;
5 b# h" X! q* f9 x. | switch(c){
, X2 q- d: u0 `; G4 x; B/ p i# i e case '+':return t[0] += t[1];/ z. ]1 Q9 ^9 E" C/ h# }
case '-':return t[0] -= t[1];/ e& h+ ^: @) N; d" j
case '*':return t[0] *= t[1];
+ ~( K% A1 v4 F5 H default: return t[0] /= t[1];//case '/':
* u3 m) U0 q* p& E6 C; ]( q }
$ L. _: Y9 N* y2 ]' M}}* Q. |5 w9 e3 ]! K* O [
template <class _T, class _Tstream>1 B/ G- t4 {/ J! [& W$ W
/* _Tstream: inputstream, _T: get return value
7 A' p& Y7 o2 E6 u a9 A* h* Return nonzero if get value successfully */% w: W( H; K% C5 z. X3 X
int GetExpValue(_Tstream& istrin, _T& nReturn){
5 F( ]( k3 j( \1 [ _T t[3] = {0}; //雨中飞燕之作
7 J: f6 O4 }3 j char csym[3] = "++";; c- `6 \+ g. u- t$ m
int nLevel = 1, nERR = 0;
- g$ `+ }8 _1 \8 i S9 Z if(!(istrin>>t[1]))istrin.clear();
3 `/ `9 Z \* E. u6 ^! ^7 l$ I0 K for(;;){
" T% m- i, a" P; x if(istrin>>csym[2]){
* b! j8 Q6 ? ? switch(csym[2]){
7 ~. f* ?+ f# J2 u P/ [) K v case '(':/ v: l; b O" i0 m0 Q6 O
if(!csym[1]){nLevel=0x100; nERR=1;}else
7 |2 u) S! V- z w% t2 l if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 X* K& W4 t, z
else{nLevel=0x100; nERR=1;}
* ?. \" x" `; A3 V \( k8 n break;
6 R1 R. o E8 }( D case ')':
* {( Q- N, o) ~" U: }7 w {nLevel = 0x100;}break; k2 y$ H/ q( d) G+ |
case '+':case '-':case '*':case '/':
f' O4 k9 E* W7 K, `$ a {csym[nLevel++] = csym[2];}break;' \0 Y1 j2 ^4 V' @* }
case ' ':case '\r':case '\n':case '\t':continue;
9 w% R) {4 J9 Z. U default:" f8 e6 }# L5 s2 C
{nLevel=0x100; nERR=1;}
/ X; L# i/ Y2 N4 Y9 N: |1 a, c, E; K }7 V8 S4 u$ t' X( B0 W$ `
if(nLevel==0x100)break;
G% j) W8 o1 F% r e9 Y if(nLevel&0x10 || istrin>>t[2]){
* M8 u- Y; g8 M+ q6 P nLevel &= 0xF;
+ m% |# Q$ a8 y) h- z3 g- G+ z& p if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}% W& w8 m, M" Z) B: a8 g, ^
if(csym[1]=='*'||csym[1]=='/'){
+ o. P4 p9 Y9 ~# q GetExpValue(t+1, csym[1]);
% x; B' q! x ~0 d$ r3 ~ }
: |# i" _# x; }, c$ C else{- P% Y0 x, t9 g3 H2 A
GetExpValue(t, csym[0]);8 C& N* `/ E4 l+ h
t[1]=t[2];csym[0]=csym[1];csym[1]=0;# T( n6 l7 r; s, z2 b
}7 }5 N( c. l. _! o2 Y! R1 P" W1 u
nLevel = 1;
( |2 X5 F6 `7 o3 @ }; M1 m6 x5 G8 p" ~: `8 @
else istrin.clear();
]& Q3 q M' V% i }- H! u9 g7 _( s
else{nERR = -1; break;}
( i5 q) `" Y( b7 y3 }6 f$ D; O p }+ {0 d" ^( e& e* `
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' b. O' W+ y; n' i# C/ ` else nReturn=GetExpValue(t, csym[0]);
' h) ?& L- O; P& F! E' H2 C' E return nERR==-1?1:0;
$ U; }& h" } t, ?# p}}
p% k& t$ L" S3 F1 J
5 c4 ]) `* M5 m4 z' z& n z9 W7 K. D% s% T- Y
/ |' _+ n2 o/ |2 L) d# ], n3 |- E
函数模板使用示例:. L7 a5 J9 t5 ~9 A* r
在以上那段代码的后面加上以下代码:
! `" `) ?" Q/ c O6 B+ s0 F6 E7 \* ]
. {. L, E# {2 W; [ 0 W0 m/ x! v+ o: e
7 Z8 z" N1 E9 A% I程序代码:
|3 u3 h. j6 P- S; ^
; g* h9 P& Y2 J: i/ g u' o#include<strstream>$ h5 M5 e; d3 y0 b5 C" e2 b
#include<iostream>
7 N4 M9 k, y/ c8 f0 C! w! ^# h( t#include<string>. f3 z* b) a/ L+ D: r
using namespace std;
3 Y* d/ F1 u. B3 e) t2 \int main(void); l6 M9 K: c9 K3 W# P4 v5 F
{. L0 p; C2 U2 |- ~- r
string s1;5 o: s: Y8 R, p% @; J- X
while(cin>>s1)0 V% r4 z3 Y4 @. n' S9 ^
{" |) }* }1 A- o+ q2 q4 O4 t
istrstream isin(s1.data());
( q/ o/ u2 z' E- d4 c double d;' x7 k2 A& Z( K+ f! U
if(fy_Exp::GetExpValue(isin, d))% f4 b# e" U7 ^7 \
{
! t- G7 }7 E, a0 x# L8 ?; V2 o! | cout<<d<<endl;
$ o( i3 v- Y8 P& Y4 ~9 J }1 y! r7 i# V: s) P ~" p) N# f4 a
else1 V( o$ E# g9 j w
{
; A; ^3 }" ^& C" L cout<<"ERROR"<<endl;3 f6 [* Y$ t4 T% g: f0 `
}
$ G% t4 n" R3 J; w5 E- G }0 c2 Q8 S2 B# H8 S
return 0;- f1 E7 a b/ e( H: A& q2 K% w/ t
}+ h, ^3 P. S* X8 b. G0 ~$ w
1 [0 O3 Z. o; d3 O) Z
( k/ S% N/ m: _" a0 s
然后编译执行就可以了(*^_^*)
+ M( m5 l* Q- v; Q/ y其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% @& M9 s6 [0 o+ @ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|