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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,, r& D8 q' F0 Y& l4 k1 T `
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# j4 n# L: o- W; s4 \只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# Q; h& q3 ?! d3 i0 K) {参数解释:
, }3 i8 _2 @- i) O5 Uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流: \7 O! x( m# u; |; U
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定 w( I9 Q9 s5 i
返回值:
& F d6 V0 N! B* R* e; Y) i: o返回非0表示计算成功,0表示计算失败有错误
, M7 V& ^: f( o1 f8 R/ }' a O' Q( _8 { Z7 s. g1 B
! G3 p# V8 {/ E ~
& \' v* L D d8 |+ R( h( F
程序代码:
& E6 [8 G/ Q. K, S
) v6 s( \7 Y {3 F5 s, p* Z& rnamespace fy_Exp{
+ A. f/ z# O5 @( gnamespace {template <class _T>: T5 X# F" N( z( n2 s
inline _T GetExpValue(_T t[], char& csym){2 ^" v8 H6 a6 i) n
char c=csym; csym=0;1 Z" L6 p4 U1 h; t; v/ c6 ~( G
switch(c){/ d- y. O% d: ^( r8 }
case '+':return t[0] += t[1];
* F. O0 z8 F. z: i3 m/ { case '-':return t[0] -= t[1];
: ?0 v! h+ i. o6 i/ J/ f2 U case '*':return t[0] *= t[1];( j8 m' p) _9 s$ C
default: return t[0] /= t[1];//case '/':
2 g. G5 o8 g. N3 C, h+ z1 V& i }
5 X4 l8 x6 R/ k% C}}( k4 [* b0 \8 m
template <class _T, class _Tstream>8 y# @! I0 e1 S- q& Q7 @/ w9 d$ z
/* _Tstream: inputstream, _T: get return value
# K* |* t$ b N% x/ w2 i' L* Return nonzero if get value successfully */
" O8 C- O1 `( }: Y$ U4 G& |int GetExpValue(_Tstream& istrin, _T& nReturn){- [7 A3 t0 K ]8 z x" X( b) i7 h2 a
_T t[3] = {0}; //雨中飞燕之作3 j4 p! S; Y# w5 }& `
char csym[3] = "++";
' {8 V2 g2 u- V1 x k# z int nLevel = 1, nERR = 0;
5 v1 ?- X5 t1 o+ g4 Q7 }6 g if(!(istrin>>t[1]))istrin.clear();* w$ o; ^$ B8 ^0 }5 ?! z) M
for(;;){
; g/ M8 U7 r. e# t6 E( h if(istrin>>csym[2]){
: q$ F, g0 i" I! Q switch(csym[2]){
' F: v' V' q; v' I$ }6 e4 d* U' P9 d case '(':6 r8 t! X# {$ S* ^0 l- r2 C, _
if(!csym[1]){nLevel=0x100; nERR=1;}else
6 b5 h9 U: p0 p if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ K4 b! U" S% _" l- }% X else{nLevel=0x100; nERR=1;}: I" D* S$ t( Y7 J. H- p$ a0 M# M
break;( V2 Y/ e) x1 D7 Q S
case ')':* Q' p, H: `, G8 {! \/ _( E
{nLevel = 0x100;}break;2 c" S D) a. I8 ^1 C
case '+':case '-':case '*':case '/':! e3 b; B/ ^% ^# r* h
{csym[nLevel++] = csym[2];}break;
5 ]! \: ?* Z8 C case ' ':case '\r':case '\n':case '\t':continue;
# L" Z3 I# s9 K9 b( c default:7 U+ y5 ^- r z2 W/ P
{nLevel=0x100; nERR=1;}
! |% G9 s7 t$ o* ^$ W }/ H6 I' R( ^. i2 _9 m) f1 f% \
if(nLevel==0x100)break;
1 U, \. W. A5 [ if(nLevel&0x10 || istrin>>t[2]){
( a) Q0 J, ^3 [, U+ \" X, r: V nLevel &= 0xF;
5 w5 ^: o8 x* \" d4 p: l1 k if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
/ z v: n: F8 Y! ~3 {/ M if(csym[1]=='*'||csym[1]=='/'){
3 F9 d d s8 I) D# Z+ b8 V, I GetExpValue(t+1, csym[1]);
6 ?1 {% g* g) g1 Y; d) ]5 u- q- e9 v, M% ? }( T9 y7 J. j# `/ _2 v1 u' y
else{& N9 d: ]: E( E
GetExpValue(t, csym[0]);3 F, @' j- D! P0 j( o
t[1]=t[2];csym[0]=csym[1];csym[1]=0;( P- h! p' O4 v7 |
}3 u; m6 E, q( K, `) m
nLevel = 1;6 k$ T9 z1 l8 H! g! Q* F3 l
}
6 y. I7 ]& c- S6 i5 I else istrin.clear();( J6 w+ V3 T0 v0 L1 F. X6 x: Y! M1 U
}
7 h+ g. |8 {3 u2 Z else{nERR = -1; break;}
0 y* X5 u* O( l% R# ?/ R/ a; a }
) f( t) p7 l$ I3 o7 p5 p. _ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ o/ A# t6 x9 j0 ?; o* V
else nReturn=GetExpValue(t, csym[0]);
- ~& F7 w2 E6 ]/ N8 e7 K return nERR==-1?1:0;. X2 q1 W+ z, l3 s# r4 e
}}
7 {0 w6 E0 F/ B4 V2 q- Q$ ?" E* l2 X" h6 Q5 c: Y
4 O, N; l Q' i0 z/ \7 B# E
' E9 d6 |# L/ {/ g* U. m3 B% q
函数模板使用示例:
/ x9 i1 L, a2 Y+ g( A' I在以上那段代码的后面加上以下代码:
$ O6 \ p0 |) \8 W! Y6 S) L* _* Z" @
H# f7 ?/ ^. l# [! M
* ~6 t# [4 o/ T5 M3 _. z6 x程序代码:
* @, y7 C7 g6 V C' Z5 N! l. ?0 s3 [$ k
#include<strstream>. t& ^( J$ V" Q) |. s* j& M3 J
#include<iostream>
+ E' M; l$ E' a5 s#include<string>
8 @1 P7 P; W. B* \3 `using namespace std;
* @% ]# Q% h$ l5 pint main(void)
0 z, A; m- |+ i4 o{* D- o8 H Z$ A
string s1; E+ c6 ]9 E1 j
while(cin>>s1)
8 @. u5 J2 v& }( x {) O3 Y! T8 i0 b8 J# r. ?" P8 F
istrstream isin(s1.data());
! W( y$ w+ V* t& A1 p double d;
6 O; w- A4 c4 W5 U! w- {* Z& \ if(fy_Exp::GetExpValue(isin, d))
; H ]0 o Y7 y6 W {* I) Q2 ]( Z+ s: _& O2 A
cout<<d<<endl;+ d, A5 _. O" q- }" O
}( J, M: n5 [0 u; N" R) n) S# n& k
else
& f1 a9 `; H2 f% g {
2 J- X0 e5 u7 N: a( e) _# e cout<<"ERROR"<<endl;
3 L; T* X, [- B2 n }* X/ k0 b6 b& P( h# v
}; s( ]3 @. S- D7 M* |$ I) G
return 0;. `$ E- l' M) P* L a
}7 S8 D5 w9 ~" R4 C- E- p8 O+ K
8 E8 p( |- t' g" a- d) N
: ^2 B5 ^& n+ B+ x# ?7 u
然后编译执行就可以了(*^_^*)3 M k3 E% A" i& i
其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ h6 ]6 R4 ~! G* u% e r$ F
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|