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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,) _! n* h9 i- M G# Q2 W/ X
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" a. n, E2 ~7 l. R/ N# ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); E* L" _- M) M3 C9 V9 d; g
参数解释:
+ @ S- e" R' S/ T. Aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. z; l6 _5 [9 X S, D1 gnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' z4 V( ]" R2 k6 J
返回值:
0 t: I' B2 A' A# H$ E& B返回非0表示计算成功,0表示计算失败有错误
. Q `$ p# F. z+ _0 h5 i' ^1 V( s/ J( m0 j) _" ?
5 {2 s3 T: s, N3 j1 S) D" {; z8 n5 W1 R# R6 o7 ^1 _' i" x
程序代码: ( a/ X& f: K: _0 e2 c$ x
; w! J7 n6 v3 _; `1 u' p
namespace fy_Exp{
% g( a8 Y8 |- o1 B4 x' A/ t2 F# Rnamespace {template <class _T>( w6 H9 W" c6 w" ^ o
inline _T GetExpValue(_T t[], char& csym){4 y. a* V4 B/ d, `; H+ X% \ @
char c=csym; csym=0; [6 D. h+ p% y( N2 {9 h
switch(c){, M- q: i0 d. j( C& e! ~" S
case '+':return t[0] += t[1];
. \2 Y" U* ]: ~/ m5 l$ [# L case '-':return t[0] -= t[1];" g- @4 L* _$ B2 X, b. r
case '*':return t[0] *= t[1];
3 P9 R* B" n1 y) r, F' q F. s default: return t[0] /= t[1];//case '/':) T# f% G8 w1 W8 I# i2 F
}4 P# w; R j( J4 c" o
}}
W) a; z. V- ]- U* U. M' @template <class _T, class _Tstream>$ r: t2 e% G3 F0 u/ m9 W: K
/* _Tstream: inputstream, _T: get return value6 ]+ J) t: k% Y: c6 {+ X6 l
* Return nonzero if get value successfully */
& w) i. A% k4 L. {& ]' d, rint GetExpValue(_Tstream& istrin, _T& nReturn){
, r# q# O# O$ J" n- u, K _T t[3] = {0}; //雨中飞燕之作
' ^2 @( N9 p& G char csym[3] = "++";
# _8 H9 E5 _! q5 u. ^# l$ Y9 w2 d int nLevel = 1, nERR = 0;
0 o v# D* m, `2 s! L& C if(!(istrin>>t[1]))istrin.clear();
2 T5 f: _- ]% t for(;;){3 S% i' M' M6 h; S, ^& W3 V
if(istrin>>csym[2]){
0 o6 i" d$ O0 N+ E. a! k L1 D switch(csym[2]){
2 V5 a% n+ j6 f0 j, g Z case '(':
/ @ Z( |8 f( B) q& _/ P. y if(!csym[1]){nLevel=0x100; nERR=1;}else
6 b; B! j- k5 G3 w4 X7 s if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- S; _: w. J" V! Q- H else{nLevel=0x100; nERR=1;}1 a0 {8 J1 [( M; _ K* `4 d/ B
break;
$ w2 n" D3 f' u& a case ')':
# n Y; X9 h, A) x {nLevel = 0x100;}break;
9 D. t0 ` }6 k! V) z case '+':case '-':case '*':case '/':
4 Q# b K% ?) l2 @* d" [ {csym[nLevel++] = csym[2];}break;" n/ a) C1 t3 q7 _8 k
case ' ':case '\r':case '\n':case '\t':continue;. X, i5 Q4 c. N9 B- T
default:
$ C) x/ K+ s- ?5 I2 Y* h {nLevel=0x100; nERR=1;}, p6 }. C9 l( u2 ?) N% @
}
, t/ t) z6 u. O0 m# j if(nLevel==0x100)break;
( \) E0 z. h% F' g if(nLevel&0x10 || istrin>>t[2]){
1 P& L# L" P/ s/ X" t% j u! E nLevel &= 0xF;* t* x7 Q+ ~ n) ^
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# P( f/ ]+ Z# W! O( G if(csym[1]=='*'||csym[1]=='/'){- F O) {8 f& E; \+ r0 _7 x
GetExpValue(t+1, csym[1]);
) E4 H) i2 R/ Y9 K4 z4 A% `# k+ M: @ }
C1 `7 E: @1 H. D3 C else{4 B+ q# O& C) F% y- x- D9 W% b0 g
GetExpValue(t, csym[0]);9 |4 B! v9 x0 n0 T
t[1]=t[2];csym[0]=csym[1];csym[1]=0;# i! K" \. @# L5 L2 C! l( _: A
}
8 u; `, M V, v; m nLevel = 1;) T3 x% k g+ w% S
}
" [% T7 |2 n. @+ |( K" a else istrin.clear();
2 f! I4 V1 x7 c @$ H% _9 z }
1 G5 w+ T/ w( `* p else{nERR = -1; break;}* v, C' V2 H" i* D9 V5 e1 w
}
* \1 u9 l. b" G if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);& _0 q6 a( K9 e C
else nReturn=GetExpValue(t, csym[0]);5 ^" u' w/ h7 \& d( E4 D J- l- }# F
return nERR==-1?1:0;' g N" L+ ?3 h
}}
4 k; x. k% B3 @% T
* \0 x. Q9 ?7 ?" O! s4 C. E) S9 \: r8 q6 n& z: G# K
) C. \' T8 L( G9 q, f) {
函数模板使用示例:# O6 H" v. W v
在以上那段代码的后面加上以下代码:
" n9 h& c8 ^4 B) D( ^
* ^. C- ]; e* A: s; j0 T& W 3 R6 w5 |! [/ A, {4 e
+ a1 i* T6 f8 w( T" m程序代码:
$ z7 R: u: J9 W# w; V' T
9 Q" E- e9 K' c# x#include<strstream>
* e. Z# H M4 f0 T- \1 X5 I#include<iostream>- h& i( @( J, C; l
#include<string>
' V# {& X3 ]7 I6 z# R8 musing namespace std;
0 ^* w2 R3 @6 j$ A" C: Q2 {, t# M3 l% bint main(void)
. B3 C3 j6 N. r8 N: V+ K1 P{0 ^3 h' P6 T H$ S
string s1;
) K" v# ?) G3 B/ E0 p4 z while(cin>>s1)# k9 E% f. z& ?: h
{
9 t% n) @3 e9 }( _ istrstream isin(s1.data());* d( C2 a7 r& x" U4 U
double d;
_' Z: P2 d$ q* ~/ o0 h2 Z if(fy_Exp::GetExpValue(isin, d))4 k) G( U* m4 ?- n% ? m
{
" R- z$ A, d) t2 z3 D6 ~% | cout<<d<<endl;( e0 m D% Y7 K1 u o9 R L
}
2 _2 \& P! Y( {) k! |. Y else
2 f% K. X% m6 A( v/ j {. q$ d7 O( C& T2 @# ?2 `+ v; ~
cout<<"ERROR"<<endl;6 f8 G6 U9 ?. F: F6 f) I6 v: w8 i
}
6 _7 k0 n" ^! [& i: t }
6 a9 l2 ?& e1 g return 0;+ B4 E. n+ ~0 z) m7 f6 i
}3 P' s3 l# r% ?+ v2 D W3 _. ]) |
' E" ~% m# B: s; Z- _& S
5 ~- F0 E9 N# Q- o+ }% b
然后编译执行就可以了(*^_^*)' N1 Y. l) s( w
其它:TC++上一定编译错误,不保证在VC6上也能通过编译3 n8 y9 i- I: O! o
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|