返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
8 C6 \, G  h) R" n0 @; d2 N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& C( K: P' t) A# j$ N0 C: a只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' G3 }5 l& ~. @% ~: }$ l
参数解释:5 ^$ t* W* M4 K- s
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流. r" S$ k: [  v3 z9 E" z) e  G
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 j+ i3 K  _3 u* y: k. Z
返回值:4 i$ z9 F$ x1 A9 f3 h3 A/ v( s
返回非0表示计算成功,0表示计算失败有错误
) Q: G+ I" q/ o$ b/ q; Y$ `- X+ m
8 d0 ^3 c4 W- t; p0 ?
% M' D0 S7 A# K1 }, C. y% b  V
程序代码: 8 v2 s9 j7 H. g% _' i$ o5 a

- Z* @& Q5 X! D; X# M, ~namespace fy_Exp{
7 N2 P: I: R8 I5 ~- lnamespace {template <class _T>
6 ^6 C8 o; {1 p) x. @inline _T GetExpValue(_T t[], char& csym){
! J" S  Z" T6 G9 N" `' q# L' ~0 Q    char c=csym; csym=0;: U5 t/ |: X$ W3 G$ W
    switch(c){/ \7 s4 x$ G( a0 ^+ i/ c
    case '+':return t[0] += t[1];
, V% F% N4 O  S& o    case '-':return t[0] -= t[1];
; m$ J9 V, ^! O2 h    case '*':return t[0] *= t[1];
; U, r! G! \+ _* K: j    default: return t[0] /= t[1];//case '/':
& O3 T. _* B5 p% v    }% l- W/ ]' k* o1 z+ L; s1 H
}}* r/ f# X$ l/ J
template <class _T, class _Tstream>
9 F2 r  {1 |8 h! l! \( x/* _Tstream: inputstream, _T: get return value5 Y1 S4 i" ~  K% q& q8 O" H7 j7 z
* Return nonzero if get value successfully */
! d  k* R' r3 L: Lint GetExpValue(_Tstream& istrin, _T& nReturn){' d5 P( ]8 R1 l3 R
    _T t[3] = {0}; //雨中飞燕之作
+ R- z; @/ L- V- n  \; \/ H    char csym[3] = "++";8 E3 H  f0 O* d
    int nLevel = 1, nERR = 0;6 L, s; l1 Z+ H, R/ ~4 S- L
    if(!(istrin>>t[1]))istrin.clear();2 X* S$ u' C+ `' O1 Q
    for(;;){
1 ?+ i8 B9 R/ j( `7 \        if(istrin>>csym[2]){
, H$ c6 a: }5 r9 O! y% {            switch(csym[2]){
2 N$ x. {/ u. K4 u1 {            case '(':
1 f/ c5 H( F) U+ R# c  S                if(!csym[1]){nLevel=0x100; nERR=1;}else6 S7 b( v& `4 F- P9 I) z4 w% x& |, {
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' ^/ ~9 j, `# X! g+ u& M* F4 \                else{nLevel=0x100; nERR=1;}
# m9 s1 [- \: h$ x/ i                break;8 L/ C* `) x: G' c+ F+ _4 B6 c, u
            case ')':
7 ?4 |% G9 }& Z0 J! K                {nLevel = 0x100;}break;9 s7 _( J$ p; c3 R
            case '+':case '-':case '*':case '/':
! L% A& c# P+ }) f6 o1 |                {csym[nLevel++] = csym[2];}break;5 P. l$ y- ?* j$ b9 E
            case ' ':case '\r':case '\n':case '\t':continue;
# ~7 U' m" Z' a" Y4 G            default:
# b9 \( V9 o! N& N- A; L* u                {nLevel=0x100; nERR=1;}! s5 y; o4 ~% u* T( G% _& a
            }5 `9 `" k8 L' j' \
            if(nLevel==0x100)break;6 C' O7 c& b0 W& a, u' N
            if(nLevel&0x10 || istrin>>t[2]){9 X: a" r, }: D* w) A
                nLevel &= 0xF;
' w3 @; z+ q6 j1 T                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}" x% ]; j$ n% n. L8 @
                if(csym[1]=='*'||csym[1]=='/'){
! l  v; O( I: y7 g. c                    GetExpValue(t+1, csym[1]);
6 i0 R7 O0 R; [  e                }
9 }* `6 ?/ O2 ~$ p+ W  H9 n" Z                else{
7 g9 n! l2 z* }  k6 h0 |                    GetExpValue(t, csym[0]);
4 ?0 ~, V4 a4 ]. u. _. q+ b- m                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 a6 v+ K* X% B6 A5 h
                }& b: C( V5 x# E8 I. B" f
                nLevel = 1;. \! B3 q; J0 G2 Y6 O7 l  O
            }
) Y$ q/ y6 y7 n1 D9 `            else istrin.clear();: i! T) w# f) p( c! V2 V2 b
        }+ P" Z8 o' n( \+ T! U. D
        else{nERR = -1; break;}/ D' o! C9 z) [% Z
    }
3 j% j9 R9 e: G- r: e' I% r    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 l7 ~$ X) C% y$ a6 v    else nReturn=GetExpValue(t, csym[0]);5 y4 p7 T! J8 ?3 p% Q- W
    return nERR==-1?1:0;* n# p' B/ E. Y6 \  d) J
}}
6 q. z: M6 \: q4 I5 w2 J. r6 T9 |2 ^. i2 U

