返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
3 S: J2 v9 Z6 }. S5 L0 R" O一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ s6 H- A* o9 B. \只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" @7 |& j9 w/ ~8 D3 b6 I, O参数解释:
" [+ E9 L3 b# i/ }: ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* o  M9 Z! `1 \/ h1 g  M0 t* |% Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; H7 Z# B" H4 ]) Y) }, a
返回值:
' S1 D% _! M  E7 |2 Y7 S% ]  A- W返回非0表示计算成功,0表示计算失败有错误
( _* i6 k7 z+ ^- ~$ [2 H! V$ C5 x6 m

2 U* F& p" B) ~& _. I
! F! _# a8 A! V$ V# Q4 i程序代码: # ^. X' M% }8 V6 u- K2 F2 _$ S

: C7 V  b$ t! M0 k4 @$ e1 [namespace fy_Exp{+ U1 p  u) ]( n
namespace {template <class _T>$ t9 x" q8 u9 d3 `  x
inline _T GetExpValue(_T t[], char& csym){% E7 O1 H3 t& T# b, B/ l
    char c=csym; csym=0;9 E9 v; d) ^# a. t& A4 d+ a1 _- D
    switch(c){+ A3 A* s* @# s. |3 x0 ]" Q; v4 W$ p
    case '+':return t[0] += t[1];! k$ B3 m9 a0 x' K9 Q$ f
    case '-':return t[0] -= t[1];
, W1 i6 I' L, S    case '*':return t[0] *= t[1];+ m. s/ Z$ C2 F0 x: l
    default: return t[0] /= t[1];//case '/':
  B( N7 D* B% y" a. Q& F    }" B0 S- j3 _3 `7 I7 z2 ~+ w
}}
5 V) o) J- a9 l8 J- N5 I# a7 S5 S: ?template <class _T, class _Tstream>" A3 [& y- ?3 G! `# z1 A; ^
/* _Tstream: inputstream, _T: get return value7 I& L4 u3 ^" h# @
* Return nonzero if get value successfully */. Z4 V2 L4 Z9 C+ S# L
int GetExpValue(_Tstream& istrin, _T& nReturn){# Y6 @' L. f: ^. B1 v& n: ^: O# J
    _T t[3] = {0}; //雨中飞燕之作% ^, [" I" y0 [- E* N
    char csym[3] = "++";
! t+ k6 B$ x# _7 u* L    int nLevel = 1, nERR = 0;7 J2 Y$ }" C8 w2 |# ~8 ?, H6 M( U
    if(!(istrin>>t[1]))istrin.clear();
8 H4 ^+ J" ]& I( w) X( d    for(;;){) a) m6 u" q: K; N' c2 A8 z  Q
        if(istrin>>csym[2]){
; P  H; W1 Z7 O# x# ?* S            switch(csym[2]){
& z$ ?* Y3 o! Q( {9 Z2 ]3 ~0 m1 t            case '(':
7 ~) R- o) H6 Y5 V& l                if(!csym[1]){nLevel=0x100; nERR=1;}else
. N7 [* w( R3 n2 R8 I7 a% d9 O                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: O1 r2 A. a) ~7 J, N. k
                else{nLevel=0x100; nERR=1;}
8 s# ^: L" _2 E, C  {2 f" u                break;+ g2 p3 T, I7 c' J. g- F
            case ')':0 U. ~9 u. @# {
                {nLevel = 0x100;}break;# u1 b$ @' v- o+ ~! H8 R" V- X
            case '+':case '-':case '*':case '/':+ ~% ~! `# B2 e) k
                {csym[nLevel++] = csym[2];}break;) T* ]6 v/ V9 ^% l: p
            case ' ':case '\r':case '\n':case '\t':continue;
2 \! e1 Q% T( |5 J1 C            default:$ f9 N. `' E5 P% N5 J4 t
                {nLevel=0x100; nERR=1;}
3 T0 C6 k5 F: M5 f, a" _% l            }
: B! ~  y" o0 {6 v6 b- y" I            if(nLevel==0x100)break;% t2 ^2 R3 g! V" m2 f
            if(nLevel&0x10 || istrin>>t[2]){
" y0 R& Z  ]& h! C2 v                nLevel &= 0xF;
3 i) c) A- J3 E. P: d1 T                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}% ?0 W  ]0 `& \4 f. c! G; Z
                if(csym[1]=='*'||csym[1]=='/'){" C! R1 k5 C9 C* X4 I, U
                    GetExpValue(t+1, csym[1]);
1 G7 Y5 @; V& d& L2 E                }
2 R2 }, c0 v$ s  ^                else{9 M2 C2 A) e8 y# n
                    GetExpValue(t, csym[0]);' q) G8 |' y1 J4 e- y
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;) f) \: `* B6 h7 v6 u3 W
                }. O& _! K# j: b) s. {4 m
                nLevel = 1;
$ L$ K. N" R; R3 a            }
! [0 J: H4 i% p& J            else istrin.clear();2 K3 b. y; w7 e  G/ Z: K/ [" S. w  @% R
        }5 d/ Z4 v' |; T1 f
        else{nERR = -1; break;}) p* r6 {8 F* L9 h
    }
  T4 t4 S$ I, ?! m7 T) {9 z% h    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& b+ ]( v7 Q! l2 J! j8 F    else nReturn=GetExpValue(t, csym[0]);$ Z1 \4 R& g4 c) P
    return nERR==-1?1:0;
2 E# S0 t, v; n( D4 |0 ^}}
8 G1 g8 P, z& L/ K4 l0 Q+ z6 d! t- F
( q, P! Y; r+ v7 R) n6 C
) v6 q3 b0 q$ ]; O/ o1 U% b
函数模板使用示例:
' A. v# X* I+ K" ~( M$ F) T  s在以上那段代码的后面加上以下代码:' [( E& J# B, r* T* }  C2 y' c

6 T4 Z% t6 h# @% ^3 Z! P; ]
. ?& `: K" y( f6 c# T* g0 n+ b$ w1 b# ?* q: w9 [
程序代码: ( ?. P) {( Q5 u( w* y, U. s: t

! M- l5 ^& |8 O; k" Y. o#include<strstream>
; W* R( H0 g8 h: x: F, N#include<iostream>
6 A/ U% e! O  S% a#include<string>
, U' i9 ?4 E# t- h" l: b$ l" ]) A1 Eusing namespace std;4 [% N6 l5 o, {' m" A% u
int main(void)$ X, F! {- W4 o9 f* ]
{3 ^0 d: C; }1 I4 f  B7 r3 C
    string s1;& D6 P/ p! g! b, u( g$ \
    while(cin>>s1). k8 X" M) q* S
    {* n" h( Z5 d; y  k) f
        istrstream isin(s1.data());
: Y: W) T, H9 x9 @7 Q0 W        double d;1 }& E6 F3 T  D9 ?7 i0 W( p2 g
        if(fy_Exp::GetExpValue(isin, d))
  j, y9 m( N+ v9 N0 g8 r6 y6 z        {
( h1 u: j8 @/ N: y5 t            cout<<d<<endl;1 k. V2 q3 d- G* `" J% k
        }3 p$ C3 d: J$ `4 b3 S2 ?
        else
- C, P2 L% g# k* k( ]        {0 v3 t# }6 @, p0 [# D) z
            cout<<"ERROR"<<endl;
- ?) f' }/ [4 B" U        }
/ N! h' V6 B& j& k/ }% w2 n    }
) s! J% k$ d# I. v    return 0;' J) A+ @$ ?6 G" Y
}
! W) N. Q. y0 Y# R; Z- T$ {$ P, r
! u' y% Q# V7 E: M! ]# r
然后编译执行就可以了(*^_^*)) w, K( w1 Q: n4 p+ ?, N" ]6 v; U! \
其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ v' H( K- e* V; d
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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