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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
+ n P/ k7 S' h' {" A! S" w# {一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. X8 r; C, h/ G; Z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" O4 ~, |8 a0 @: V2 C0 F参数解释:1 D7 s+ [: @3 c9 y* k5 Q6 b
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 ]; S! B, X" e2 B' {0 [& ?nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
/ m. x7 P& O, L; r返回值:* z- n8 f9 N P4 x
返回非0表示计算成功,0表示计算失败有错误4 U' Z5 s% ]! w) h
+ M& f, G! R+ I
: ]) O; g2 e' i1 z
+ i) A b" w4 b- }$ ?$ h
程序代码: , N5 ]2 ]8 n) E, J
" F# d; ~. E# E* G
namespace fy_Exp{2 }1 n% _8 {, z
namespace {template <class _T>$ s! ?/ F& ]# m) P: C# x
inline _T GetExpValue(_T t[], char& csym){/ @1 v5 f4 B* W1 ~; z( s' X
char c=csym; csym=0;, F% A0 `5 _. F& y8 z* c; s
switch(c){
8 H2 n& N7 J8 X. `9 Y+ Q( \ case '+':return t[0] += t[1];$ l# j3 _6 e& G' ]" R
case '-':return t[0] -= t[1];9 e4 u4 \' H+ C% P5 x8 a8 K' I
case '*':return t[0] *= t[1];9 B8 y" h3 a3 W: `6 c
default: return t[0] /= t[1];//case '/':
, P# ]5 F+ ] h9 S, f2 j3 J7 Y [ }
0 t( W. P5 B' o}}' k- O% W3 l+ u, v) O
template <class _T, class _Tstream>' ] V5 ]$ T- K/ [6 A
/* _Tstream: inputstream, _T: get return value5 |' W' M5 `# Y" R- x
* Return nonzero if get value successfully */
9 K! B: l: m0 B4 iint GetExpValue(_Tstream& istrin, _T& nReturn){# ?2 j6 ?! y0 E) U' J4 ~
_T t[3] = {0}; //雨中飞燕之作
+ ^. a- p$ d2 \7 a char csym[3] = "++";
9 F! z$ Q5 \1 V) u int nLevel = 1, nERR = 0;
1 j2 v! Q! s, g2 } if(!(istrin>>t[1]))istrin.clear();; r+ P K2 ^+ V, ?* C* h, \
for(;;){7 U1 `0 e; s# u' G
if(istrin>>csym[2]){
; b1 b/ @, n- i& o( Y. t switch(csym[2]){, Z1 f( i0 n# b
case '(':
. q# s) k. E: c if(!csym[1]){nLevel=0x100; nERR=1;}else
9 L( z- h( h$ G* h/ I2 W1 Z if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; U6 b' s: M" R6 e% e* V3 N
else{nLevel=0x100; nERR=1;}
3 [8 c5 R1 E9 F break;7 t! O- D# i& W; c+ P+ J6 _
case ')':
! Z9 }7 L% G3 C+ f; g' c, D4 P0 m8 P+ _ {nLevel = 0x100;}break;
, {8 y* W1 d2 i5 S6 x/ v( W) b* _" F: _! v case '+':case '-':case '*':case '/':
) g7 F' G" v, y. q# P {csym[nLevel++] = csym[2];}break;
( k0 g7 p3 p" n- B6 I8 D4 K$ k* R! V9 g case ' ':case '\r':case '\n':case '\t':continue;
0 D: {* O/ i7 \) D+ g! A default:
) u+ ~5 v, b1 d9 e% R9 s8 H {nLevel=0x100; nERR=1;}7 b) z4 x! U& F0 _7 c2 r/ a4 m, l
}
% n! s( o9 m$ h0 ]4 J& `8 Y if(nLevel==0x100)break;" x0 x/ W" k& G$ G9 s# @% p
if(nLevel&0x10 || istrin>>t[2]){
- u9 [( K0 c$ c) E nLevel &= 0xF;
G. l% ^9 I9 i' _ y if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}( W1 u1 L# s. X. z& c9 m
if(csym[1]=='*'||csym[1]=='/'){
' e' ^; f" _0 o$ M GetExpValue(t+1, csym[1]);
1 \! b! Q* p @ |5 v& l }
$ U7 \5 O/ I4 s6 Y B# @4 U else{) A b2 l3 ^- y
GetExpValue(t, csym[0]);
# S7 ?; T3 U# X( J( T t[1]=t[2];csym[0]=csym[1];csym[1]=0;. F3 ^- g/ Y: I) b. p& ^" {9 a) ?
}5 j B7 N9 y3 E: C4 b& c
nLevel = 1;
$ c8 o1 ~6 H, y; z }
* w6 u: O0 T* @( i/ U, s' @ else istrin.clear();
& F" ~ A. D5 Y1 ^! [4 g7 c: C$ ?0 ? } {/ C0 f! g; }+ N
else{nERR = -1; break;}- L2 @5 K, e6 j/ z1 t4 m
}
9 M# a! S2 A) J0 Y if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; G3 ]* c8 O. q7 [3 E2 r; c else nReturn=GetExpValue(t, csym[0]);/ P6 g9 ]- s: r. _& O2 M
return nERR==-1?1:0;0 |3 m0 D" D/ H6 b: `9 P W
}}# q5 u) b' w3 U% F9 c7 v
# B1 M1 J4 [' t0 F3 g
7 Y6 I( w; V9 r( ?( n* N" }4 j
; J2 j8 `9 ]! R4 D6 Q函数模板使用示例:
3 d, b$ C. d" `在以上那段代码的后面加上以下代码:
8 k K/ z) C- a! z, a
% p. q' Y2 o9 N% P7 I
; ^- L) U. I4 B' o# t9 Y' T5 d) X0 c! [2 H1 _$ u1 `
程序代码: ! `& [2 o W+ @5 ^4 }
1 U# p, w4 r& P; T! @
#include<strstream>3 Z# O4 t+ H3 n: J
#include<iostream>, u/ C( c9 D/ Z' W9 y- R2 R
#include<string>8 h# r) C4 \, p: ]- d, f
using namespace std;
: o* n2 _( T N1 fint main(void). X( j4 k% S* o/ R+ c4 ~& P! Z& ]
{
# ]( g8 \1 R1 \7 K" y& a# O6 Y string s1;
' c9 i0 d/ y( k while(cin>>s1)+ R, G1 P, D1 L& d2 v8 p
{
7 ]: E8 ]5 r1 j7 R6 w. N/ z0 V istrstream isin(s1.data());
1 w4 ?- Z" A3 N" X5 j, u# Z double d;
4 D. z1 ~; Z$ D7 I" D if(fy_Exp::GetExpValue(isin, d))6 I+ h& a- C9 Y4 W$ n
{
& c- X6 b& S% Y6 B5 @ cout<<d<<endl;
1 L6 Z# e/ S! E3 D }
) m, K7 l6 U7 Y: P else/ o! A+ w) [! a( s
{1 Q' f! C4 T) r, ~# p" T
cout<<"ERROR"<<endl;1 _$ x* o. Y! S9 V0 |/ K
}' F" [5 y! p" X4 j
}
7 v: J2 h J) Q, L# @ return 0;
; o8 U* ?. _4 c3 I0 Q8 b3 a}4 k# K/ a- b; z3 W4 f; o
( ~2 t( y+ s" k; m
. N8 ^% D& `" p6 l7 ~* M然后编译执行就可以了(*^_^*). I" w. @" u# `1 z* [
其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 a8 S7 q1 s* T3 v% C
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|