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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
% ~. C/ A$ n+ d) {/ K& O一个很方便的函数模板,可以并且只可以计算含括号的四则表达式# g& I) Z; `6 f$ X
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" o1 L1 ~) C. V6 L+ S" U' q参数解释:, v8 @) s, S) `4 v
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流: R/ A: j9 ?6 Y5 u; H8 @
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
& ?" | S& r( l! j; _返回值:
& @3 H& u: g+ e$ n3 g! @( ~2 x( U返回非0表示计算成功,0表示计算失败有错误) P! b! m; s, [$ Z2 t/ N2 i3 v
2 ?3 U0 I7 x) g: ]: t% w . c6 c. z4 Z9 C) u) {; m, U6 O
8 X+ p4 U- {( g/ {程序代码: + Z0 u0 z" l, P. y- w, N6 }+ l
6 N z0 @3 h0 Knamespace fy_Exp{
5 @8 i& ^0 x- H3 Rnamespace {template <class _T>
) n" I/ |' {7 U! U4 Tinline _T GetExpValue(_T t[], char& csym){2 a0 P: Z: `- z/ x0 X
char c=csym; csym=0;
* B+ ~6 l% W! n X9 h switch(c){1 D* t8 }6 W, ^ S C# u
case '+':return t[0] += t[1];( b! J" t, j1 e( z
case '-':return t[0] -= t[1];+ }. D3 p( C* k0 i
case '*':return t[0] *= t[1];& ~( E) }) q5 F$ z7 D5 o2 Y
default: return t[0] /= t[1];//case '/':3 q2 F; k; d0 a% m M
}
- A# }, b: W- x6 ^3 o& t}}
?( k& r, R. Y' a2 vtemplate <class _T, class _Tstream>
3 K7 ^4 o2 _9 i$ h$ f3 L/ n* ?/* _Tstream: inputstream, _T: get return value9 r Q& t# Z/ V+ a1 f, C
* Return nonzero if get value successfully */$ q6 V- {0 W7 k. s1 C
int GetExpValue(_Tstream& istrin, _T& nReturn){8 q3 n5 U" y: w4 M6 B
_T t[3] = {0}; //雨中飞燕之作
) a% c) F/ B* _) f char csym[3] = "++";
7 [( X- W a( q int nLevel = 1, nERR = 0;9 i. U3 y% V: Z& ~ ?" B
if(!(istrin>>t[1]))istrin.clear();
: t6 u0 d) U6 l! s2 j for(;;){
+ P+ }3 }; W+ K* w5 w7 } if(istrin>>csym[2]){
) b" T+ [. x) v/ e5 r4 V; f! K8 [$ D switch(csym[2]){$ _7 b% V" Q( K2 q. u; u
case '(':# ]3 I! H7 ^/ `( w8 i$ p
if(!csym[1]){nLevel=0x100; nERR=1;}else: |/ P% v+ T. C. Q9 d
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 t: N2 H0 S0 X0 Q else{nLevel=0x100; nERR=1;}
; k2 Q# ?6 W3 b* }8 p8 E: e break;# G3 v; z7 ^8 | D8 i/ t& `! H5 l
case ')':
# d% w" r+ K, y0 M. @ {nLevel = 0x100;}break;
* m! p) P; p# Y' }' `0 s case '+':case '-':case '*':case '/':
" R3 y2 J0 r1 |- `. V$ V {csym[nLevel++] = csym[2];}break;
. M6 M F7 ?- T. E- ~: b3 u case ' ':case '\r':case '\n':case '\t':continue;) t9 s" `) J2 B- k
default:4 K& R/ [- }; M
{nLevel=0x100; nERR=1;} m/ L6 |. ?, Q$ v# _ _
}
$ q0 {- z8 v8 O1 @( f4 L if(nLevel==0x100)break;+ O, c. S v% z. V9 Y5 _
if(nLevel&0x10 || istrin>>t[2]){
l0 g. v9 f. F C5 { nLevel &= 0xF;
9 Z, x+ O% a) B- g* ^ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
' W% l/ U5 P! U0 K: ] if(csym[1]=='*'||csym[1]=='/'){
! S* K3 C0 R+ C8 |0 ^& o GetExpValue(t+1, csym[1]);. q2 [' M" F4 q$ k2 k/ y
}2 V) x' C4 l0 v% a" m( {
else{
( g1 r1 `$ u- d2 y7 V5 p GetExpValue(t, csym[0]);! \1 h* a _! V4 Z9 q6 C, V# t0 a q
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 T$ o c& H. ? }. V ~: Y c' L' [ Q7 ?
nLevel = 1;
# T2 K! s- r D: m& a6 N* G }
. {: E$ X& K, |) T+ ? else istrin.clear();6 K7 t4 P* g& j1 Y
}+ U2 d" g* t6 }- d
else{nERR = -1; break;}
9 f' S( p1 [$ B2 i% L' e }
) K3 F V& }* g2 w( J$ K; z, Y if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 D5 q8 t9 a- f/ R- I else nReturn=GetExpValue(t, csym[0]);( u* }1 ?8 u1 g( t8 s+ l
return nERR==-1?1:0;1 u' b- a F% b
}}
6 P! L( @( m/ S( a3 _% @$ t1 _, c- v1 R+ {' g
- @& D& E" [: u' F, `
e5 \' y; Y, N7 T( u' K
函数模板使用示例:4 | c# Q! t+ j! B3 g9 q$ N; M5 |/ F
在以上那段代码的后面加上以下代码:
- T7 E( z/ a$ H; E. L: f, l% r$ q" `' g, c( ?3 I
3 x' w; M v, Q8 X
" ?+ \; |; }% M4 r5 q% Y6 Q程序代码:
0 Z" _6 X1 d3 u1 x# h+ ^1 P' i! E8 u/ b' k) X( N+ C
#include<strstream>0 W. u+ K0 B0 e7 X2 [/ C5 I
#include<iostream># S- P9 Y' j/ |. t) p
#include<string>) J `0 H/ E/ V- j6 K
using namespace std;
% E( Z# Q- ~+ h- Zint main(void)! n: P+ ~0 l. b- [ C, O
{; c7 o8 \9 i* {+ M* W
string s1;
0 y1 o- E/ @4 `: @! W; `2 h2 g while(cin>>s1)+ i; i. [4 R f' y
{
, P" r% }2 Q3 ?; U9 s/ t istrstream isin(s1.data());# R; Y/ y" Z; Y
double d;
6 e9 m9 |0 c! V# o if(fy_Exp::GetExpValue(isin, d))1 G7 W" y- [9 [2 N* f
{, G+ b4 |' u' M% l& u% w
cout<<d<<endl;2 V& j- J& v% u! w1 }( K' q# p5 B
}5 u& b) l! Z* ~% Y
else, c& |# {8 I# C7 ~
{3 q ^# p" T* ~7 W- x* c. F
cout<<"ERROR"<<endl;
: u$ F6 [: h1 j( P7 C y4 K }9 u* v8 R6 w( N" }
}1 v6 _! `& e. m! V3 k+ j
return 0;
% N$ W0 m& s: f2 J5 Y0 |7 O}- J, r; g* L, r" ]! {. _
7 n; o, a* ^9 g* q6 f7 l
' ^7 U. C1 \6 d& j- T/ u; M* K% W
然后编译执行就可以了(*^_^*)
* o% \1 k) k& K5 t其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; c% G9 F5 a: A; t m. A/ k( L 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|