返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,6 e% A6 c. C% s2 D$ O2 n( ^; D
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' Y% k% n0 u* B8 E, g' w3 j* e2 \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 W. [$ @1 ~. k6 C参数解释:# k, R5 T' [1 X  u1 g5 m, {' p0 f
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- r: f- _- K: Q% xnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: C( Q% S, s. x+ }3 M7 c返回值:" E; p- p1 M9 `7 _$ W. l4 p" o
返回非0表示计算成功,0表示计算失败有错误
4 D) |; v2 K8 v9 \% x+ A. O
! \# U2 e; {; O $ B, A' e# y$ H1 i! i) r2 T
, r! U/ }( [1 G$ K, Q, a8 ?0 r
程序代码:
. t- G/ r' i; k: Z# d- o" L& I' h
namespace fy_Exp{, I: }0 q5 s% t- h! [  F
namespace {template <class _T>6 o; h/ R$ D$ \: t9 b  y+ C
inline _T GetExpValue(_T t[], char& csym){) U( D7 a. w1 f3 b+ y
    char c=csym; csym=0;
# B" n2 n* S" p8 L4 w; D. U* ?    switch(c){7 B8 n, y  j/ L
    case '+':return t[0] += t[1];* F3 s/ G: a0 u, W
    case '-':return t[0] -= t[1];
; j" f8 Q- s, d( [, ?    case '*':return t[0] *= t[1];' E" x+ w. A. o: U# L! T! J
    default: return t[0] /= t[1];//case '/':
4 B1 i1 s9 m2 ^. |3 F    }
$ ?: o! A: p0 i$ d}}! @8 a5 ]2 {: {% s. y8 b
template <class _T, class _Tstream>- F7 j; \; f% `/ c8 c& g$ ]
/* _Tstream: inputstream, _T: get return value
2 w/ c1 i, \$ s9 _. P- h6 h* Return nonzero if get value successfully */
6 J9 F/ q7 D' N: X* C% W2 gint GetExpValue(_Tstream& istrin, _T& nReturn){2 Z* h1 C9 V1 \* V
    _T t[3] = {0}; //雨中飞燕之作% `( e! N! D: D3 ?
    char csym[3] = "++";
" i. f, I8 c& O% d3 h, b7 q    int nLevel = 1, nERR = 0;4 _- ]) R1 F3 u+ N/ ^1 s' F
    if(!(istrin>>t[1]))istrin.clear();1 [- @; Y; e1 v$ p
    for(;;){9 t  d: U9 i: l! W3 [
        if(istrin>>csym[2]){
& D; h- Y% i, r. c2 v            switch(csym[2]){
1 d: }1 W9 l+ v; m            case '(':9 P) s: h: s& G/ B3 ?6 N% ~
                if(!csym[1]){nLevel=0x100; nERR=1;}else- S/ [7 R9 x1 u2 x4 a$ k
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- M* a& D. a4 B! a; G, v                else{nLevel=0x100; nERR=1;}; }  i. ]2 `7 y7 C3 X' n
                break;
) U. b; W" y# w) f! U            case ')':: R' D8 r4 H. R3 |5 P
                {nLevel = 0x100;}break;
* R$ I% l7 N. M1 S$ o/ G, p: f4 c" ]            case '+':case '-':case '*':case '/':" {5 ^- X" w8 F  e
                {csym[nLevel++] = csym[2];}break;
- J: @# z$ \2 C* r            case ' ':case '\r':case '\n':case '\t':continue;7 q2 J4 a. P3 k$ h+ U
            default:5 x9 }. z4 i5 a) o( b
                {nLevel=0x100; nERR=1;}
5 R' c, q. L  P0 p            }
2 w  Z9 V* [- h            if(nLevel==0x100)break;2 g, h+ k3 V* o9 C+ U7 k0 {6 @2 ^
            if(nLevel&0x10 || istrin>>t[2]){. U! A/ V& L; \. g! |
                nLevel &= 0xF;! k) m1 Q' n0 f8 C/ }, N6 Y3 R
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
) ?  |# N5 g; W( D* i6 t2 d  S" ?                if(csym[1]=='*'||csym[1]=='/'){% w) a8 _7 H" q, e( @
                    GetExpValue(t+1, csym[1]);) K# J' S+ ~& C  M+ t! q) x* O1 q
                }
3 d% T' \" I+ X: ?( V2 X6 @                else{, \9 j/ O' V- u9 I' D1 }
                    GetExpValue(t, csym[0]);
, A, `7 s9 M2 C  s! w) p. v- n                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
  Y$ Z; ^  }3 S8 k  D                }; ]! r% A$ r5 X: I& B0 T& y
                nLevel = 1;
9 S$ \0 T* r4 `2 u$ S6 \0 z& F$ e            }6 K3 g# S! T" t7 s/ x3 X! J
            else istrin.clear();
5 P) ?8 _% [. Y' I7 }        }, ?( B$ n( _# j" N( T  ]4 }
        else{nERR = -1; break;}5 F& ^0 X, |3 G
    }
* H  X/ J/ p) _* u! P: K    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 |: H3 z$ O+ x- b    else nReturn=GetExpValue(t, csym[0]);
8 ?6 @, P; B- O" x    return nERR==-1?1:0;
2 @0 ]+ j1 `( D}}2 i8 u- l, f; z  v4 J! @

2 H9 |, c+ g1 D' l# K  D' U  @7 r9 V- t' `) w# e
& F. ?. ?& [/ k3 W$ c! G7 v
函数模板使用示例:
6 W& W/ T- {  i. }( Z. U  M5 W2 z在以上那段代码的后面加上以下代码:! A9 Q) k7 q2 [8 u! a! q
4 S( l( ~2 N/ R6 \  Q' s+ O0 W

3 p- X% g. n! D, i, F4 w6 I0 o4 K
  e7 ~% K* r& A1 m. H0 P程序代码:
+ D' Y0 d- r3 Y( M4 T* F" ?( t4 l9 X7 I  V& _( u; w9 [$ N
#include<strstream>
) X4 ^, C- @4 T* v#include<iostream>. `) X4 u$ O0 h4 h0 u+ [
#include<string>
4 J# s6 t( }4 T% n1 jusing namespace std;* l) E& [) y8 Z* h
int main(void)
- t/ h0 m7 R: M7 @" M2 K{4 r) E' D" M5 l6 W5 `( A9 t2 R
    string s1;
) W  j( `# `. Y7 Z    while(cin>>s1)
% O& s' S' j& F* }    {* X& Y) H* C% P
        istrstream isin(s1.data());9 z- C! [' ^0 Y' g) |
        double d;+ D9 [' w* o2 Q* ]7 P9 O: n
        if(fy_Exp::GetExpValue(isin, d))0 e  ]9 D/ @( h8 }2 p4 I2 O
        {; @& r! |! S( m% l
            cout<<d<<endl;
$ l5 G6 }( a2 G  L/ ^7 x        }' e' ]3 z  H: U! h$ w
        else
& ^8 z6 w/ F8 X        {
1 n& e! e  Q% C) T2 r            cout<<"ERROR"<<endl;8 w! n. K; Y! v
        }
% P( }# \- e& W! R7 y    }  p) h& a6 M. \$ e/ M; ^4 O
    return 0;1 A/ Z3 f* n9 q) C
}& Q/ G# N$ Y  E" W0 i. v

7 Q' n, P5 W: x! S9 y2 l
( ~8 Y1 w8 F" |; Z然后编译执行就可以了(*^_^*)/ S, H- K. g3 ]. H  w3 m$ A
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) L3 v% h" e* u      建议使用VC7或VC更高版本,或者使用GNU C++编译

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