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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,6 m7 Z' r4 [- e/ s+ z, ^* H
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) l, z/ r8 K7 ?- {$ v+ E4 v
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- M( }/ V. a4 O+ A) o/ C参数解释:
+ C" \1 [* G4 b" }/ h0 ~( u$ tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流, j. ~" a5 s& L' l# ?* h6 s
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
l) c5 d/ ^- t; r0 L- J返回值:
2 g q" D, h7 \2 V6 q返回非0表示计算成功,0表示计算失败有错误
$ w+ h% Q, k2 _: @% `- m8 y L5 }( t! b" N5 O! |* \
; O( h( Q& ]9 K0 f& x- ~
# P8 ]* q/ h) S# M" t' F程序代码:
# A4 j/ T; F+ Z; N: g: r
& R8 q# u- A4 }namespace fy_Exp{
) G B# {" X$ @% G- N' D7 }! `namespace {template <class _T>
* B, n: Q; m: C A! Z. Zinline _T GetExpValue(_T t[], char& csym){
2 o# ?# S" V6 X char c=csym; csym=0;. U4 r6 ]' W, G- R# d$ l$ u' T
switch(c){8 R2 v1 I V2 j! \
case '+':return t[0] += t[1];
$ e* U2 n4 t; \; ?( Q' a- J case '-':return t[0] -= t[1];
$ g5 |2 G/ U+ x1 @ case '*':return t[0] *= t[1];
1 N) q8 a. \. a) n" O! A8 G9 l+ n default: return t[0] /= t[1];//case '/':
, U+ ^" M: E* F. m" Z3 X: d! r }& ]$ s1 a$ w* j& ]+ ^+ y% w2 _% c
}}3 R0 [5 s' L m, x/ K# h9 p: R' s$ O
template <class _T, class _Tstream>7 Y. u' `$ P/ C$ V6 B' r- g
/* _Tstream: inputstream, _T: get return value
# f# B$ K6 F, O7 M* Return nonzero if get value successfully */! |" V% |$ E" t, }6 U
int GetExpValue(_Tstream& istrin, _T& nReturn){
0 k# l: s9 l, m _T t[3] = {0}; //雨中飞燕之作
6 N8 x2 w* o5 g0 i7 b1 l$ J3 G char csym[3] = "++";
9 f1 Z1 B4 u% G0 t9 b6 C int nLevel = 1, nERR = 0;- _% @3 x0 ]0 _1 S' [9 d
if(!(istrin>>t[1]))istrin.clear();% _ q$ a: w3 x2 h$ A8 d
for(;;){
5 {. W: z. d7 a. o, @/ y( L if(istrin>>csym[2]){& t3 H- ^3 u5 t* Y$ f( k
switch(csym[2]){4 m$ Q, U1 `4 a( O1 C
case '(':+ |: I. {0 J [% ~0 o: k
if(!csym[1]){nLevel=0x100; nERR=1;}else$ k3 B# s: j& p8 h) S( k+ E4 u
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: E1 I, R# e7 P% ]* e
else{nLevel=0x100; nERR=1;}
' y% i: \5 @9 G$ `/ i, D' z break;& E( y H5 L8 h6 i1 ]) ~
case ')':
7 C. y9 F$ G @# R( X- G2 N {nLevel = 0x100;}break;
3 @( I1 n% l/ @' O6 K$ s8 o7 P case '+':case '-':case '*':case '/':
3 }$ B6 Q5 }6 ~4 o( X {csym[nLevel++] = csym[2];}break;
. p7 o2 m7 @: c- j3 C case ' ':case '\r':case '\n':case '\t':continue;
8 p: B l: ?+ X1 ? default:
. o( c$ _( c ]" Y( j) P {nLevel=0x100; nERR=1;}# ?( i( @3 `2 E. z5 A+ g* F% ]
}" l% T/ X$ b, D
if(nLevel==0x100)break;. X) {6 r# z' S9 I" u
if(nLevel&0x10 || istrin>>t[2]){
8 V; t7 M+ r3 {$ V7 j) }+ M nLevel &= 0xF;; p0 w' G1 [9 o& o2 W
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 a" T1 v6 d9 o7 a3 h
if(csym[1]=='*'||csym[1]=='/'){
" H; B4 H$ R# f) m GetExpValue(t+1, csym[1]);" X% |- r" m: @' w; ?' L
}; }3 e, Q- A9 K# X8 E
else{% y& K ]6 P& k+ k+ K* @
GetExpValue(t, csym[0]);3 T6 l3 d+ U7 L
t[1]=t[2];csym[0]=csym[1];csym[1]=0; L2 p: n* J7 _+ B
}
6 Y. K' Q% x7 U* F/ o# ~ nLevel = 1;+ e& W! E h G" m4 Y* q" B
}4 ^( a2 V$ L% g; j4 q- J- K" m
else istrin.clear();
) k9 Y' B! }+ f: z2 L9 F/ b" W }( a/ u# y& w( `5 J5 k4 n
else{nERR = -1; break;}
% b0 ?' |8 Z/ C3 _- B }6 A4 J# P, d' R# j) ]
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 G n7 _- N" t# C
else nReturn=GetExpValue(t, csym[0]);
; |! o5 c" j' @0 l# F3 ~ return nERR==-1?1:0;# k0 ?! {$ d3 X* _: C
}}
6 [+ r' j; ~2 s
v2 \* a6 O, R1 y, J7 h V4 d- ^$ w, G+ {0 V0 C9 Q" X, i' I
/ k2 z1 B7 X9 b/ E1 W/ [# E% o函数模板使用示例:. ~0 x" s6 I I3 t
在以上那段代码的后面加上以下代码:
/ {; Y) D8 P, Z/ u3 Q$ o0 [3 d9 m+ s- E4 o8 \$ C0 s/ p
9 {' H2 T- s; c
+ a5 I" f2 u7 o" I8 M/ g, n3 F程序代码: # P; b# _7 J9 X# x1 q H
4 x' v! u' f( T3 W1 A
#include<strstream>$ }; q+ t" M8 n6 e4 j( B; w
#include<iostream>
4 [$ v% n! [5 a( j#include<string>; x+ @& n. E/ e% K
using namespace std;
- h7 v5 [3 O' ]5 Z3 {int main(void)3 s: r# R0 Y* R1 J+ m
{5 p6 [1 |+ |2 c: O1 g% S: X* Z
string s1;
; T Y/ l+ Z4 Q3 m, p( d1 P while(cin>>s1)
$ _+ f$ v$ c& p& w1 a1 e0 h/ v {+ L" _8 v- w: N, j1 h! O. c$ L
istrstream isin(s1.data());
) v# y) y& j2 H/ E* m double d;
8 G4 V* O0 T0 ~) `9 _/ W if(fy_Exp::GetExpValue(isin, d))
$ h7 ?4 E: i% L' Z2 r5 A, A5 Z6 m {" K6 |6 {; P* Q% ?% F
cout<<d<<endl;6 d9 w' K& @$ ^" d6 J1 `' G9 Y
}
& T3 L8 ~# z7 l else. Y; ?# R6 x& {6 {9 m- O* L
{
: L- U, { K, T! o& U cout<<"ERROR"<<endl;
( M8 N2 y) U; J9 h }, h9 f5 ?+ T& |8 @
}2 _2 [" `8 E( ?8 t1 u9 C; p! u) v
return 0;* _6 V) k/ r% e8 j# b P
}
' m, K8 W6 ]5 }5 y' b! P9 n- s9 D' Q: K/ b' k9 A. }- \! w H
8 y9 G: z( R- v6 | W: z4 m
然后编译执行就可以了(*^_^*)
3 u+ j( H5 q) X0 D其它:TC++上一定编译错误,不保证在VC6上也能通过编译- X8 l4 ]3 d8 d" c
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|