获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
# a' D& \+ h$ w' r# }4 d7 J一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, O) M  Y7 G( L; N; J1 L: H2 d  {3 n只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)$ y5 L: ~) I( S4 R
参数解释:( E! l6 y9 L9 U. J* Y+ U6 p
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- ?0 S  J( ?+ O( U6 HnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
; x% C! V! G( Z- Q6 u- ?返回值:
5 [% U; k/ Z8 I; S返回非0表示计算成功,0表示计算失败有错误% n: T, Q' \0 V* R6 E. @+ F
- [" \4 C, |/ x4 q  l. g/ h

/ M8 T8 s* U$ E; C- `6 N
; i; X9 O7 u( v" }& |- I) \程序代码: 7 E/ I1 w) O& H: f

/ @. ?$ `4 e( v5 h+ s2 i# @* mnamespace fy_Exp{
- f1 b" p+ i! P! j2 d% Tnamespace {template <class _T>. s- D3 R9 y* s
inline _T GetExpValue(_T t[], char& csym){: K# r) \6 t- Z; @
    char c=csym; csym=0;
% Z# o2 @8 S1 o    switch(c){# c5 G# Y  ]$ c1 r
    case '+':return t[0] += t[1];
4 R; c5 r% F% L2 N    case '-':return t[0] -= t[1];! ?( M  @5 |1 M8 V! l7 g, `
    case '*':return t[0] *= t[1];
4 s& I4 g5 ]$ K    default: return t[0] /= t[1];//case '/':
" o, n8 b& P( |8 x    }3 [0 G; O- J# J  N
}}
. b( t+ b4 T# k# M; {5 ]template <class _T, class _Tstream>& ^) a5 Y7 @# V3 i- k8 _
/* _Tstream: inputstream, _T: get return value
) x9 Q9 ?# v. `( G5 s* Return nonzero if get value successfully */
6 F$ l3 p2 ^8 Y$ c4 y0 g7 ?6 bint GetExpValue(_Tstream& istrin, _T& nReturn){, U! [8 e9 [0 W: |: g. \; a
    _T t[3] = {0}; //雨中飞燕之作2 {) N5 m. |: s
    char csym[3] = "++";; ^+ [+ j; N. w- H$ _* ~5 c
    int nLevel = 1, nERR = 0;+ P& ]: b, |) x' G4 b5 U' u+ p
    if(!(istrin>>t[1]))istrin.clear();6 M  h! @. Y+ k9 ?
    for(;;){& B' C5 D, Z  w" ?) O
        if(istrin>>csym[2]){
3 _' p: B2 v# c& v/ s* P  l0 b& A- E            switch(csym[2]){* V3 C5 N  V0 M8 v" l
            case '(':
8 a, q6 H. s5 |* s                if(!csym[1]){nLevel=0x100; nERR=1;}else) X3 r. Q9 `5 X6 p, b) K5 I
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;* U2 [, {2 ]; o! a% s
                else{nLevel=0x100; nERR=1;}
9 d3 i% h( l3 r& |. V                break;4 m" U' S2 d0 [' c6 K6 |. ~: F
            case ')':' e! Y7 f& x7 e6 K9 F5 x- u
                {nLevel = 0x100;}break;' D6 ~" `1 G; I) ~  V/ y
            case '+':case '-':case '*':case '/':
. h9 w  K! U+ P+ b/ C                {csym[nLevel++] = csym[2];}break;1 @) a1 I# W4 @4 l2 O1 e7 W) f
            case ' ':case '\r':case '\n':case '\t':continue;
& }5 g1 S  N% |  _, I  W& t8 a            default:
3 S# h- S& i+ f5 ?: c                {nLevel=0x100; nERR=1;}! d$ U  [9 {6 g& P% C2 j  M
            }, G# S& R( t9 d- G
            if(nLevel==0x100)break;
/ Q0 i& O/ r4 r. F5 O            if(nLevel&0x10 || istrin>>t[2]){: Y; C8 g0 o" A* r
                nLevel &= 0xF;
% ^: ?& b+ a# f4 R# _* o8 A                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}6 z2 u$ v# r5 G0 X- \
                if(csym[1]=='*'||csym[1]=='/'){' }3 w! t3 G9 J8 \/ j% v
                    GetExpValue(t+1, csym[1]);0 V0 }1 M) y! d7 s0 q
                }
6 W) G3 [2 A' L$ q- R, x9 l. C                else{( S6 J' O: a5 O* T/ Q* w1 F2 k
                    GetExpValue(t, csym[0]);
2 x$ i: O. `# I" W( R+ o                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;- e3 B6 p, i+ L  P# z3 N
                }8 }; E5 O! c# M% l: ~, B1 G" f
                nLevel = 1;6 M9 A& l; s; q+ f; s  A& V
            }4 A% M; U) W: M
            else istrin.clear();
2 C2 H7 k9 k5 j1 V5 |        }
- \# \; _! X& J6 Y* y. P        else{nERR = -1; break;}
9 [; G  D5 \0 n    }& f" ]9 n' R1 P: ~/ x' f- F# W9 M
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) N* G' k* a; a3 d: G* ^9 F+ B# n
    else nReturn=GetExpValue(t, csym[0]);
8 G; ?0 @  \/ I+ M$ `    return nERR==-1?1:0;
& w  {# I3 T: `2 H}}
. h" O6 }7 x' P
" [. j  I  z, ?' N$ w
* r1 f: G5 m) Z1 K5 }; z2 e; B- C% e$ |1 r9 P0 i, S1 \# w$ R
函数模板使用示例:
6 `6 m" R2 {) G9 t- p1 x在以上那段代码的后面加上以下代码:8 V2 d9 Z7 S, ~2 v! ~

6 P$ ^2 y( m. ^9 Y
- o, P! e/ U7 W7 E4 ]+ Q
" Z, H8 r& P3 ?9 Y2 r1 j程序代码:
) N# Y+ S; c! m* d0 l# E/ s8 `$ q1 g
#include<strstream>9 e  t3 C0 v1 A% M
#include<iostream>% E. f$ p3 M, t( p% }- L
#include<string>
  R. ~( E$ @  x, u9 Q- M& xusing namespace std;3 n+ v) w( A- M* F
int main(void)2 Z# o9 C3 }5 u- v$ r; c* J+ D/ v/ \
{
$ T8 J: e5 w) i! h5 ]& A4 v    string s1;
, i+ H' j2 H3 h* ]9 Q; L    while(cin>>s1)
# I( S4 k4 K- C, e    {3 T4 D5 g. [+ Y$ W" [+ l. Z
        istrstream isin(s1.data());% U1 b8 X6 T1 S* R( }3 t
        double d;7 W/ y9 W$ g3 I8 ]5 n' E1 ]3 ~4 ~
        if(fy_Exp::GetExpValue(isin, d))
( T7 ]! }! I6 h. B& w% M& p( s        {
1 E, P4 n  }4 P& k6 N" z            cout<<d<<endl;2 P! _! Z3 n1 [: l0 V
        }5 T3 ?% B8 C+ z% s
        else5 m7 L; r# j: ^* Z% l
        {0 J1 c& ^0 H7 u. C, ~, J
            cout<<"ERROR"<<endl;. w: n. {8 b$ }6 D
        }
9 ~( S. m) c+ p# d3 r3 [0 H    }
9 Z6 Z7 S2 x6 R. h' f    return 0;9 T7 @( z# K4 X# M& E) _
}
' q$ a4 [* n) x5 t( ]" ?! D7 o
, D- \6 z. b" ~) y/ {9 W: M' h. S0 y) v( w
然后编译执行就可以了(*^_^*)# B9 T+ d/ M0 X* w" B& T' h
其它:TC++上一定编译错误,不保证在VC6上也能通过编译" e5 O. |# Y: h5 Z9 G
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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