返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,% b' l/ `( s) w
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 M. m  D! R5 v# U; S, ]  {只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
8 G- @$ h. C5 Q' r; z: {* }& ?参数解释:
: U0 {- C6 K; h* @* G0 c; fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流5 p: s: A7 ?" n9 k& `; }
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 x/ Q5 U. H3 d. R
返回值:" q- f: W, T% y6 T# f8 D: F2 d  e
返回非0表示计算成功,0表示计算失败有错误) w8 V8 q+ r! k

0 s* |/ C/ s2 j8 O( L0 N) P
; \6 s( ?" W8 P$ `/ t8 {0 L
) K; l2 p# d; z  g程序代码: - v. Q2 i1 K" a+ X2 u
+ M7 w% F' K3 J4 X; v. d+ O7 x
namespace fy_Exp{1 a; o: |$ j7 d( ?
namespace {template <class _T>
5 o8 [. K0 P" ~" D6 [inline _T GetExpValue(_T t[], char& csym){9 d/ u2 K3 j2 t* ?
    char c=csym; csym=0;
. {: G2 F  [9 {5 r    switch(c){
8 b. Q6 u  ?9 B' u2 A1 Q! l    case '+':return t[0] += t[1];
  A. |0 S; D1 a$ r$ K9 b  i) A1 n* W    case '-':return t[0] -= t[1];$ s) m' i1 Q+ j( P  e. f% U; m
    case '*':return t[0] *= t[1];  N% D- Q* B% H0 y
    default: return t[0] /= t[1];//case '/':: {: U0 f1 w6 h
    }
" f0 T+ C: h% ?}}. |: M1 N2 d" p! ^, V/ B
template <class _T, class _Tstream>4 Q5 l# N, I- A" H) P4 v0 z
/* _Tstream: inputstream, _T: get return value
' \& M! n( l. v+ e* Return nonzero if get value successfully *// [+ E  x. J" F" ~8 W
int GetExpValue(_Tstream& istrin, _T& nReturn){
7 P  _' q! H. k+ I/ v3 W; _    _T t[3] = {0}; //雨中飞燕之作
( q. G' n6 `7 G3 f& W  i    char csym[3] = "++";( A# A4 U; ]. e' s1 i
    int nLevel = 1, nERR = 0;' s- k  q" Z6 d7 _+ N* Z4 |# Y
    if(!(istrin>>t[1]))istrin.clear();8 G* ?2 [8 a1 f6 G1 C3 V1 i1 \
    for(;;){
# `' E  F+ Q8 t# L        if(istrin>>csym[2]){
& }) P$ J  Q8 u( c            switch(csym[2]){( c2 |2 s; |, g5 U; y
            case '(':
' L8 L' t6 G+ U1 W6 Z% f* S                if(!csym[1]){nLevel=0x100; nERR=1;}else/ b& l, {4 p: H, ~! H3 @+ r
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;" M8 v0 K) e  q0 j. n: ^
                else{nLevel=0x100; nERR=1;}
/ U; u$ E! w/ M2 R. k# a                break;
! D, c% _( v+ }4 g            case ')':
  K6 E! f  z( o7 I" U$ [                {nLevel = 0x100;}break;
( k7 x+ w5 {$ _- ?) T) p' E3 w            case '+':case '-':case '*':case '/':
# ]: f4 c7 f. ]" ?                {csym[nLevel++] = csym[2];}break;
# ]3 }: @& ~6 _. C# E7 ?            case ' ':case '\r':case '\n':case '\t':continue;
8 `, Z/ W& V/ `* g  v            default:
1 Y: Z# k0 g: F6 g                {nLevel=0x100; nERR=1;}
5 x# j9 m7 Y3 B$ S7 l: u% n& q            }5 z5 U+ k6 o7 `+ v& O
            if(nLevel==0x100)break;
1 M. m* j+ o0 B+ b            if(nLevel&0x10 || istrin>>t[2]){
3 ]# i: X/ f+ I3 `0 ]                nLevel &= 0xF;9 `2 f; A; V' L2 `
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}" z( e+ A( F1 b1 D
                if(csym[1]=='*'||csym[1]=='/'){5 A) E* S* C! O$ [$ C2 A
                    GetExpValue(t+1, csym[1]);, u) T+ m' ^1 }7 y3 m. E4 W
                }
/ G  i9 ]! @/ f" ~2 I9 L* m9 F' G& Y/ Z                else{4 V6 d& [0 \. F% e4 u
                    GetExpValue(t, csym[0]);
1 A  l  s. p0 m3 [3 Y                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;: g* N/ N* D3 L9 o: K$ A
                }) N( l& s0 \; p% @# h0 ?' d
                nLevel = 1;) [0 L7 N: n  z5 X0 ^) I4 r
            }
) [) s% c) n3 J/ ^            else istrin.clear();
7 B, \7 i7 L) Q. E        }+ p9 P8 Y2 s5 H: q, F
        else{nERR = -1; break;}
" n8 S( c% ?9 T9 z' t9 N    }
! Y% _" a9 H( C    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 g) @6 K1 V7 y1 f    else nReturn=GetExpValue(t, csym[0]);
! S4 o' v: L' ]& k! F4 V    return nERR==-1?1:0;, n* c8 @# \  l- w) X9 n1 I
}}) g: L8 {* m8 X+ d( Z6 u, ^

# I) D. M" }3 n9 ~8 X# G4 j! i6 }; Y
9 f4 a; V6 Q, c
函数模板使用示例:! p( C6 L$ Z: w1 v) ~' x$ V
在以上那段代码的后面加上以下代码:- Z! s8 W6 t1 S0 n5 Q) U
& o( L4 X1 V, v( n

! r" z# l1 o, C: t9 z
8 g0 |, ~1 f2 w, P程序代码:
% F9 O, Q) ?- K- W
( ~' e4 H) f& `$ m) ]3 `#include<strstream>
* m" a; z# m' R0 Z" v, |3 W#include<iostream>
! B% c- T, h2 [8 d& W' T" }#include<string>3 d# R7 ]0 h/ P: n3 k5 }0 L
using namespace std;" ], G3 t4 |+ T+ E) |: K
int main(void)1 |2 L! U! R, ^
{; f3 f5 K2 @- Z3 z( R: |
    string s1;, v" n1 y1 j8 i7 U5 B! s: j
    while(cin>>s1)
7 b, t9 h- @$ N5 ]& l. G    {8 c  w1 |2 A+ h4 w4 w  x
        istrstream isin(s1.data());
! W' Y% ^) n& S0 Q        double d;
4 y: w. [# d% }0 t        if(fy_Exp::GetExpValue(isin, d))* d3 J" b5 D5 n5 v! I' a" W2 t
        {
, c0 u* L7 ^/ ~9 I( y* H! y            cout<<d<<endl;8 h( w8 b' |  v
        }
3 ]) s( L  W+ k1 o% f        else
& h+ P' ?& L2 X# I( B, k2 p8 q        {
0 H$ e$ l- Z: t- q6 ?) @# }            cout<<"ERROR"<<endl;) ^( ?' |, f# B
        }
4 P5 ?+ F+ W/ E( i1 u8 O5 Y2 W    }0 A% q( S0 I8 @2 \5 l5 ]4 Y1 H+ N
    return 0;5 r  J' D& T1 `/ r/ t9 X
}$ T) }0 A! z  G$ W

2 A0 m( A; Q+ g, P, ?" n
* H3 N7 _, C9 K& {1 V0 g然后编译执行就可以了(*^_^*)
  K& Q- `  h% Z. g% M/ P1 x% y) n其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 k6 Z0 W; v* ^* q
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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