返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
$ D) T# c9 S" T" Q$ J% a$ e一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
$ |5 }; R; U7 Q7 k2 K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
0 D# Y/ l2 R+ w& H- b参数解释:
$ f( B/ B* \( @" Mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! ?6 r& l  [: O- A
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
; T& z. H% d/ D4 i! u& @, ^返回值:
5 ^$ c( k! W! ~: I8 e: K# E8 i% S返回非0表示计算成功,0表示计算失败有错误1 c8 |: M( j- s6 b& f+ y

, D% Z6 u" Y7 ]& y& I8 [ , I- `# J; x4 F' c: d3 C" T
" }' o; z0 Z$ n' |
程序代码: - M% ^& v* _5 E2 R6 P+ E2 T

$ Y! `  A9 v# |+ B% P7 B% m/ tnamespace fy_Exp{
: }! c% q$ N3 R& snamespace {template <class _T>" {- r, H# ]3 |6 S$ T% ~
inline _T GetExpValue(_T t[], char& csym){
) k) N* a3 ^" X4 ~    char c=csym; csym=0;
. Z# e. {+ Z+ g3 F( {3 v    switch(c){
9 |, o$ C9 Y6 g  N* _6 `: {2 [  ]    case '+':return t[0] += t[1];. c& d+ {& U; E2 B5 V) n  k
    case '-':return t[0] -= t[1];; A! X/ s' C3 ]
    case '*':return t[0] *= t[1];/ b+ }- Y' o0 }5 l) k2 q3 @# |4 S
    default: return t[0] /= t[1];//case '/':
% T, y* i" ], v( M    }. j0 d0 A3 [, n8 ]
}}2 D/ i: g$ C* Y, s2 w( Z& }
template <class _T, class _Tstream>
: A$ \) p% [. m) T$ y# r/* _Tstream: inputstream, _T: get return value; i5 Q" v( V* {1 k  A3 ^* _. h# K- x
* Return nonzero if get value successfully */6 E# ~( l* y* |# k4 Y. E/ [& u# n4 X
int GetExpValue(_Tstream& istrin, _T& nReturn){* L1 c$ B7 Y* u" e5 I. P$ W8 v
    _T t[3] = {0}; //雨中飞燕之作
" _6 x9 a8 C: P+ H    char csym[3] = "++";
9 A' S$ Y1 s" c% P2 u. Q    int nLevel = 1, nERR = 0;
& Y6 A# F( b" j    if(!(istrin>>t[1]))istrin.clear();
5 \1 _6 L( l0 Y# T/ h    for(;;){
" l; k7 r( V# ]5 P# b( H- D7 ^7 {        if(istrin>>csym[2]){3 v  K  ?' I& c, ]
            switch(csym[2]){
, ^9 N/ `) [$ K# }            case '(':5 Z5 E# n& p5 W
                if(!csym[1]){nLevel=0x100; nERR=1;}else
, X- ]! ]+ }- e( u                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 \5 J# P& m$ @0 K4 I8 ~) c# G
                else{nLevel=0x100; nERR=1;}; }! A+ w6 Q- _/ `
                break;4 Y$ x. M$ _# I& I. X% P6 A
            case ')':7 G4 O. @" S, C. S  s2 r3 ~( ~4 `( L
                {nLevel = 0x100;}break;
6 w& O8 H7 h) o+ u! ?) ?& G            case '+':case '-':case '*':case '/':* b# _9 ~) o8 ]) i! D
                {csym[nLevel++] = csym[2];}break;
8 |7 W0 `: C6 g, C8 U            case ' ':case '\r':case '\n':case '\t':continue;
! {! X5 [  ~" L' z1 m            default:
* m: \( ?/ C& J# A1 l9 P                {nLevel=0x100; nERR=1;}' D8 W. G, S* h' r! n. @! [0 J
            }( k' j# b# w- d8 C1 v  w
            if(nLevel==0x100)break;) h. m/ G) d  K! m) s  F( M
            if(nLevel&0x10 || istrin>>t[2]){% B0 {% @. o' a+ R; E- P4 [# U: Q
                nLevel &= 0xF;1 {6 o* I. P, y& U  F3 u
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, O) g9 i5 O  F+ `  S
                if(csym[1]=='*'||csym[1]=='/'){, \6 a  J3 y6 y8 [- j( k
                    GetExpValue(t+1, csym[1]);$ y5 y2 x! {9 _! {) S
                }# q( E5 \: U1 U% y0 p9 F
                else{
+ }+ {. W1 B3 q' ~3 u& k. V                    GetExpValue(t, csym[0]);2 e4 h& V& j3 }3 Y  z9 l% J+ T* a& ^
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
5 k2 o7 Q, j6 }: w, B" B* B                }
1 W, }; F! y. r* Y: Y2 N" z0 z                nLevel = 1;- y5 o  q, z, u( s8 x. Q
            }
, d9 @3 D3 |) g  S* y% _. R            else istrin.clear();* d& ~) C! N4 @# K0 A
        }
