返回列表 发帖

一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,
2 N% X5 t( m' U2 ~+ I! P* i一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# D* D) }- l1 h) [! a2 O只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)# k1 i0 @0 N. c9 u* A
参数解释:' D- K" i4 D. A1 ]
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流  [  D. z9 L: V5 i- r# E
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
! [' D5 v9 `" O2 c% j9 t返回值:
8 k* r  J" y  o8 v返回非0表示计算成功,0表示计算失败有错误
2 a# h9 i, J5 a, c9 r8 x* {. Q/ P2 X4 _& F% R3 \3 V
0 ]" C0 h( i6 ~  t( B4 }8 {) z" h
9 Z9 a$ Q# A. o+ ?) H$ d
程序代码:
( |4 D- o, L0 a. l, Z% k3 d
9 N9 ], ?. J' E7 `3 G; X2 vnamespace fy_Exp{
  s& {! W7 J9 h: |8 x8 pnamespace {template <class _T># q% U0 {# D2 H) ^
inline _T GetExpValue(_T t[], char& csym){' `# n' I5 F! R) d8 k
    char c=csym; csym=0;
& R8 a  ?6 a, a, ~( F5 i, R& K( g    switch(c){
0 j9 b" u4 @( Q9 J& F1 d% h! `2 L    case '+':return t[0] += t[1];. ?' X% k2 q" q
    case '-':return t[0] -= t[1];: Q: \' t! j$ a7 Q7 \' Q
    case '*':return t[0] *= t[1];8 H; p: ~* D& q* K4 {, P
    default: return t[0] /= t[1];//case '/':
" M: m7 K) }* w, }3 B1 T    }/ X( L3 w9 h7 w" Z! N
}}
4 A7 N$ X- @! Y& J/ dtemplate <class _T, class _Tstream>) a6 K% J, C9 u5 R# E/ ?
/* _Tstream: inputstream, _T: get return value1 O% C/ Y2 C( B6 l- V% A3 t
* Return nonzero if get value successfully */
: \. B( M) S" {int GetExpValue(_Tstream& istrin, _T& nReturn){: ^3 p6 k# o8 ]# @/ a# p
    _T t[3] = {0}; //雨中飞燕之作
0 Q6 t: z  f; r. L2 p    char csym[3] = "++";( _% S' K4 }9 e1 y
    int nLevel = 1, nERR = 0;
6 p. e2 E; {6 ?. @    if(!(istrin>>t[1]))istrin.clear();
, n" {$ v9 }7 N/ \    for(;;){; R: B6 n+ }( B; ]& j/ @3 Q
        if(istrin>>csym[2]){
1 s& U/ {7 T/ @' h; j8 }8 f            switch(csym[2]){  ]) L# s4 I: Z+ M
            case '(':9 E2 Z6 O/ T( [: E  h/ j& C9 ~
                if(!csym[1]){nLevel=0x100; nERR=1;}else. f( @, V3 {+ q1 o! U
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: J$ m/ I' @& P* x0 U* J+ F
                else{nLevel=0x100; nERR=1;}2 N, [' M' E( L5 K
                break;
" [9 N3 D% i4 V+ c. o9 @            case ')':
9 Q/ z2 }; ?* N8 H0 }                {nLevel = 0x100;}break;
4 t, b6 U" Z: D) L            case '+':case '-':case '*':case '/':
! o3 |6 x( y7 J+ i  h) |5 _                {csym[nLevel++] = csym[2];}break;  z: w+ ]0 s( K, A1 c& p( C- }
            case ' ':case '\r':case '\n':case '\t':continue;
7 p* j# z" ?  |: g$ E            default:
2 B( V- d3 [) D2 C7 U# ?  P0 f                {nLevel=0x100; nERR=1;}
. Z  S7 b# k/ v% ~" V            }4 \- r# |) |& F) I$ D
            if(nLevel==0x100)break;
! @' Y% }" Y% Q! o; A) b  g            if(nLevel&0x10 || istrin>>t[2]){) w. C% G: l) P1 ]
                nLevel &= 0xF;6 a6 b$ c; E& e% Q
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
/ b* }) I% I5 J! W                if(csym[1]=='*'||csym[1]=='/'){
; l: [9 [# N2 B* q( n: |+ w                    GetExpValue(t+1, csym[1]);" a& [9 X& x& s/ t
                }
( W7 m9 B7 E  p5 T1 e                else{
" Y- H, M+ p+ R                    GetExpValue(t, csym[0]);
) Z; H0 |) T  p1 q                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;; f# f+ X7 E6 J$ O+ G* o
                }
, h; o9 [/ M1 m! O" ]/ U                nLevel = 1;
  L1 r7 m8 _- Y1 P$ R            }, u8 q! c7 _0 j  J+ F
            else istrin.clear();2 l  a3 z% \2 ^6 @
        }
" D9 i( ^, A/ \" h' e        else{nERR = -1; break;}4 i1 Q9 X3 L. `, a' C3 d5 |. _
    }
" b2 n: V# [1 A# Q0 t! v    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
  t5 S9 m  f2 j1 f7 z" m    else nReturn=GetExpValue(t, csym[0]);5 C: y7 b4 \1 t! {; Q2 m7 b& u; ?& c
    return nERR==-1?1:0;
. P' m; M$ l' z6 U+ h}}/ s2 t, l& e4 l! D2 o

- A* Q: l+ e% m7 V  Z
5 ^4 J) s' a9 L* A
3 g/ W; \+ k! j  R: c" B函数模板使用示例:
; a, U7 T8 s' P# i: r% o0 ]1 z: C在以上那段代码的后面加上以下代码:
& x* @0 H8 C+ j; N: W  V  \  F6 S: w& `& j4 P
7 |- f4 _0 D3 `# F, {, Y8 t4 I
. h( U$ b6 T1 u; i" K2 V
程序代码:
/ \' |# f% k- A" G) V+ K1 I9 B3 i! {( P1 o) G; r1 V
#include<strstream>
3 ^# d( y3 w* k1 v6 \+ i#include<iostream>0 w& e& g9 ^. F. j
#include<string>1 U0 s7 t+ X+ z% R
using namespace std;
- ?* g  Q. j/ g1 x$ q3 Kint main(void)$ `5 Z7 j" m0 J+ B- E
{+ ]. \0 }$ S) n; [0 `7 u  Y
    string s1;
* X# n) t' @1 N; I7 K/ m  _: l    while(cin>>s1)  T" l9 R. I7 P+ d. M# _
    {
. P. c, x7 ]: @( m! g+ ]( b4 Y        istrstream isin(s1.data());
2 t; S0 m; G. A. J. l4 J        double d;
8 q- i7 f1 g, P' }3 ~        if(fy_Exp::GetExpValue(isin, d))% d0 Z. H* b- @( [+ d" q' f1 }
        {6 t$ q3 L5 _$ K
            cout<<d<<endl;: B; t# x1 g: K& _  m7 [5 H
        }
& v* q$ c3 d4 E  c/ q% W/ j        else) n9 E0 F, o8 \- Z; I7 b% i* b
        {
# m8 o. S6 u. f: c* v3 O  I# D            cout<<"ERROR"<<endl;6 S9 F: h, R) @$ E& v
        }
4 d  d/ q  N1 V2 o! U& R    }8 N  c! S' Y# T- `
    return 0;, |9 D/ W2 L) G3 o& r% u
}
0 G) v& J, N. U- @5 d7 S& e- a' \
% z: c& H3 ]* K) q3 s
然后编译执行就可以了(*^_^*)
' `0 W* T4 k6 w0 _/ e; t5 Y其它:TC++上一定编译错误,不保证在VC6上也能通过编译/ q0 q- t4 L! X/ b, J/ m- O! N5 ]
      建议使用VC7或VC更高版本,或者使用GNU C++编译

返回列表
【捌玖网络】已经运行: