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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,2 o: x/ Q8 A) A
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 C) b% Y% r ]只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ f- G, s4 D! Q/ c/ O参数解释:! X) I% n& t4 t+ s
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
% ~8 u$ G- S! Z) L, xnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定 N. I) m$ i4 L. i- _% D3 T0 T$ B
返回值:8 k# k8 l/ }9 }7 ]1 p
返回非0表示计算成功,0表示计算失败有错误" }( [9 T' G ]% x
! ], z' T3 P4 e1 ~* H
# ]% @; v) d% {
9 Z: e: p3 } a
程序代码: ; @3 l n. P1 {( l
- z5 V& B/ `5 D% N3 } Mnamespace fy_Exp{
; r4 r2 t" A* b& s. snamespace {template <class _T>0 g5 v6 N: ?* b. M" g9 ~9 j
inline _T GetExpValue(_T t[], char& csym){/ ~6 O/ J$ Q% j, b1 `
char c=csym; csym=0;) |4 {7 Y" `7 J1 v
switch(c){
5 O! n& U1 p! j) \. L4 C0 `' R case '+':return t[0] += t[1];
" Y/ F/ U ]" n) r% c J case '-':return t[0] -= t[1];
6 y- m) t) B7 u: R case '*':return t[0] *= t[1];
9 a4 _* y5 E, v default: return t[0] /= t[1];//case '/':
7 `& W7 n9 G3 u) Q( t }1 s. d$ V' R2 R* t- f" T
}}
- N* ^2 o% Z6 M ?5 T9 Ttemplate <class _T, class _Tstream>3 ]9 b3 f1 K/ C1 C6 W4 r
/* _Tstream: inputstream, _T: get return value% m6 C7 n/ K0 d; z8 N" m
* Return nonzero if get value successfully */; q0 C$ ~7 t. N# _
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 p: [& S' D6 E- S* L5 s0 S U _T t[3] = {0}; //雨中飞燕之作
R1 S/ t* e8 F' h; |# V& r char csym[3] = "++";; [% X C1 y" X2 }
int nLevel = 1, nERR = 0;1 j- @1 p( t' s( j1 X- t
if(!(istrin>>t[1]))istrin.clear();
% i" @# y# N# e; O* d- u7 F) D# ^, d for(;;){
1 a5 @0 {, {5 m. m- t if(istrin>>csym[2]){
2 L+ { {0 j# I switch(csym[2]){ r' `3 M( k, W9 d. s6 k/ Q
case '(':
J2 u% I& y# q if(!csym[1]){nLevel=0x100; nERR=1;}else
# l i8 k) j: N- S5 S% R; Y if(!GetExpValue(istrin, t[2]))nLevel|=0x10;8 `4 P$ G: w% s1 ^
else{nLevel=0x100; nERR=1;}6 K: f+ K' C* o* L
break;
0 f1 p% M1 U0 D6 ~$ c) r& u! u2 Z case ')':
9 ]8 Z) P3 F$ u# d0 Q {nLevel = 0x100;}break;
+ u/ x% S3 o6 g; ]! L case '+':case '-':case '*':case '/':
) S# |3 Q# {/ c) Y {csym[nLevel++] = csym[2];}break;$ Z( [5 k k& U
case ' ':case '\r':case '\n':case '\t':continue;, Z) I1 g7 Q1 `9 O3 ~8 T0 o6 }
default:
! s- \- Q& Y6 U, t4 e2 E- l {nLevel=0x100; nERR=1;}% P6 _4 A4 [7 f j7 h
}$ `( x% T; G @& r+ X
if(nLevel==0x100)break;2 ]: |2 W7 f; K3 E. l
if(nLevel&0x10 || istrin>>t[2]){
& W+ R. G; O+ L+ M nLevel &= 0xF;3 x P( G2 w% R
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 S- `+ U: j1 [6 U if(csym[1]=='*'||csym[1]=='/'){) N+ m& z) \5 U- l
GetExpValue(t+1, csym[1]);
; P. E4 E M5 l8 ? }
; Z5 {: T8 Z, G* P& O/ M: r else{4 S6 S% d, @! V$ [' }
GetExpValue(t, csym[0]);
$ D2 \9 u; N1 h Z. J, \ t[1]=t[2];csym[0]=csym[1];csym[1]=0;
( x! v# h, K ~1 J3 Y }2 J; _1 f$ ~) q" T+ r- e
nLevel = 1;
. X4 a% c% A# k7 W0 C }9 F5 _8 F9 m4 z% J ]
else istrin.clear();
6 K6 n! H) h8 q }
2 d5 a$ r v! w else{nERR = -1; break;}
7 \# t* K! k9 R4 J) O }8 O/ ~0 l7 m3 `( {# i
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" a* n) z r5 |$ v& h3 k( B, b else nReturn=GetExpValue(t, csym[0]);4 [5 ` U- g0 [
return nERR==-1?1:0;( R! _1 S Z3 s# }
}}
) p3 T) j5 @- h: {; T
+ j! C/ @! }) z, n' X/ g) G2 f7 [0 S4 a$ D
' L( j4 M/ h6 N& t函数模板使用示例:
" h) v1 V4 s& C! V6 n* ?2 t. B在以上那段代码的后面加上以下代码:, R( r \1 J4 u8 ~, \7 n
6 g) D& H% v8 j$ [9 U( B
7 H! p* _3 Q5 M. B
( x9 K, |. j1 d5 z. g程序代码:
+ s6 ]+ C. {. X# ~- e
0 s7 o2 I) F- d#include<strstream>
z/ {5 e% o- c, k. r( m# O#include<iostream>8 |# |) A5 K3 I; L+ }
#include<string>
3 n# \ h! S' g, c5 eusing namespace std;
^/ B Z0 [, F3 X. R$ R2 iint main(void)' I( a2 v* S, w
{
4 h0 j- b" K! `5 Y8 ? string s1;
6 P+ \, z" Z" o2 N6 Y/ M. n while(cin>>s1). E- W5 G( `# \5 c- i* S
{- x" y4 q0 x& j3 S! N7 `6 o1 y
istrstream isin(s1.data());( h& c* Y8 m( a2 @' K( N& a9 x
double d;
|# a. b Q- i3 `, l if(fy_Exp::GetExpValue(isin, d))+ g. g6 N* ~2 w) y9 u
{. i. U4 r$ x0 N0 [0 d
cout<<d<<endl;
( @) v: }2 l; ~+ R }
) `* ?9 H4 H/ A* b- [, H else, X5 u0 i4 v: F1 E: a9 {
{( b/ @! w9 p+ a5 b' _
cout<<"ERROR"<<endl;
1 R [, r0 h" V3 B! D! j- b }4 p0 r% v4 f) l* A
}' R3 i( `9 f0 i! y! h! D8 M
return 0;5 {: K# V9 F* z! G
}* b e# _' R6 G' Y2 q& R# _
! }( w' k- W& K4 d# h' b
4 {7 @$ B: u, b' L然后编译执行就可以了(*^_^*)
7 F0 i; L3 }, w- S; A9 w其它:TC++上一定编译错误,不保证在VC6上也能通过编译, \6 P! n4 @1 l r
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|