! F( Y$ ], s$ |0 x1 C        else{nERR = -1; break;}
* n6 |( a) m( s' p9 |; A9 H- |2 M    }- v9 j" x' H/ E
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 {$ W9 Q' x# ^; w: ~- u    else nReturn=GetExpValue(t, csym[0]);  N0 I8 [* A4 @" N- f
    return nERR==-1?1:0;
* h5 t( W- ^1 Z- t: j6 `7 P' ~}}
" f9 b$ T5 `( H5 w/ x
; S$ i1 i) n) A* K
2 x1 n/ i- J- C# N, I) i- ~
, w$ F+ d: |8 H3 w, d7 M函数模板使用示例:
0 w6 h1 n( y9 E2 p在以上那段代码的后面加上以下代码:1 x# p- R7 K+ p. u* J8 Y! z
) S5 d- T5 L8 x: Q* }
8 b0 N1 `: E; v* k

4 z+ F4 j$ ^/ s, b$ S程序代码: : F: J" D& r3 S
' j- v( R: o; ?) P  c- T+ i- {1 G
#include<strstream>
+ Q& q6 _& j/ D2 o) ]6 o+ E1 r#include<iostream>
' {  n. Y! J" }& ]2 F#include<string>9 w, O/ L$ O7 Q3 I7 O% g! J
using namespace std;" s) {3 m* ]+ ]) L' z
int main(void)
! [; B( x3 I+ q" z7 y! k{
% \5 |& H2 C: H. v4 K    string s1;
( k8 v8 y% l$ u2 l    while(cin>>s1)# f$ r% G! \1 S. a- q
    {
) i1 W6 p0 ^2 L; Z        istrstream isin(s1.data());
) I2 t5 c$ X) _6 o        double d;# H/ a+ y9 k9 X2 i- ~# o
        if(fy_Exp::GetExpValue(isin, d))
+ @  N) X' ^! z. _/ G        {
* n/ x4 M1 u! h0 Y% s  u7 {! |8 ~9 |            cout<<d<<endl;
* l4 [- B6 ~% G0 v+ m/ @5 ]        }
! f9 {1 b/ ?, Q9 b        else
3 r1 [; k# f+ |2 x* s2 O) i* ^        {  |, P1 K' ?9 j& _
            cout<<"ERROR"<<endl;/ d* k" P. l, j; \& T
        }
8 |2 M# X2 k$ ^4 w8 W7 _2 n/ L    }
: z. L3 P1 Y) o% D' U* ?: H9 q    return 0;
2 o- B' t, y, o}
, U! B5 ?# n8 f: a; a$ z
/ n8 U8 `' f6 R% h, @. p- o& i- }
# P  s( m7 T" i: b2 Y然后编译执行就可以了(*^_^*)
# K, E: x$ }3 C/ p4 g' l2 B) x- }. ]+ O+ k其它:TC++上一定编译错误,不保证在VC6上也能通过编译
8 z2 ^. R( Z( k      建议使用VC7或VC更高版本,或者使用GNU C++编译

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