返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
9 i' W  y( M* ]$ W! q' M$ l' \2 \一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ a/ F! D1 C5 e8 z% m6 M# W& }只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 _. P6 |* E3 }# |: |
参数解释:
- t/ d6 E% j# distrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流; s% E9 G- E# K$ L
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" A. a% L- G) `: e, f. }* I返回值:
3 Q" n7 \% |& _返回非0表示计算成功,0表示计算失败有错误
  o+ g" b7 R6 Z/ n2 |, A  Y4 L- w
# ?# o* _! \: a% t% O- H+ W 5 d' O9 y9 k8 F$ E3 n) m

5 s# G( w3 ~' Y程序代码:
- a/ _: t1 X( s$ E6 b9 g0 `2 [2 D
namespace fy_Exp{6 o$ \- K8 Y1 a" r
namespace {template <class _T>" H( B% B0 Z7 z; E' h; I
inline _T GetExpValue(_T t[], char& csym){
  `2 y! W" M& G/ i. c    char c=csym; csym=0;
0 d! w6 h: [- R6 a    switch(c){
3 L! N  ?5 t4 W' Z' ?    case '+':return t[0] += t[1];
# ~# ^7 a0 i6 r    case '-':return t[0] -= t[1];, b/ E2 @1 w  V/ s
    case '*':return t[0] *= t[1];
3 |# ?& a$ p# [9 Y9 z8 Z    default: return t[0] /= t[1];//case '/':
! K8 X& n: Q* {. {: N( q# e9 a    }
9 W0 h* a3 A- ~}}+ p" p. e. g0 l, s2 ~
template <class _T, class _Tstream>; F' j2 e: t! j+ z
/* _Tstream: inputstream, _T: get return value
( x! f0 o4 p0 Y0 X5 [! Q3 r* Return nonzero if get value successfully */
0 e8 O2 F& B. H2 ~5 Q+ o& Mint GetExpValue(_Tstream& istrin, _T& nReturn){
7 k& x0 n- n% B5 A0 ^! U: p  B    _T t[3] = {0}; //雨中飞燕之作
9 L3 m4 I; [% @, R; N    char csym[3] = "++";
) u  N0 ?9 [$ Y8 X4 A0 `    int nLevel = 1, nERR = 0;
  ^% V- Z9 l! J' L4 `1 _    if(!(istrin>>t[1]))istrin.clear();5 f) V% @! ~+ S
    for(;;){) ?# L6 G1 F. u* G  Q
        if(istrin>>csym[2]){* i9 i7 {: P" |# ^
            switch(csym[2]){
1 E8 ^1 F* t9 c            case '(':) m% y& S' C2 w$ [% B& v0 d
                if(!csym[1]){nLevel=0x100; nERR=1;}else* ?$ A" `; H& J# \* D! @, r
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 d# f' m# q" H& L  l7 Y1 I# B
                else{nLevel=0x100; nERR=1;}
' B$ [; Y1 m9 C% L                break;* t' ]( ?; i6 m5 k: Q. A
            case ')':. V- a+ h- Q5 y3 f! d* }$ H
                {nLevel = 0x100;}break;# P5 h2 B  \1 s9 x# L! n) B0 L7 p
            case '+':case '-':case '*':case '/':
% D- N- }; v$ x                {csym[nLevel++] = csym[2];}break;
9 j. w7 A3 ~- `. y/ x            case ' ':case '\r':case '\n':case '\t':continue;) Y/ V# q$ T3 B  v
            default:1 |$ {+ ~0 Z9 {* s
                {nLevel=0x100; nERR=1;}# \! o0 \! [: _7 A
            }
& q  Y, e8 W) K            if(nLevel==0x100)break;
, D, z( t  [6 b/ k3 i; a; z' L            if(nLevel&0x10 || istrin>>t[2]){+ j3 I! u" D/ Y% ^. y5 _: E
                nLevel &= 0xF;
- N: W! B  w' y3 Y1 W+ \! o                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}7 y. W  }  g$ e5 G$ Z
                if(csym[1]=='*'||csym[1]=='/'){! F8 C7 P# f% ~7 {
                    GetExpValue(t+1, csym[1]);% ]4 _3 x: M* q  H- D! b1 _
                }
. K- F( Z8 |! ~( O4 \: }. \9 I. Y" I                else{
5 k9 E) r# F% L                    GetExpValue(t, csym[0]);. _* {' Q$ x; A2 Q& \& g% i
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;" M9 B% T) h+ t4 p& v
                }1 D( F5 A3 Y, y* l" }6 }
                nLevel = 1;- I) O* B! G: _$ l. G6 N1 X
            }- a+ K5 X- E" Q
            else istrin.clear();, h3 d! i6 ~! `. u; u$ n
        }2 p; ]" @6 u3 c! J1 g  ~. a
        else{nERR = -1; break;}
$ [" k+ N  x5 K8 ?    }/ b' h) Y4 D  K1 C
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);' W; @; n/ q: c* H$ f. B& P! G
    else nReturn=GetExpValue(t, csym[0]);
+ U0 [  @& f' M$ H3 ~8 Z    return nERR==-1?1:0;
- a% V  P& o' }( L3 l, @- X}}
; _8 t; ^  ^: G/ f% f
( ?8 U& d" x  r" A) o1 s8 x2 k6 k& w* r/ g' |
4 i; N8 R% R2 |: {* t
函数模板使用示例:
; ?3 f1 V/ V# W& N! g7 }在以上那段代码的后面加上以下代码:
* {% x8 ?$ M  K( g2 ~* L9 `* C% B* A. ^2 p

0 ^2 v! `/ N( y2 {: _, d- |! c% p
程序代码:
* @, N' C, s- i4 D* D* C
& w3 a- P' B  X: I9 V0 `) w, K3 ^* m#include<strstream>
  |) \# b# i1 X+ c7 p1 K#include<iostream>6 \, b- w! t1 Y1 A* h
#include<string>
5 N5 Q2 N" U$ J$ P" cusing namespace std;" c5 P! D4 ]( Z
int main(void)9 t2 m& U7 u& p/ J
{
8 v. A5 _) z, N" U    string s1;
$ `) s3 U( ?5 N  h    while(cin>>s1)9 E! E$ }  t8 ]: i" o; }# X
    {5 o: N: ], T% T) K( p* F) r
        istrstream isin(s1.data());
) ^1 M' c" z* O1 H' O$ e; p, r        double d;8 |5 I- E# X1 f3 {/ S7 r' g
        if(fy_Exp::GetExpValue(isin, d))
( T; i: P! ]3 B. Q  X9 z        {, L6 F) p  q! [; x2 {6 n& y. k& w
            cout<<d<<endl;
; y; M0 w- k3 E! _5 e  b( t! f' M        }
7 x2 I) b. L! u0 A1 u  h) `        else( d. L& N8 E$ e2 v, w! Z: R
        {+ {3 i- X* V  r, p7 G' g/ F
            cout<<"ERROR"<<endl;7 q3 g) U# [3 J- d! `- z5 _6 b
        }
3 a# i2 t  }# l! i8 J- ?    }% L! r0 g, t; n# ~
    return 0;
2 o) }& \  R& p! @! {6 V}5 m4 {8 H( }8 [. N6 A: ?+ D

& X  z7 v; s( f6 M2 {+ q8 `: j- l# B( t9 I9 M6 O
然后编译执行就可以了(*^_^*)7 d. M# z; G; z9 O% K
其它:TC++上一定编译错误,不保证在VC6上也能通过编译. l3 t9 r5 y: T- F
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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