返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
2 Q4 _) j# w$ G( T7 f$ P; c一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' ?' T+ X$ e; z: R. _只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ D) x* a9 d3 ~) b+ i2 L
参数解释:
, F0 K8 J1 j' }$ jistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 j" E( F( |: w% I1 ^$ BnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
% c7 e0 I8 I8 d3 o& x返回值:" c  H5 s* U, ^8 Z+ M% t
返回非0表示计算成功,0表示计算失败有错误! J/ Y) u' i! l# I
3 e. d4 {& D. Q2 A# l1 i

3 ^1 F) A) d6 G0 l9 u1 U' V6 [# }( r( _! F9 f2 Y
程序代码: ' x$ u0 L7 U; Y3 k4 ^8 P

& j$ V, }# B- q  \$ ?) s2 Nnamespace fy_Exp{/ U  u* B' |- `5 N8 S
namespace {template <class _T>, ^# y; m$ u8 ~; h+ B  [  @$ F) ^: T
inline _T GetExpValue(_T t[], char& csym){! z3 }. s& a6 j- T, x7 o
    char c=csym; csym=0;
8 U4 Y6 |8 _1 k4 L2 E    switch(c){6 s( q$ U7 z3 |
    case '+':return t[0] += t[1];3 o4 y8 {! y- w" E
    case '-':return t[0] -= t[1];
/ Z, }9 V. a# L6 D% |    case '*':return t[0] *= t[1];: P1 y% S0 Q9 z( U0 |, q
    default: return t[0] /= t[1];//case '/':
) c- ?# @+ |$ P" i1 V# ^    }! |5 n2 X# D  S3 Y1 u- `
}}8 |8 F9 p) m* b7 v2 {0 e/ h
template <class _T, class _Tstream>
! q6 ]2 o4 C6 |- P& ^: B/* _Tstream: inputstream, _T: get return value
' C* q. J! _- Y# o* Return nonzero if get value successfully */
$ k1 p* C/ A  G) yint GetExpValue(_Tstream& istrin, _T& nReturn){
) n. D% m3 P: U" t9 S) i) d    _T t[3] = {0}; //雨中飞燕之作
" B8 K( y# r9 K+ }    char csym[3] = "++";
) I! G  m+ ]3 n4 i# [( u    int nLevel = 1, nERR = 0;
# I6 D/ Y9 x! t& \    if(!(istrin>>t[1]))istrin.clear();
; B; ?7 z9 [. x; X3 K, Y    for(;;){- t: ]$ y# D7 r& L2 @+ c4 I+ k
        if(istrin>>csym[2]){' s1 }; X* [  @; x0 f
            switch(csym[2]){
5 Q4 n4 u# q: Y/ K            case '(':, ?+ ~% V4 g, q8 I5 k- |; I
                if(!csym[1]){nLevel=0x100; nERR=1;}else$ l2 [. ?& x& B$ J& e3 d
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
* ?6 C; v' B9 v, Z. G1 [6 u                else{nLevel=0x100; nERR=1;}. F8 d# w; N! N1 x3 }
                break;$ p9 K8 Q% W$ ]1 L! K
            case ')':
) r" z" e: m- d3 x. g                {nLevel = 0x100;}break;
- m/ O! {# v/ b6 A. F1 c5 z            case '+':case '-':case '*':case '/':( L" o# R$ ~$ I- \5 n
                {csym[nLevel++] = csym[2];}break;
9 {! ^8 T2 `7 G. B            case ' ':case '\r':case '\n':case '\t':continue;8 l7 Y3 r4 h5 Q
            default:
, e5 j; Q+ n2 z$ [: y1 g7 {. X                {nLevel=0x100; nERR=1;}" H7 u4 h# P4 L* P! j7 H, X% `; F
            }
" g) }8 V' g$ o/ U            if(nLevel==0x100)break;0 [, G" L7 X+ u
            if(nLevel&0x10 || istrin>>t[2]){+ ]5 A  `1 X! g$ L% o3 g- v
                nLevel &= 0xF;  o! E& f8 O$ i
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; B: x. X9 H/ a1 |3 [( T                if(csym[1]=='*'||csym[1]=='/'){5 J: Y0 J' k( p- `" `/ _% q
                    GetExpValue(t+1, csym[1]);- p3 ]4 C! ^/ [: k8 l7 `+ i
                }
. n: {& m8 l' ?0 L                else{
! \: f' b& V% ?3 N# m! T                    GetExpValue(t, csym[0]);
2 E. V  x# O2 f                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& z7 D' d3 u% Y                }
. g( J- q1 n( |  L  o                nLevel = 1;. y  ^$ m7 {9 s( u8 y$ P8 T$ p8 U  L
            }
7 u0 T7 R' i+ A3 P  U/ ~            else istrin.clear();; J8 i, }) }4 {: c$ n1 o
        }8 N+ h* \, M+ T0 o1 _' Y0 z
        else{nERR = -1; break;}
; T9 X/ }4 h& z; z5 F7 b5 d! G/ b    }. X3 D* {% `4 f, [" ~
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" A: @" O+ i% f1 S! T7 I) P    else nReturn=GetExpValue(t, csym[0]);
( t$ v% O0 I- n    return nERR==-1?1:0;
; |3 I4 Y  |- L}}4 f$ C- ~. ?+ S) r

3 `: y( O3 M1 d' l5 t  `; ]" a0 m1 @1 [9 j; b$ W4 j4 y' K9 B5 ?
+ i% N$ R3 i1 R& w
函数模板使用示例:
/ @0 h1 H9 y+ L, U# ]2 e  i& p. C在以上那段代码的后面加上以下代码:1 R; O$ [8 A$ J# ?6 K/ j

) M& ^( N; z( z  o# Q& U1 l( f, w* [
# i  E/ C: n* [3 u5 F) _5 v5 E* M* k. r8 N
程序代码:
1 k: k! s+ F" K* P: h6 l' o
5 V2 e" }* F3 r) ^! w' @; p2 {0 N#include<strstream>/ J/ e- m8 f7 X& {
#include<iostream>
5 V# d  w$ v& x#include<string>
) q) y) T: j5 G5 e% X: j' {using namespace std;
; v( h, T5 X0 }  O! r; x3 Fint main(void)
8 H8 _0 I8 G1 U, \9 g{9 K0 M7 x9 p+ e$ V' t" @' Z
    string s1;
' }% L0 A5 Z; l3 U! Z+ S    while(cin>>s1). e4 G* s) q2 {! X
    {
7 f" ]% a/ C# w        istrstream isin(s1.data());
3 v, P+ i, y8 _4 Q9 o. E        double d;, A6 y4 i" Q5 \1 D( r! |" p
        if(fy_Exp::GetExpValue(isin, d))
% t) Z6 z4 u* z        {
& n( B& h* v0 b$ v            cout<<d<<endl;
" V; a* O+ G* o# V3 I        }) }* ~5 Y6 E! _4 x: y# H9 |1 h
        else8 D9 @, Q( L. A" L
        {  O( v2 n  P5 u
            cout<<"ERROR"<<endl;
% v% n6 W* c: }1 M% x' |        }
1 _6 U4 Y& K- D    }
5 Y8 E5 P; E/ N    return 0;
2 V2 `5 @: t  ^% g}
" X! Q4 A' t1 ~, v. N7 I9 P0 r; v; d# x( @! R) [/ P0 H+ A
' F8 _6 j5 n# e5 a( r4 P. B2 X0 q
然后编译执行就可以了(*^_^*)
' B& |0 ~0 }1 C( ^其它:TC++上一定编译错误,不保证在VC6上也能通过编译- ^) `. o6 q6 L" T  Z
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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