获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
; I1 H) L- U8 [一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& a+ x3 Z' @+ \只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)$ U: H( p  A7 M
参数解释:  O# q/ S5 V+ u* A& G6 ^% s0 M" P
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' `) J' G1 C" V9 c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 \/ T0 E6 w3 O/ M8 w( I4 V
返回值:1 r& e9 H" N8 X/ c
返回非0表示计算成功,0表示计算失败有错误/ y, {; q! ~) n1 Y! ]
2 g  f+ z1 e% G4 w6 Z
  ]6 \. N* x: ]* S/ Q

! C$ a2 F! r9 [- `" Z程序代码:
+ M# P& ]$ ^9 e- o" c. j4 V& h0 A
! l' N% B% q+ F* _$ onamespace fy_Exp{
) |/ {2 H3 B, B: [namespace {template <class _T>
- u$ P7 }7 s- m' U; F5 N7 Z+ pinline _T GetExpValue(_T t[], char& csym){
/ d$ N; a) t& B    char c=csym; csym=0;* W. M. M, S( |; q4 W
    switch(c){' w. w  i- v. }8 s2 U1 D# A
    case '+':return t[0] += t[1];* _/ B9 t, L) p; ^3 t: A" a. ^
    case '-':return t[0] -= t[1];
8 j& R# Z( |4 k! K8 K& N    case '*':return t[0] *= t[1];8 ]/ O& u. Q$ o# S; g, C* d
    default: return t[0] /= t[1];//case '/':
3 l9 m& g6 h* \6 ~1 x    }; w. ]9 x  E1 J0 e/ d
}}
+ V; w. C4 F& l+ i6 C' wtemplate <class _T, class _Tstream>
+ L' o: X( r& w* j7 B/* _Tstream: inputstream, _T: get return value% `" `: D. O7 ~! j1 w* Z# I: f
* Return nonzero if get value successfully */
3 M8 f/ t9 S1 ]. \& mint GetExpValue(_Tstream& istrin, _T& nReturn){
+ b( m) P8 m6 e, H. l6 s7 V0 C8 @8 `    _T t[3] = {0}; //雨中飞燕之作" t0 j. l+ J8 ]5 R% v; V+ F5 J
    char csym[3] = "++";
! n6 F  V5 i4 K4 T! \5 q/ v    int nLevel = 1, nERR = 0;
+ G! L8 ~: N, B9 r    if(!(istrin>>t[1]))istrin.clear();( ?! ~; G  e5 y4 B) h
    for(;;){
. m9 v+ W7 A2 M2 A( \% u        if(istrin>>csym[2]){. V. J) n4 m4 }
            switch(csym[2]){' L4 R" b* V% w, H) D6 g+ @
            case '(':
8 \& k( Z3 x- h" S9 t4 C                if(!csym[1]){nLevel=0x100; nERR=1;}else2 U8 d0 W" o2 v6 o' x' p
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% S0 f! V8 [* @/ d7 a
                else{nLevel=0x100; nERR=1;}+ Q. Q) f* J% p
                break;
! Z- Y4 R1 z9 e5 I# n; }2 O) {0 F            case ')':' O0 v3 J3 G- m3 n
                {nLevel = 0x100;}break;
  U' v; f( b0 ?/ @$ t! J# L  Q            case '+':case '-':case '*':case '/':. m# G/ x+ }" f: h
                {csym[nLevel++] = csym[2];}break;4 f7 n0 m/ V, f! X2 m6 O& S
            case ' ':case '\r':case '\n':case '\t':continue;
1 G! k0 n7 N( J$ N6 o5 i            default:# A: E; j$ e. ]
                {nLevel=0x100; nERR=1;}
* }- X8 Q. U7 N) a* a            }' c4 ?. X0 R( T8 e- X7 V
            if(nLevel==0x100)break;9 X. p, n- \% o" c4 x. Z
            if(nLevel&0x10 || istrin>>t[2]){' c0 B: A0 _; n* }
                nLevel &= 0xF;9 w1 `# c8 Q- E3 C/ y* g
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ e+ q! [& Q, Z% P6 {
                if(csym[1]=='*'||csym[1]=='/'){6 e) w1 L# ~* x2 @2 s
                    GetExpValue(t+1, csym[1]);. w6 Q4 h! F  w1 Y8 V6 d
                }
# q: p* D4 s7 H& J                else{
! T% `/ s. q- ^$ h# s                    GetExpValue(t, csym[0]);- r' o: H  R; |+ ^" m1 l; h
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
4 X% `, C: q" }  q; f! j% `% F                }
& J" J6 ~. v2 d$ i1 Y' T$ n, R                nLevel = 1;
3 t" p' _% M3 H            }) t) S1 ~2 x% T8 b+ ~  B) k( Y
            else istrin.clear();- R( @; Q- F. l
        }8 Z. v$ ?1 V1 i9 N
        else{nERR = -1; break;}
" N& i9 |/ v! `" k# e8 {& Z    }! c  s# g6 K% m- j/ a0 |. n. b: R
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);  y, T1 Q( |3 P. B
    else nReturn=GetExpValue(t, csym[0]);
( I. Y% i, S! J6 O- n! Y    return nERR==-1?1:0;
( N$ i' V7 G; {; I# ]6 t}}) o# R% ?* i, _2 B
# u) M6 N3 [0 @# D

0 d$ Q8 r4 _! s$ ~
0 V' Q8 s5 O9 v3 }- m) V# O函数模板使用示例:
5 o% T4 O/ y% y$ X! M在以上那段代码的后面加上以下代码:* n% w" n" T  t7 V  g6 U
6 U8 f) i: G* B) _5 {1 ^- g, ~

1 \( E) m. k8 v+ k) l( g
% v3 u& c: t* Y% w# a程序代码: 8 e7 u; n% }/ @) p& Q
! J" L1 Z$ s. I5 k' i( `
#include<strstream>. l. o- v$ D. U, V; Q- a
#include<iostream>$ t% b& _1 o5 d4 X) k# i
#include<string>% [" a% x3 _( n3 f3 m3 g
using namespace std;
' e- v' M; O+ ?) Zint main(void)
( S) i2 X  A# S* m% R{5 \9 Q( I8 q2 t+ _7 p! \
    string s1;6 [" u+ x- U: u" C0 a
    while(cin>>s1)
: v- M* y# u6 D% t" [# C3 b7 T    {) B( G3 n. m+ `$ Z7 f8 ^/ r8 B
        istrstream isin(s1.data());/ d; J! W* m5 \2 e& S  r
        double d;7 A+ f; B! J9 L' {0 E! P
        if(fy_Exp::GetExpValue(isin, d))
1 T" V9 W" n' e+ N; H        {; [5 z1 _3 V! D- d% D8 e
            cout<<d<<endl;' O1 ~! Y2 `/ e4 [1 m0 y
        }' d3 }- o# [3 t! Q$ _
        else
4 k, d. x" l  P# W  S        {4 V% F! k4 Y! s9 L' k
            cout<<"ERROR"<<endl;
3 @( P4 F5 W1 g8 _        }
8 }' V# j0 K7 H- O    }
4 F7 b4 {6 ]( h' L" s/ L    return 0;
& e1 i( R' J/ x, h" p, _; v}) L8 ~- J6 y; N! ]6 [* n3 M
6 N4 R- T9 q$ L! V" U  O$ k: O

+ [2 C( v/ s9 }4 [然后编译执行就可以了(*^_^*)
" H& _+ [) g" k) s. z/ w6 x其它:TC++上一定编译错误,不保证在VC6上也能通过编译2 f! H* M3 Y, _( Y! _
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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