返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,2 h! ?6 M1 `+ o) i0 F) D6 U
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' S; s  e) q4 x; C$ o0 x
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 G* B: h, }$ @5 R, \. z$ x* H. {4 D参数解释:
% x) T: A  l$ U2 i9 p: i3 J9 fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 d' ?& Z) k1 {# [% h* N) ]$ FnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定! }. T/ @! u! H7 o/ ~
返回值:( A8 O3 V; n1 T7 k6 |+ M/ o8 N; l
返回非0表示计算成功,0表示计算失败有错误; |5 j: n3 j' Q! Y8 i
! u# Z' \9 ^- S- o6 A$ ^" ?
! ~' d' h+ s5 |4 Y& y; d" t

& D7 D3 j0 M$ v6 f% A2 h- D. S程序代码: 3 I$ B% Q+ w9 H' G5 D
% I- U' g" e1 V3 }8 y* u% S
namespace fy_Exp{; H% z+ l! s# r6 t
namespace {template <class _T>3 q" B8 N1 Z9 Y) ?6 z0 E6 Y- c
inline _T GetExpValue(_T t[], char& csym){$ S) N1 j0 i( |9 }% n
    char c=csym; csym=0;" k/ ?% Q% R, M9 ], u3 I' a- @
    switch(c){
% w+ _% o! v% B9 d; D4 H' f    case '+':return t[0] += t[1];
8 |, B% R. Q2 r4 L& s8 A7 k    case '-':return t[0] -= t[1];
7 [4 o9 x$ h. E8 U1 n" r' a: t    case '*':return t[0] *= t[1];
3 p+ a+ P4 s2 ?# f, i! h. v3 S/ a    default: return t[0] /= t[1];//case '/':. I% V2 h( ]1 u. ~$ d+ B
    }
+ r! G! ?+ A; {; S& y}}
9 z2 @# b: I# {+ Ptemplate <class _T, class _Tstream>
1 j& \# B% H& \6 n" M' {" @/* _Tstream: inputstream, _T: get return value3 d. ~3 X# H' X; i. Y  t& I% G9 t" G
* Return nonzero if get value successfully */' m/ \: t9 k' }
int GetExpValue(_Tstream& istrin, _T& nReturn){
, ~5 C: r- e) {0 `( V1 X0 H    _T t[3] = {0}; //雨中飞燕之作
4 r& a! U" c. K& ~  I+ @& j: u    char csym[3] = "++";! S$ t* ~6 ~4 j7 N5 P- r
    int nLevel = 1, nERR = 0;
$ X3 {2 G" |5 T2 ~, G* Y    if(!(istrin>>t[1]))istrin.clear();
  R8 Z. T; G. A4 Z0 I    for(;;){
1 y  e1 O! K( _6 J        if(istrin>>csym[2]){
2 f8 A8 \$ Z2 V7 h5 w            switch(csym[2]){! p4 c4 d# ?8 D2 d( I8 H; R
            case '(':
# }/ _/ Z( B, U& N                if(!csym[1]){nLevel=0x100; nERR=1;}else! F% ?. {) I& @/ D- r8 B* H! h; L
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;* h& g- N1 E! E; `8 }' v6 L3 K
                else{nLevel=0x100; nERR=1;}0 r" |+ V" B3 }. I3 V* S% t9 |
                break;: t4 g" v0 V0 H* a0 |: C; Q
            case ')':
+ C9 N$ ?% E) }3 ^( R& V                {nLevel = 0x100;}break;9 f% o2 l+ e6 E* G# \. ^
            case '+':case '-':case '*':case '/':) w* ^: e3 O$ s
                {csym[nLevel++] = csym[2];}break;+ i& ^2 f5 ?; a+ s, |* b- F
            case ' ':case '\r':case '\n':case '\t':continue;
! Q* l6 |2 s& `            default:
5 h* @% o& R1 I                {nLevel=0x100; nERR=1;}
: h- w. `. v# {7 _3 i, H) b/ ]            }
2 Z0 ^. B; g0 l  }            if(nLevel==0x100)break;9 a) t5 ]2 ~, d8 [- N$ D
            if(nLevel&0x10 || istrin>>t[2]){8 I0 b# s& H9 N: m" y( g
                nLevel &= 0xF;4 M& f* }5 z& n* B
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! I6 r  `# ?  O8 q                if(csym[1]=='*'||csym[1]=='/'){$ P$ q. [1 o8 S5 x4 I: X
                    GetExpValue(t+1, csym[1]);
! M$ p! n, O% w" C4 y! B4 O) e: F                }
# Z" A5 V- Y+ Z& c3 P8 J                else{
# o" \# O( }- _# i                    GetExpValue(t, csym[0]);6 @5 Z* \% @1 f3 ?0 c
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
9 E" E3 R. v; W5 ^                }
! h, E2 [' F; ]& ?) x                nLevel = 1;
& _7 K' j$ t* T- [+ c# E9 v            }
0 a8 D$ f8 x  _9 s5 _8 @. ?- X7 B/ `            else istrin.clear();4 s) ^3 s* L. p& J' K
        }
! Z5 X9 D# L4 p7 ?        else{nERR = -1; break;}
: F2 ^( w, L9 c; O7 N$ |' V: E" Z    }. Y! S2 y! n+ l7 A/ x# v
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 d5 Y# K5 S" t8 ~' x    else nReturn=GetExpValue(t, csym[0]);
! M6 Z$ B0 @1 X  D* c/ m1 R    return nERR==-1?1:0;7 ]1 n, w5 V: N8 D7 q
}}
( v" v! N# A0 @( D
8 }8 e; K$ B; `! H) {* C+ T- e6 b: T3 x+ z
& w$ t7 o8 P; _$ Q+ ~: L, C
函数模板使用示例:
/ ], K5 |7 R, l- ^: [+ Q在以上那段代码的后面加上以下代码:
8 h2 d+ A" k$ f6 f% u8 C/ ]! A+ T2 W, I/ R) o( F/ v7 e

( N1 W; x# V" S0 {3 X
: A2 b" {0 \5 m程序代码:
0 Y# ^0 c$ m- b9 U8 B/ g
* v4 W/ S6 a* Z#include<strstream>8 j0 F' e5 m. j! T* L; b; _
#include<iostream>8 M* h# n, a6 e' w* ?( ^, v: a& X
#include<string>
7 a6 H. }3 P, _: Susing namespace std;0 e( @. b, [  @3 C% ~/ I! K
int main(void)
0 S, f, C8 X. d7 m) b" W' }: c! F7 ~{; s+ A8 Q- c* T0 m. z9 C
    string s1;" _% P, }$ @, j- n9 N6 N, B
    while(cin>>s1)
7 F6 N6 s4 Z* L/ m    {
( {+ K( E* n  u4 c$ e7 d        istrstream isin(s1.data());
* G8 a7 ]* _$ f" i        double d;
- Y' V: [+ ~2 G7 v        if(fy_Exp::GetExpValue(isin, d))
6 B& }0 x. T. M- o8 q9 o& E        {
/ [; D" }9 t2 U; D7 p% S2 C            cout<<d<<endl;
/ K8 m$ J' b; q- n        }; u# [" d. a! K+ @
        else
# I/ d2 ?/ |9 j1 n% n4 G        {. g% Q3 P$ K/ A
            cout<<"ERROR"<<endl;1 ?3 y6 p! a; v8 H5 B/ N
        }
+ a# G( y7 R4 |    }
+ M5 S7 w2 A3 C% Z. p% m    return 0;' }8 _7 o' J2 s) O& |
}
, ^; e: b9 m8 S, a# e  Q
1 N' D4 ~4 E+ q% j3 U. l# C2 q# W8 y( B8 G# G  F
然后编译执行就可以了(*^_^*)! J5 s- m/ u, P3 y6 a' X
其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 L6 e- F( l0 q& h, p  U
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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