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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
( t4 g2 o9 \6 k8 r' E( ]一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
2 l* `1 g% }8 Z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)6 d, X. l6 X1 ? ?2 {
参数解释:
; Z6 a8 N2 R: {/ \& mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ I p+ y4 s2 N* H2 O
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# C: K4 w U" w' f- ]返回值:
" `) v; w2 T. ~, y7 P返回非0表示计算成功,0表示计算失败有错误/ E9 `8 m" E" m; U3 |. L: `# t
8 }6 \! |" L7 d S/ w5 [, E m$ A
* n, a' u+ t4 z( A
4 A7 t2 s9 @, |5 F6 d3 g程序代码:
3 M- ^( ^; I. `# |3 U6 U r1 @; E' M' c
namespace fy_Exp{
2 m" S, C! y% J% Y( x1 jnamespace {template <class _T>0 [9 R$ q5 r# N3 N
inline _T GetExpValue(_T t[], char& csym){
" y1 W5 J) G; w u- t char c=csym; csym=0;
; b4 O- w7 f& @5 C8 y switch(c){
8 B7 I: d& G8 |/ [: H, }8 z y) R9 }! z case '+':return t[0] += t[1];& k0 z/ V; W( Q) Z, S4 ?
case '-':return t[0] -= t[1];
9 [( E- \6 V- F case '*':return t[0] *= t[1];
) S# i! x9 X* ]' ~ default: return t[0] /= t[1];//case '/':
+ h* I4 A: \: n& a3 o- w/ [ }: W; i( |( d; U8 ^' J/ ]+ T; V
}}
! T! C: n+ G0 d( r) otemplate <class _T, class _Tstream> y5 t$ e4 n' E2 N! ~# `
/* _Tstream: inputstream, _T: get return value7 F' |. D* e x9 }3 z& u3 _
* Return nonzero if get value successfully */- g- h5 n- I% l" l
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 E0 ]* t; B: s' l _T t[3] = {0}; //雨中飞燕之作
% z# Z5 U/ D3 _# ]6 y9 z. a$ b char csym[3] = "++";7 [. b( v# C+ a
int nLevel = 1, nERR = 0;' v Z' ? B, n2 w# k
if(!(istrin>>t[1]))istrin.clear();
# F* R1 V' z6 ~) |2 E9 ~- ] for(;;){
, m, z9 }" O/ B( k+ L! I4 N5 H if(istrin>>csym[2]){
# M" G- A0 X6 M9 @1 H! o switch(csym[2]){! B% I) [/ Z, y0 Z) M7 Y+ W6 ]
case '(':: O& X8 l% W$ v7 v" I: q
if(!csym[1]){nLevel=0x100; nERR=1;}else3 ?4 ^ q% m s( q, l
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 p2 B' y$ _6 L5 Q8 Y else{nLevel=0x100; nERR=1;}: G+ G% a( Y W. f4 B- }2 T# y- g
break;8 f/ F5 E5 X Y0 b( r. D" R
case ')':: b" H* H9 t7 P, H, f
{nLevel = 0x100;}break;4 H, Y+ Y# ?% G
case '+':case '-':case '*':case '/':
. F$ N! {# `, n F7 _" |7 M# _& I {csym[nLevel++] = csym[2];}break;5 q. X9 z4 h8 U0 L& s
case ' ':case '\r':case '\n':case '\t':continue;4 I, a4 S8 V: h. u
default:3 E Z r6 A# i7 d7 K* T- z
{nLevel=0x100; nERR=1;}
/ S- q. { B$ E6 r" A }
0 p1 }: R: o4 G6 ] if(nLevel==0x100)break;6 n8 a) g1 |. x* M
if(nLevel&0x10 || istrin>>t[2]){# r( s! F- ] E8 r; d+ r- ^
nLevel &= 0xF;
, f! I) r: z- F+ W7 j% H: ] if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 @5 R: W# G; y3 B8 } if(csym[1]=='*'||csym[1]=='/'){! C' z/ s% k1 z7 a# u1 U
GetExpValue(t+1, csym[1]);
( m3 O' Y7 ?/ y G: W; { }8 U9 O, [4 M7 z, e* d! Z3 h6 ~
else{
; t% J+ O# M& L, r- Q8 g/ s GetExpValue(t, csym[0]);
5 l1 Y' D( c0 L6 T( m t[1]=t[2];csym[0]=csym[1];csym[1]=0;, Q* d3 E2 v* r4 _
}7 `: o' n: ]" }
nLevel = 1;6 l0 W4 d) X, f1 S3 J6 ]
}
/ p" w/ u* ? s$ e else istrin.clear();
, b( V7 }2 [8 K7 `1 `% }$ w. u }+ h3 A3 _; |9 ^) I
else{nERR = -1; break;}' P/ T+ @; s' l/ o
}
0 V* l; {" N# _ if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 ]# G4 D/ ~( i/ u- p- N- J else nReturn=GetExpValue(t, csym[0]);
) y! N) N3 B" N- H, P, F4 g return nERR==-1?1:0;
7 [! t" }3 h# e9 m2 L" L/ R2 X7 O}}
+ C0 ?* q8 l) t: _3 |& R" h! F. Z& z1 s- N* r) ~& N$ i) ?
4 ]9 f K; P' B' z+ o9 k
# W1 l+ t5 I# p+ p3 J5 ?- L函数模板使用示例:( B/ F6 U3 Z8 K0 F
在以上那段代码的后面加上以下代码:2 n+ k9 [/ x% b- \5 N8 E
2 l. h. J. F8 r
% S# x. v4 t6 d- B- D% r& E
& N* Q' A2 n- U1 U# Y4 T* k( V. u( S8 {程序代码: 5 p1 ?. X4 f1 B
! ?$ q. I! e1 Q6 N5 q( n#include<strstream>
! S5 W' b8 o; e* P3 Z6 v5 D0 s L#include<iostream>
6 x. h: g. s7 c5 Y( T0 v#include<string>" u! t2 f* q$ }$ P) ?# e$ S9 S- k! s
using namespace std;4 E% b& y/ q) [6 j# a J
int main(void)
) G2 f- W* P9 m+ b{8 ~" z" Y' i; ~' z, s3 t
string s1;& R" ?# k5 N% d8 Z' d
while(cin>>s1)
" c. L2 R) g2 d$ {; B {
7 m. w& Z5 c# ]) o istrstream isin(s1.data());; g1 }1 M9 y/ x. E% N
double d;
' H8 a, G1 N& |4 k4 u8 a if(fy_Exp::GetExpValue(isin, d))
/ Y5 s/ Z( [% M3 e' S" Q6 O {
8 W8 [! n) \% _: o5 p* b( f cout<<d<<endl;
& R$ a6 L: a/ g, \ }
) w1 y$ q* i! s; p6 L+ ]2 ^* B else
% s/ K% R4 P1 F" @ {
q B9 g M, v cout<<"ERROR"<<endl;
% q( @8 i2 l. d) m& f: W }! c: t( w0 m. S2 z+ z2 T1 G; W0 N
}
, H- V% n' t/ q( ]2 ? return 0;6 u1 k2 V) M6 G L2 {5 x- u( i
}
& _" {! B, P, r$ t! ]' B3 L# S7 {' [
5 Y) w9 ?9 V4 F% \- D( o& g- w/ j9 B% ~# f( H8 A8 e; @
然后编译执行就可以了(*^_^*)
, O1 e- L. k4 t5 F6 _+ z6 x其它:TC++上一定编译错误,不保证在VC6上也能通过编译: m3 \% |9 V( }, a2 d# V$ J0 t9 s
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|