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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
9 R5 P9 w0 C9 R, L" N. s一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
0 P G0 J. \5 w# \2 u! ?0 ]只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) ]9 k& v( ~& w% k, C( Z2 c参数解释:
) Q* V% o; A$ p aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' n) y0 E8 o) X" B4 J. q: Q8 ?$ z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
& ?% e9 B. c" F返回值:" P# r# b- Y+ r7 N1 R2 P
返回非0表示计算成功,0表示计算失败有错误& a$ B# s# N3 `
0 V4 A$ r, Z, M; V. s* Z
& J2 X v$ c0 f- G7 x" p
# H( C) L& a9 t/ T, _% ]程序代码:
+ O; G# ~- C( Y& V& V' s$ Z7 ~5 X
/ N2 I* x5 i* s, R$ a" L Unamespace fy_Exp{* u0 d! \0 _$ a/ U2 L1 @
namespace {template <class _T>: s6 ~6 X. m# W& K; q# S% P
inline _T GetExpValue(_T t[], char& csym){2 D% Y+ @7 w8 w1 v D" R+ K' V0 b1 m
char c=csym; csym=0;, A* H% N& Q3 l; E, K# J e
switch(c){; G# t) u' z% y! Y7 r7 ^* }
case '+':return t[0] += t[1];
, U& A2 J, T+ g3 m case '-':return t[0] -= t[1];; w* y; m& T2 b' i' Q1 t
case '*':return t[0] *= t[1];6 _- Y. Z: r: t
default: return t[0] /= t[1];//case '/':2 U% v4 }7 r) P! n8 |7 R) O
}
/ h* i' F3 I6 f- {1 Y( R+ V}}0 b2 x8 V6 r F$ X; B
template <class _T, class _Tstream>- v0 s) E% ^! N- ~/ v m2 m, f
/* _Tstream: inputstream, _T: get return value
3 J! T0 M& H5 @; U( A* Q* Return nonzero if get value successfully */
1 B1 d7 ?+ _( E& ?5 oint GetExpValue(_Tstream& istrin, _T& nReturn){
" }- t( Q# t/ X& S _T t[3] = {0}; //雨中飞燕之作, x% P1 j2 j Y h$ ?+ M, }
char csym[3] = "++";
5 [5 G: N+ k H0 @5 z+ q- ?; M int nLevel = 1, nERR = 0;
$ v! g' U# e! L! W7 C/ Q if(!(istrin>>t[1]))istrin.clear();
' e5 x1 j2 K5 p- N4 n for(;;){4 L( F$ Z7 M2 _# S( [
if(istrin>>csym[2]){
`9 z. X; Q' f9 n switch(csym[2]){
5 R& j( I, l$ d8 l, t case '(':
( c. l, z3 _/ g- ?/ f! C4 }* K if(!csym[1]){nLevel=0x100; nERR=1;}else
" x$ F+ I N- u if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, Z/ P! z) W; A7 ?2 s else{nLevel=0x100; nERR=1;}1 Y s& w. ]2 r& O- w# C; I! k
break;
3 F$ w" e6 t1 c5 S& c case ')':
- ]- G- E9 Z- u5 } {nLevel = 0x100;}break;
/ l0 i: s2 b0 N case '+':case '-':case '*':case '/':
9 [' Y, w/ z1 A9 r* s {csym[nLevel++] = csym[2];}break;" Y5 N% m: l1 v9 q1 H. D5 C
case ' ':case '\r':case '\n':case '\t':continue;
; w! W' h, ~" D5 b default:
$ Z. m" J! s# C3 p2 e4 g' h) p3 k {nLevel=0x100; nERR=1;}
5 ~# o7 k7 K( o! Z h }! I: |$ `: n0 |
if(nLevel==0x100)break;
0 n9 o- i0 Z/ P& l! _ if(nLevel&0x10 || istrin>>t[2]){5 l* r* o9 s9 | `- e. c" e* o
nLevel &= 0xF;, W( c7 [; F! Z3 R' n3 Z
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
) B/ t* J. c5 J) I% y* u if(csym[1]=='*'||csym[1]=='/'){
# }5 ], ?* v& o) O GetExpValue(t+1, csym[1]);
8 }3 Q+ e$ m3 S2 V, G8 z }
* r% C: }1 z0 s$ D else{
3 s! l" V' i- z GetExpValue(t, csym[0]);
# L8 m5 l% f" R# W: { t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# a, g+ x4 d+ z Z, I8 e }
0 L% f: ^% z9 f4 W1 k nLevel = 1;
( e; B9 p4 [$ }# G/ ^5 x$ N3 e& \$ { }4 T) c3 C5 f; p6 h: V" ~
else istrin.clear();
& x, i. l5 J5 O( a }: T: v7 w- J" w
else{nERR = -1; break;}
% f! V& Y4 _4 O8 l5 G. R8 h' _ }
8 N5 I8 |2 n, u' i7 M if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 s/ _4 R8 L+ R5 ` w
else nReturn=GetExpValue(t, csym[0]);
; z9 E$ c, Z1 }6 g' K, v/ F( U2 O return nERR==-1?1:0;" H# m" q% d3 j# _, {
}}
; ~* y$ e9 W' \1 \; j7 w6 {1 H0 f9 S
3 [. g9 i$ F0 S0 M4 b) _& D& c( L4 S. K! @1 g$ B
函数模板使用示例:
& s c5 ]3 N. C在以上那段代码的后面加上以下代码:- i; Z/ v! Z* p3 _) _
8 Q) V! ?' {/ x: Q4 A" Q
: [% f. a- M5 m
2 X: o1 D3 f* Z, D7 Z7 u
程序代码: ' z- q2 |8 d+ [ _/ U7 d8 s
" F5 K$ ?- T R" ?* u1 n7 e+ p#include<strstream>
8 `8 R) _+ L& o. K# X#include<iostream>
, E/ f0 ]$ z9 b" R) g#include<string>8 C" k& N$ U0 _1 E3 M
using namespace std;" [9 @3 _/ i/ m( Y& D/ k
int main(void)# I3 ?2 f/ n. L& {
{( E( v6 }& v* B ?+ \1 a2 W
string s1;7 ^/ W( A- g1 l# C- D+ |
while(cin>>s1)
/ ~9 t3 i7 l8 M3 b) z9 o/ Q {# f, \2 L3 C4 j8 ^, B3 Y0 ]
istrstream isin(s1.data());
5 Z4 r8 z% H4 W- o" j8 j; N4 K double d;
! j$ R7 ?2 c/ k5 p if(fy_Exp::GetExpValue(isin, d))6 s6 q' O5 [4 E% e
{
; _% ^+ a" o1 \2 ^( n# ~8 V cout<<d<<endl;
+ ], V" _, O( d$ x9 _ }0 X* s# t: ~) |! b% V+ G
else
. l6 O. T) P V. |( K {
% N- A1 r4 P1 D& g3 G! z cout<<"ERROR"<<endl;/ G5 l) O, d( ?2 ~3 {
}
" k# _5 S# B. @/ }4 R1 Z }
% c6 `- k/ y% i( A& w @ return 0;
4 K/ S& x9 ^ ~6 W" ?}* W& d: E i8 L8 x. v
8 ^0 h- T! k9 ]2 l- M" y$ h5 O/ N
: t+ n w- U0 ^0 b; l+ S1 W0 x然后编译执行就可以了(*^_^*)# X% C+ P- e! `
其它:TC++上一定编译错误,不保证在VC6上也能通过编译/ ^, z1 [6 K3 M8 k
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|