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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,% {& ^' x$ s5 d
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式4 q" r; J' ~4 `
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)- g8 d; |4 Y! _
参数解释:
1 I7 k T7 r/ eistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流$ V8 v+ C6 N, E/ P& P$ s S
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
G8 B, M. y# w6 b0 h返回值:7 v" z5 s2 q+ H1 Z B u% F
返回非0表示计算成功,0表示计算失败有错误- V+ A T$ i1 c/ i
3 ]1 d: c- ~" `( ~
; y, {& [5 Y/ ^6 [0 `
0 [6 r! x4 E: U( _
程序代码:
9 }1 z. }% I L1 \. Z: H. A' g9 M3 g( N3 p8 z; q
namespace fy_Exp{6 W* e2 I0 e+ S3 E
namespace {template <class _T>$ a* j. e4 X2 \$ S& q6 T
inline _T GetExpValue(_T t[], char& csym){5 X3 p! c5 X# P/ O5 m8 j- ^
char c=csym; csym=0;0 P' q4 `5 v0 P8 ]. D5 l7 y
switch(c){
" E. G( h; K- X2 Y( u* r7 l case '+':return t[0] += t[1];9 k5 R8 x l7 t2 X1 D, f
case '-':return t[0] -= t[1];' ~. G2 w3 I! k4 S
case '*':return t[0] *= t[1];- a4 n8 V+ I5 c3 k% g5 t. t
default: return t[0] /= t[1];//case '/':
* ~. ~ O- M3 `) i0 m }
4 G) z3 u3 {& E$ J* Q: n}}6 ^) b+ f/ d% W0 y" r0 V0 |
template <class _T, class _Tstream>
* }8 h2 }! \8 l( S/* _Tstream: inputstream, _T: get return value
# U, N [3 m0 a& ^7 a: | h* Return nonzero if get value successfully */
5 C. V- y0 z( Sint GetExpValue(_Tstream& istrin, _T& nReturn){
t' l) I; Y+ ?. M4 L _T t[3] = {0}; //雨中飞燕之作
* P/ X* o J; w* o; s) Z r' T char csym[3] = "++";' p1 C. j/ A) M/ k+ \6 m) S
int nLevel = 1, nERR = 0;' \" N& h" X8 C t! u8 B4 o) V
if(!(istrin>>t[1]))istrin.clear();% x! q% G( J4 S6 L
for(;;){9 M6 z: s9 C5 \
if(istrin>>csym[2]){4 Z: J% u( p, z
switch(csym[2]){
2 o9 b2 z& P5 S4 y( O* A case '(':; ^* s8 e* p3 a
if(!csym[1]){nLevel=0x100; nERR=1;}else
; D) {7 h& r9 L# X$ K- I if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 a$ [( S$ _( ~. ~" R0 U
else{nLevel=0x100; nERR=1;}6 A' r+ ~- A5 |0 G! U$ u% ]% e- r
break;: X6 ]$ \9 c3 P3 m7 G
case ')':
/ u8 O" c7 @" p, _% l' I {nLevel = 0x100;}break;- W! s$ m5 g5 o1 M( \$ v' {
case '+':case '-':case '*':case '/':
/ g' T+ T8 a! Y( }, v8 O4 A8 R y {csym[nLevel++] = csym[2];}break;/ u: h3 S9 l; b9 [8 P0 \+ ~$ f
case ' ':case '\r':case '\n':case '\t':continue;
& X2 K2 t. f+ m$ s( h default:
1 Y- C) Z2 R3 Y% m6 |9 r$ a {nLevel=0x100; nERR=1;}7 K+ t9 Q& z# E# q3 d6 w
}. F+ y, w. v) t: D" |+ \
if(nLevel==0x100)break;
; L2 _3 p& C# h2 Q& s( A+ A" @ if(nLevel&0x10 || istrin>>t[2]){
4 b0 {5 Z3 ?+ [! q4 A; F! a nLevel &= 0xF;
9 F- X$ }& z3 R6 A if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}4 n. R0 g9 t( `+ _$ L6 B& R6 J
if(csym[1]=='*'||csym[1]=='/'){
+ E7 c' n* y/ x GetExpValue(t+1, csym[1]);
d, R" \6 r$ f X }: ?3 ]7 w' m3 h( a- n8 J
else{
' w' ^& ~# U9 Z# J( i% d GetExpValue(t, csym[0]);+ F: B/ S S, b4 g7 i1 I
t[1]=t[2];csym[0]=csym[1];csym[1]=0;4 n. B1 J0 `6 q: M$ h$ Y# S+ U
}- Q. b# N& e& J) e8 l7 H+ S/ J
nLevel = 1;1 h0 j( e+ }; _5 w/ s/ b
}; ?- ~* ]0 J1 v9 d0 \" I
else istrin.clear();. `5 l1 | S; @* T
}
0 q% F" z. ^; Q* @5 w5 b9 ^ else{nERR = -1; break;}6 W+ v3 h7 s; f3 v+ z' N
}% v7 Z" `5 b; S2 s% s
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% y, z S8 O2 K) p" a* [( m- R
else nReturn=GetExpValue(t, csym[0]);- I/ k8 h* ]' ?2 g) F
return nERR==-1?1:0;8 @1 t* b) d. A/ g' l; h
}}% F8 H$ b1 d& U' C
' i4 _5 h3 r$ ]9 d0 S" q: l+ f, a+ Y# X1 g( H! I
" a4 \+ G0 P0 R, o1 q
函数模板使用示例:
) E4 M* |+ |- r在以上那段代码的后面加上以下代码:3 k! s+ Y! U& B+ |+ A7 K
; B8 i8 i) h ~, \ / ^0 Q; q( \" C) @) |2 ]
" J( a5 a! [6 W& i& u9 N1 x程序代码: # I$ `* _. V8 r( C( W
! R! {& Q0 Y( h5 q$ R4 L2 [0 Q# ?#include<strstream>/ m& r0 p* _# ]) C. a( t
#include<iostream>3 B' l& Y8 B9 G" F2 s
#include<string>
% w% l9 g8 ]3 f3 {+ iusing namespace std;& Z) C; a( P6 [& E2 S, X
int main(void)- f7 y' a$ C3 m/ ]: \
{+ s3 _; @) x2 L) V
string s1;
/ y$ k! _ q6 y while(cin>>s1). [, A% f$ N- C. m8 B7 F- ~4 _7 Z" P( q
{8 ^& ~0 V) Q$ T, X* p# E/ n
istrstream isin(s1.data());9 k, g9 ?7 r2 g: G" D* _
double d;' O$ x7 E7 [: i8 Y$ ~# y* k
if(fy_Exp::GetExpValue(isin, d))( G4 K6 I3 i% T
{
8 ~6 G3 c! @" K* D6 }0 K5 t cout<<d<<endl;
3 |9 a# V' z3 j. [& ^ } e+ }# Q' d' t
else' S/ n4 D# s& v
{9 o" @7 V% u7 Q* d2 P5 f
cout<<"ERROR"<<endl;$ O. B4 I! R/ C5 D
}' a( o8 o, m$ R8 U( C; R
}
9 H( ~& P& V8 B6 {0 [4 y return 0;) F* ]0 x. J$ r3 m
}
* I5 p4 n/ p8 O/ U4 D1 \) O. }! X- M
" y3 z1 V, n& |9 P. ]8 S然后编译执行就可以了(*^_^*)
1 k1 X) d! {- \) c# p其它:TC++上一定编译错误,不保证在VC6上也能通过编译, K5 i# t& i+ A' |0 E- [
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|