返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,7 l% v4 j% X9 T2 C! h
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式, C7 Z5 v3 L' I0 ]4 m& e+ w1 Y
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% B9 D0 o+ S8 O* `# A6 H  q  Y! g
参数解释:
0 H  `6 U% ^7 W" \8 l) ?istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
' j/ a6 G" }  S8 D( dnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定! D, G: s, K3 N; F1 d/ G
返回值:
# D2 E, _3 \: s" F" E$ {- A! U返回非0表示计算成功,0表示计算失败有错误
/ Y% w$ a9 d+ k; `9 g
* @: d/ V8 B+ C9 f # @( W! H) W8 {$ U5 b" F
  u) V8 C4 ]. Z
程序代码:
& z" l$ x3 q5 ^- o1 O
, v( q! u) p# L" t  ^) N' K/ Fnamespace fy_Exp{
+ P; O5 l! ?5 S* T8 B# Y2 [1 \namespace {template <class _T>& f7 E" @3 A* ^9 g- a' \$ H
inline _T GetExpValue(_T t[], char& csym){
- Y6 j; n% B! b    char c=csym; csym=0;
6 D" }+ f8 I- q/ S; ]6 a    switch(c){
: @7 R$ z+ X4 w, {+ J# M  x  }    case '+':return t[0] += t[1];
6 v4 t% f8 [$ ]* q  a    case '-':return t[0] -= t[1];
, R  @! ~, e. {: o. i8 t: H    case '*':return t[0] *= t[1];. |6 L/ T& r) G: O$ H' B
    default: return t[0] /= t[1];//case '/':
2 K+ M9 h$ V$ N  x; ?4 r    }
7 M9 B3 I& y6 g$ _}}
; d, W; G- d" {' d7 F& |template <class _T, class _Tstream>
/ E1 j3 v( ?; ?+ n  y, {/* _Tstream: inputstream, _T: get return value5 H, x, G3 Z9 B
* Return nonzero if get value successfully */5 L" |3 B: u2 l8 o) m$ v
int GetExpValue(_Tstream& istrin, _T& nReturn){1 }" B; R4 V% T! o% X
    _T t[3] = {0}; //雨中飞燕之作, u, k' h# D# D/ L* d: B: v# c
    char csym[3] = "++";; F5 c) |( v! Q' ?6 C
    int nLevel = 1, nERR = 0;! M- w, g% N9 Z! U' v. E. x/ B
    if(!(istrin>>t[1]))istrin.clear();: Y. W) b8 g9 p4 e
    for(;;){7 P+ e+ j- B0 |7 m5 X& k  l
        if(istrin>>csym[2]){  h  [  r# w" t: n  e( T
            switch(csym[2]){$ J* M4 V- C6 O4 F5 d
            case '(':
8 I8 F! y9 L0 [: N                if(!csym[1]){nLevel=0x100; nERR=1;}else2 O7 h4 Q4 H* E
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;. X. S: W; H6 @
                else{nLevel=0x100; nERR=1;}
$ e4 s" Q8 Q* l  q# {) T                break;
" b% f" d/ l3 _/ D' s( b            case ')':
1 k5 `! G. I* c- q                {nLevel = 0x100;}break;
+ A0 S8 P& F# N# Y! S9 x            case '+':case '-':case '*':case '/':1 d. _& K; N+ x. H
                {csym[nLevel++] = csym[2];}break;
" n- R  T' D, G; E            case ' ':case '\r':case '\n':case '\t':continue;
. J6 S: K, u6 F! C1 R1 K            default:0 c6 c* X0 |' Q9 v+ _2 s- _; r* X0 ^
                {nLevel=0x100; nERR=1;}9 U* w1 X5 a- `- q! X
            }0 x8 G* ?6 d6 R! m* Z& w
            if(nLevel==0x100)break;
+ d4 v# }, L$ x' ^1 i$ M& S            if(nLevel&0x10 || istrin>>t[2]){8 c. q" X  }$ |) G
                nLevel &= 0xF;% _) i7 a! U# ?3 o+ |5 g
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}# Q, @* w- j# B1 K  v3 g
                if(csym[1]=='*'||csym[1]=='/'){
& [7 D; D) s- Y2 z0 X3 A                    GetExpValue(t+1, csym[1]);
- i. r1 I# z7 I1 N2 n' h                }
3 A3 p, \0 P8 X+ N/ x                else{
: r, _8 Z3 W: t- V                    GetExpValue(t, csym[0]);) ~. D: Y& r3 G' Y
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! q+ m9 _8 g( `9 ^0 ~3 X1 `, L                }
, w% a+ z* F1 b$ q4 Z/ ?& w                nLevel = 1;
* \  J( F' e/ e            }/ J5 ^3 F; V( i+ q" G  \
            else istrin.clear();
0 {+ I/ y  Q# I4 s" W; f        }. v4 u3 i. o/ O
        else{nERR = -1; break;}. A" J  n& C2 `
    }
4 j# W0 G7 e* S% _    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 t3 {% E: `. k, z" u    else nReturn=GetExpValue(t, csym[0]);
& {4 z0 }3 t' r+ h3 C. i" N    return nERR==-1?1:0;
% s, `  v. H" v. R, E2 x8 a}}
0 I' |' Z/ f; T- t& M; C8 f$ p0 v3 e# K7 K7 r
- a& c" a" {+ g) m" `3 m$ _
  V7 e" x- S9 S0 l. o/ E
函数模板使用示例:+ @. F3 i; J6 h. K9 A9 L
在以上那段代码的后面加上以下代码:  X9 F' e( y/ t+ M& d  l, Q
; k% C2 _1 N$ ~
) Z! E% l$ g3 q5 x9 Q/ {* O4 y

5 |. H- I4 J; H3 j程序代码:
- b1 }. c) D" x8 D
& k7 c  x1 |% @7 x#include<strstream>
  o( p; H( |+ z( [2 r: M. m#include<iostream>7 `2 S5 d7 M0 i5 p
#include<string>
. s. L' {. K- q! zusing namespace std;9 l* u: g& W6 @! ]- X
int main(void)
. ]/ ?4 V/ O6 a! l3 g5 B6 X+ d* s{0 W2 ^, C+ M; l. C5 x5 s- V5 f8 g
    string s1;
. j% v: z2 i- r, _* g, u+ j, X    while(cin>>s1)
/ [, o: V" C  \: L6 R" Q2 [    {' l% g1 e4 r$ n* K8 n
        istrstream isin(s1.data());7 j5 @5 e; ~# v4 _
        double d;
# }/ c1 q; v$ H0 r! T        if(fy_Exp::GetExpValue(isin, d))# }) m* B1 Z! G" K; g6 W7 x7 e5 S; F
        {
. u% j* b) t5 N6 @' P& Z* ^            cout<<d<<endl;
# F/ n- b0 h$ a; W- m        }1 b9 y& \9 z) I4 ?( T# I
        else$ u! z4 f3 q$ {( C2 L" r0 L
        {
/ o& E3 L* I% S& Z" x4 w            cout<<"ERROR"<<endl;
, l+ ]" _) n1 u6 q: M: ]        }
" i, v) T) }( v) j    }' \( b/ i/ T& J1 u& R( s
    return 0;0 m9 h( k* r! D3 T8 L/ F
}* q1 P2 Q, M( R/ O$ P7 M9 P
" k) N' q: \5 Z

( H) P' Y1 H3 M+ f然后编译执行就可以了(*^_^*), o( n+ }. j# S! y9 ^* j# l  b8 R1 c
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 I* L. f, }7 L( W6 _) i      建议使用VC7或VC更高版本,或者使用GNU C++编译

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