8 Q  I- Q$ G+ u% z  r( }
% q% m4 _- b+ j5 t  [函数模板使用示例:1 m1 z4 ?9 k- d" A( w8 j4 G
在以上那段代码的后面加上以下代码:
5 b: `9 J+ z, S$ a* g$ e7 p0 H: p
/ I' g" ?) R7 Z8 d( i
+ @& C, n! Y# |1 [
8 V" f( d" t1 O程序代码:
( L) p0 _8 ^: r7 h
6 w" z' _2 A; M3 B#include<strstream>
2 w: S, h5 V+ U) t* O#include<iostream>4 n3 m* i9 ^. A( [/ P. g2 Y
#include<string>
) y- K$ t( C3 L- ~, zusing namespace std;6 s1 L+ z! a! `# w, ?$ e$ x
int main(void)
5 @9 m2 L" e, n, ~6 h: R7 a{+ w0 t4 ^" G1 X; y: G9 r  z2 Q
    string s1;
1 l1 U+ s" N% m% k" Q; K7 z    while(cin>>s1)
' q9 O& H$ D4 t% a1 j8 g1 g, _+ p    {' X) W! t0 y1 F
        istrstream isin(s1.data());
& p2 O5 n% f( d        double d;
$ F* ], F; I' X/ D' {        if(fy_Exp::GetExpValue(isin, d))
+ n; L; b$ c: d- U" M        {( v0 Y  q. f' v9 j
            cout<<d<<endl;% ~6 [, m* w$ g" N5 U0 J( ~
        }, Z: {3 G% g* \/ i% Z! [' w- {/ h) o
        else' m1 ?: A/ X/ y' y. c. o( V
        {( Z, ^$ p$ |6 j, f" I4 P- N
            cout<<"ERROR"<<endl;  }$ {: G% [% ?% K; j
        }
5 f0 r0 x/ u7 N4 Z: _- w" v    }
6 `0 R% Q! k4 i. a0 k    return 0;0 T) u3 U, y6 B
}
, R, _1 P* g2 b, x* c1 i6 |7 j$ [1 |6 d, R% l( p

" }- b; Q' P" N6 u0 y- Z然后编译执行就可以了(*^_^*)
8 ?9 m  [% h& W+ h$ T) W其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 A7 ~  Y" R6 u. h3 c, f
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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