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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,8 ^3 C4 {+ g) ~# R1 q4 N4 ^
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ ^; k! j6 D8 Z/ F) C' W9 l9 `只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 j+ u# M! y2 q4 Z! |# E- @
参数解释:' E% S: G* }4 @: R9 p0 O
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 E/ G% I1 U) d% Y" t4 f" N
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定/ K! @# {2 `1 W3 f( P
返回值:
& L8 q% a* o& f返回非0表示计算成功,0表示计算失败有错误% s9 S* z D& D5 H0 R+ c5 u( ^
/ ~1 ]5 W: F' V% @ O) V. a
# A. n4 Y- J2 \! Y$ l
7 i }% G8 {; ^& h6 z程序代码: / B4 V+ t/ }8 [0 l, [$ i9 ^
: x' [, t0 \6 t- m$ Q3 p
namespace fy_Exp{
* j; P4 s# G7 r+ Z) @! g7 Rnamespace {template <class _T>
2 t1 g3 j4 v$ Y7 s1 Rinline _T GetExpValue(_T t[], char& csym){' e3 A% n9 j) Y# p6 H/ R: ]
char c=csym; csym=0;3 {' q+ `$ v$ `% _7 t1 I$ K) @
switch(c){. y, W; g" Y2 ^3 l! b7 o+ t
case '+':return t[0] += t[1];4 B1 }! o% t4 B8 B4 F% X3 k
case '-':return t[0] -= t[1];6 Z6 H" n! a" [
case '*':return t[0] *= t[1];- j/ G7 D r9 N; \# N
default: return t[0] /= t[1];//case '/':
1 G! v& k2 l ]0 H }
6 u6 _3 ^. ~ m! k% _}}
4 j/ f# h m4 k( dtemplate <class _T, class _Tstream>2 M2 Q9 T7 K, k% g3 i) o
/* _Tstream: inputstream, _T: get return value
1 e* o% ~$ C7 @6 z* Return nonzero if get value successfully */! G! o& d( k5 J4 f! S4 }
int GetExpValue(_Tstream& istrin, _T& nReturn){- R1 l' R; I: q |" ^" K, J
_T t[3] = {0}; //雨中飞燕之作2 r6 e- @# w- n; ]8 y0 L8 m' `$ J, `
char csym[3] = "++";
9 V9 p p2 Z' q4 a7 J int nLevel = 1, nERR = 0;" Z5 n, P1 H- p5 {
if(!(istrin>>t[1]))istrin.clear(); l( A* F- [6 m* v6 o6 u% A. E
for(;;){
, X+ w& v* d, A2 o3 z H if(istrin>>csym[2]){8 R, w6 o1 O% l2 q/ j
switch(csym[2]){& I" O! z; g) q, P/ `4 \
case '(':
" @2 E" c$ `# H- `% l if(!csym[1]){nLevel=0x100; nERR=1;}else3 W6 v) ~& n' j" c- e {& w
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: p2 Y7 w% d0 D* D7 p" I- Z4 s else{nLevel=0x100; nERR=1;}- @7 Z, c3 n% D0 x$ u7 A( z8 t
break;& g W6 H k/ T
case ')':6 N- O0 t8 m T |0 w8 F
{nLevel = 0x100;}break;
4 z; q4 [& a3 a7 [ case '+':case '-':case '*':case '/':- x3 J7 q s0 m( O0 [& |, V/ q
{csym[nLevel++] = csym[2];}break;
, `, n: t* W! q( \$ l case ' ':case '\r':case '\n':case '\t':continue;
. D- b& z9 c* l) N default:
: U3 r4 I$ b; ~4 P$ e: y3 K {nLevel=0x100; nERR=1;}
. ~1 r. Q) N; G/ f' s9 Y } P& Z+ @' P, a
if(nLevel==0x100)break;
, b; w3 I# X+ J% O$ N if(nLevel&0x10 || istrin>>t[2]){
7 p @+ L( e) _7 \' x nLevel &= 0xF;: J5 ~8 X$ ^3 j( s* y; e/ m! n+ f* x
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; _8 `! {- t+ M: J5 g/ W; b6 I
if(csym[1]=='*'||csym[1]=='/'){: s& \$ y+ b* w C' o5 D" C
GetExpValue(t+1, csym[1]);
% Y' ^! A% Z6 j+ g4 h }* @: a7 B7 G' W( y
else{
7 T% m) B# a# g; v GetExpValue(t, csym[0]);
8 \6 }( C, r3 Q4 }+ ? t[1]=t[2];csym[0]=csym[1];csym[1]=0;
, o( f3 m8 q. ^3 r: Q" x }+ l& v; A0 J1 ?7 e9 K
nLevel = 1;! M9 l; _ }7 B: Z, K" k# f5 ]
} T8 ], i/ Z9 z) C/ i+ s
else istrin.clear();
! S, f1 ~& j1 R$ i }* L/ d( U) B( r- l1 q$ e
else{nERR = -1; break;}! C0 K7 R3 R6 }% Q
}
0 k B# d, w4 q, E/ l3 ~+ C( I! v if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);& S C- q2 |. R$ k; }$ D
else nReturn=GetExpValue(t, csym[0]);
$ W' @7 N1 h v" p& O8 t return nERR==-1?1:0;+ N% K; i4 E+ W
}}) L2 L+ U: h- n4 t
% V3 h" c9 u l w
0 w- F ^8 U9 D) P, |
1 [% M& b6 L/ n
函数模板使用示例:
$ c! E3 }$ d, a p/ B在以上那段代码的后面加上以下代码:
9 b3 L" r7 G2 \ Q9 @/ w$ {2 X* V3 R! K
5 o N& J, d& R+ T8 H7 w
: [3 ^, U) l. t程序代码: / d2 E0 I8 p7 F+ m7 }# \0 c, @
* W) I+ R* ?$ B9 w( _#include<strstream>5 }& C) W. [. O9 Y
#include<iostream>
4 k3 ?. R$ O6 V6 R m# I#include<string>
; s, f$ F0 h: r2 p+ Z Vusing namespace std;4 |$ I$ P7 ~6 h, y6 w2 q
int main(void)$ E% u; |) P- a# y8 p4 {
{
2 n6 d# u4 E9 ?+ A: P& m string s1;9 K( U2 o% S2 Q* @
while(cin>>s1)
8 C3 O# f$ Y; }* K3 o+ ~' o {
7 |% L7 W1 G3 `+ A+ d istrstream isin(s1.data());# I q* u& j$ a# E. _
double d;4 f+ v* m' a3 X; {, R c
if(fy_Exp::GetExpValue(isin, d)). S8 j9 a- Q% b
{0 N" ]. P* [" g Z
cout<<d<<endl;
. c7 E" r& L- x* A( V- T. d7 f }
2 P% k; S+ ~% r6 }4 b* J* C else- S4 S6 P4 m3 i3 ~7 u9 K% ?
{
; D9 i7 {) s9 N8 T* p, S cout<<"ERROR"<<endl;
* j s' ]! A+ B+ D' T+ Z9 p+ z }" q: w7 Z9 O4 L; F
}9 J9 z+ C0 M+ O/ f
return 0;0 S$ ^9 r- o* X( m- C4 t
}
$ j7 Q$ C! n8 ^- L0 t4 o
8 t. U/ ]/ i% v/ G9 Z6 O
2 c* ?; l4 e% t然后编译执行就可以了(*^_^*)* s# i0 V( O* j' D: L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译2 o/ q4 I9 T2 q3 K6 |* y( U
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|