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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
: k' K9 y+ `, c) E# Q6 e. R一个很方便的函数模板,可以并且只可以计算含括号的四则表达式/ u6 S6 P6 I& |( {8 N
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 W3 m+ O; T' @" \; | ^
参数解释: K ^+ {! y3 }: I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
! J' ]* R* Z ?5 d8 |nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 ~ e( {2 E2 H/ c/ E
返回值:. l0 t" p! _3 e
返回非0表示计算成功,0表示计算失败有错误
0 K( ?# |5 M0 T" F5 o' l* \( t* V
" G# W# F0 \, a3 [& `! v6 i* T& z0 y. G/ x! m d
程序代码:
% \8 g2 u+ B7 ?2 K% H2 h7 ^
2 d" F1 G8 H" ?: |7 J+ h6 inamespace fy_Exp{0 F6 [% Q* E7 a8 s* d
namespace {template <class _T>
0 d' d$ e5 Z8 b2 vinline _T GetExpValue(_T t[], char& csym){
" J7 l/ U* f; b+ i! S char c=csym; csym=0;2 k; w6 j& u! P% v2 d, w2 J& P
switch(c){
; \& c/ O7 d5 B case '+':return t[0] += t[1];
; y1 B+ [8 C- h case '-':return t[0] -= t[1];
% @6 V6 S# X& g& J case '*':return t[0] *= t[1];
/ C8 U( U- x9 k$ ]' t0 w default: return t[0] /= t[1];//case '/':; l2 {5 t! F# w1 A: k
}3 u+ q3 _7 S' w/ K) @
}}
2 d& L6 o7 J" z5 Dtemplate <class _T, class _Tstream>* L+ g! L5 T5 K
/* _Tstream: inputstream, _T: get return value! i' E' `9 k& e J
* Return nonzero if get value successfully */
+ G; n/ b0 a6 u2 }4 X$ g4 F( cint GetExpValue(_Tstream& istrin, _T& nReturn){; r! [! N3 W. _1 q3 r5 ^
_T t[3] = {0}; //雨中飞燕之作
* ~8 o' @/ G+ m0 @ char csym[3] = "++";
& F, a$ f0 K7 }, f; H int nLevel = 1, nERR = 0;
2 _7 [8 _+ T! p' x+ z if(!(istrin>>t[1]))istrin.clear();
+ Y/ P1 e0 q; P3 q5 k for(;;){
4 z m# g8 o; s" H! E( I+ t if(istrin>>csym[2]){4 o0 x0 }, H% D: G
switch(csym[2]){
0 p7 x' t' ^" o5 f, ]# t( ?7 W. |; M case '(':
1 u. _2 i9 F5 f- i9 U2 s if(!csym[1]){nLevel=0x100; nERR=1;}else W" _. E( _; C. f
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
4 [& [. C: T, i6 B else{nLevel=0x100; nERR=1;}( l/ k; l" g/ [: c7 Q# C7 e
break;
' u5 t8 w- t: D$ G+ P case ')':6 E$ K" _! a( C4 T0 c
{nLevel = 0x100;}break;
( [( a( W, S! J( [2 S case '+':case '-':case '*':case '/':
% r5 T/ G7 u2 d2 ?; T {csym[nLevel++] = csym[2];}break;9 o: o5 p' Z3 f) M5 C* @0 y
case ' ':case '\r':case '\n':case '\t':continue;* x( b" F8 j' Y% I0 U
default:
7 s8 f5 \) q: S9 } {nLevel=0x100; nERR=1;}
8 e2 p% e m+ @) N6 g }
# d& n, Q. n6 _- | if(nLevel==0x100)break;
& A2 M( m9 B9 ?- t' n if(nLevel&0x10 || istrin>>t[2]){
s+ ^# P! Q/ {! { nLevel &= 0xF;& z6 e1 X1 @% k8 r5 o: ~8 q" f O/ Y
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. y% F# p+ K" R/ e
if(csym[1]=='*'||csym[1]=='/'){7 R2 T- R! b6 a, P/ N& l- T
GetExpValue(t+1, csym[1]); a$ n7 `6 t. l
}
# C9 l( b% Y4 T+ t% C8 F. n else{
4 B5 c$ c3 r2 T' b+ T, Z6 E" x GetExpValue(t, csym[0]);6 u, p. x9 f) a0 C5 `0 z/ v2 A
t[1]=t[2];csym[0]=csym[1];csym[1]=0;- h: B# N2 v( P0 p/ P% ~/ U
}1 Y: s# c" a" u7 f
nLevel = 1;" d* f6 R5 U& M; Z6 g) [
}
" j' p% Z3 R" H) q: e x+ p else istrin.clear();
2 n" y$ D5 G$ V; J; d w }
3 r0 c' g* O+ o$ K* ?' _, { else{nERR = -1; break;}
2 q- L3 O# ?, e0 w; U# ^$ i }8 b# Q) r0 W4 e" a) k: s
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: M; |5 ^+ p4 o$ ~' x" l* r T else nReturn=GetExpValue(t, csym[0]);
1 C- l4 B- U2 a& E return nERR==-1?1:0;& F9 j( i! W2 O, A3 R$ X5 v! w* t2 q
}}0 V+ S+ M9 x' H. ^6 s' r$ `
) c9 l8 X" V1 v4 G1 f6 j6 T8 A- d1 }9 Q5 v1 i! k4 s( Y5 ~+ f$ Y$ \
2 F) x; T T: k& g" G
函数模板使用示例:
* ^: |$ M, ]3 T3 g9 _6 U- g在以上那段代码的后面加上以下代码:
0 H. w8 ]; o% B! P# H6 \
* @& C- ~ {8 q3 n3 H
; f2 ~2 y' I3 {3 d1 B6 W4 n6 E2 D6 {) C5 b2 y! c3 }
程序代码:
5 {/ L) M0 ?: ?9 ] N+ U e" b& L' m, I+ }
#include<strstream>5 l4 P; a8 ]$ \5 V
#include<iostream>
4 k0 s* y* W; }$ p- k5 d6 h' r#include<string>
' t9 |* ]8 ^: K1 h2 Z8 H2 u5 Zusing namespace std;$ G4 d) U- z+ W& }; L' C
int main(void)/ Z9 q/ Q) k; V' l
{$ N P% A% O2 e2 E& C# b
string s1;
1 Z a( n9 P Z+ P! [# P) \# Q while(cin>>s1)/ y: k$ e, y$ Q* s7 p
{7 B5 Q0 @ Q& I/ G! o
istrstream isin(s1.data());+ j' Q- w, N0 M- R+ N$ D. \1 W
double d;* q) N8 ~4 Y# S( w1 r0 `
if(fy_Exp::GetExpValue(isin, d))
O+ ^4 I2 e" K5 [ {, M/ D J; A& r" V _) { r/ P
cout<<d<<endl;
_6 [2 j# E4 ~# z }
" T* U+ }3 ]1 M! T2 e else
4 G+ c& I* Q& A# C3 ^ {
7 g; |+ Q1 U* l- Y cout<<"ERROR"<<endl;
% J6 k% \ q, I. J+ q }
4 V" `1 `. _/ r1 [: Y( G }. j+ R! Q2 N$ S0 |7 a! `
return 0;/ x- w. f& S+ `0 J" K+ X8 e
}( w+ T: u. b% }
) H4 C0 O d' F( {7 q, D& Y
* H4 U% ?5 i4 z( ^2 Y然后编译执行就可以了(*^_^*)
$ a" v. @. U0 e% ?3 f6 W其它:TC++上一定编译错误,不保证在VC6上也能通过编译! m( A: \1 `3 s3 h' f
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|