返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,, ~' v$ L3 I6 K/ T" |. X4 t% G) N
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式( _" ~0 j4 X! j' s" ~0 U; {
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 G  |7 e  {$ S- J9 Y5 S: S; ~参数解释:  \) e( s% t  o
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 h! R8 }/ D8 W& W: N* p# z% P0 s
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
1 Q( ]. f% m0 x  B) a2 \, t* B/ e返回值:
9 i; v# B* c7 \2 t, A. u: h0 V4 K返回非0表示计算成功,0表示计算失败有错误0 d8 C* M2 }0 d; F6 W
6 C: }# F, ?2 ?- t. l
. Y1 r4 ^. D8 r
$ l( @0 [: K4 P# m2 F
程序代码: 8 F" r* m- q1 B+ z4 C9 V* }' ?

( X7 b- u+ b$ Z& h0 pnamespace fy_Exp{
7 b, a3 k# p9 A5 P7 y$ jnamespace {template <class _T>
) y2 o$ h2 c6 C5 T0 @, Iinline _T GetExpValue(_T t[], char& csym){
5 @3 a) l5 R4 E$ H    char c=csym; csym=0;2 z. `! i* i  W: {6 s5 T. l
    switch(c){
6 E. m5 c& W3 i0 i6 }$ d9 e8 O    case '+':return t[0] += t[1];
) K% g5 W+ N7 d    case '-':return t[0] -= t[1];3 X' R, k/ I# o" e8 A
    case '*':return t[0] *= t[1];
2 I8 }% D7 l; w3 L) a5 s    default: return t[0] /= t[1];//case '/':/ z7 H: _: J! j8 v5 \7 M& Q& X
    }) r2 s; L) P& D/ L  Q! v: z
}}
! I# W9 x. w7 x; gtemplate <class _T, class _Tstream>. l# h& u: S5 r. H
/* _Tstream: inputstream, _T: get return value
0 M( N; r' o, b* f0 n" O2 y+ ~* Return nonzero if get value successfully */8 A2 u& k2 I: T# N5 w; f
int GetExpValue(_Tstream& istrin, _T& nReturn){
7 w  U( x8 n) f0 e+ R    _T t[3] = {0}; //雨中飞燕之作
; F8 K$ O: K' X- a; N  |' _    char csym[3] = "++";
8 d; Q- X/ j& W8 v    int nLevel = 1, nERR = 0;
9 i+ c! i8 V) I$ P    if(!(istrin>>t[1]))istrin.clear();$ e$ g, v6 f, ?0 X3 r6 Z4 u
    for(;;){
+ j3 \) }9 p9 i! ~" T# Z- g        if(istrin>>csym[2]){
9 J4 Y2 F) p% y1 P7 d# b. B            switch(csym[2]){5 a+ p) v  P/ A0 m' }
            case '(':% `" T  x, Z7 E+ Z: }; h0 [1 e
                if(!csym[1]){nLevel=0x100; nERR=1;}else
& [0 _% X/ p! P. W8 s! j                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( N' V4 P- K9 y7 I% z
                else{nLevel=0x100; nERR=1;}
6 V6 A: A( ~( ]% ~; g2 A                break;
% ~! \- o7 E( _7 b# Q6 L6 x2 n            case ')':
% V: F& J" G" ^# Z% o" {                {nLevel = 0x100;}break;
0 }# H' J3 A0 F5 ?  ~( @7 D            case '+':case '-':case '*':case '/':* G' G9 b5 F$ l% H, I1 g
                {csym[nLevel++] = csym[2];}break;1 z4 ]. A) j, Z  n% {, Y& ?! O
            case ' ':case '\r':case '\n':case '\t':continue;3 g' Y$ u( T1 w7 F  Z/ h1 w! H5 Q
            default:7 i4 d& K% p( j1 I( R
                {nLevel=0x100; nERR=1;}
3 I+ b# C7 x9 u: w+ i. \- q            }/ Y3 M' S& {, J5 e
            if(nLevel==0x100)break;' G6 A5 L- T; H0 K
            if(nLevel&0x10 || istrin>>t[2]){
& Z; S1 b/ i" ]0 r: D7 w8 F7 N                nLevel &= 0xF;8 H% M# I) H' ^( G; W
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}+ c7 y( A; u8 ~
                if(csym[1]=='*'||csym[1]=='/'){
2 \" ?( p" c% @* c                    GetExpValue(t+1, csym[1]);
& h! P; i' d0 C9 e- j& C! H                }+ {' F$ O, u; |; }" T( s4 F
                else{
' D* [# o- r, `" [. \0 N( o' Y                    GetExpValue(t, csym[0]);+ O, ^8 b; J) b4 L# {2 r
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" B8 J. m/ p# E- I$ Z+ q                }4 `* E: l, Q0 [: Y
                nLevel = 1;
3 D! a& x  X0 ?            }
' m0 W8 X( A6 T$ C( b- g% u            else istrin.clear();' w. {' m- U/ ?: ~6 S* R
        }) s0 s/ q+ H0 G2 D& M
        else{nERR = -1; break;}% B) C! S& r  a5 [( i; q
    }/ T* f5 F. B/ ~% i! i5 l2 y6 i% U
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: y( N' f8 O3 R/ h    else nReturn=GetExpValue(t, csym[0]);
' ?- p7 E! N5 I4 W: O! F3 q    return nERR==-1?1:0;) R0 a3 E  }% D8 L! ^. k: Q
}}
7 |/ ~, O" _# O6 Y7 @( e2 i5 ~4 }
, N3 I, T1 V1 O1 i
& m/ o) }: Q" g4 f, X0 ~
( f+ V# S6 I( G2 r. [% x函数模板使用示例:; Q4 e6 S2 l) {  B2 h( \4 v1 b7 I
在以上那段代码的后面加上以下代码:
/ z( T  F: x# G9 O- A/ Q, E& w
, v$ `0 g1 X4 C * H% B! a8 \5 P8 ?6 q5 ]. A) J4 |
5 t( A8 g5 e# [
程序代码:
. d1 F, H0 J$ q: s
4 q. K6 I  w6 M" ~0 V/ ]! ?1 H8 d#include<strstream>
6 a' t8 x, o8 @, p#include<iostream>( |0 y. K) e  i. g6 C$ a
#include<string>
, ^, w4 m# Z; [# ~6 ousing namespace std;4 x1 o2 l8 E" Y0 f- o: N5 y( i
int main(void)
4 V( \5 U: ]* D. T, m: i3 }2 g{
% W. e) P" f. L3 z- |    string s1;8 X+ |" l! p5 T* i' C1 b
    while(cin>>s1)
& A- L+ F0 s0 R: P; {4 |  E    {( y" v4 P  Z6 ?- j" C5 V4 J: E
        istrstream isin(s1.data());) a2 i1 a& K3 a% N( N
        double d;1 g- _+ S% i  i% G3 U( S+ q
        if(fy_Exp::GetExpValue(isin, d)); U- @0 L1 H4 m# r
        {8 W0 ?0 Y" D' y: D7 Y9 ]
            cout<<d<<endl;
  ^7 T7 U, V9 ]        }# L% u  v" B; P# w7 W
        else4 o& v& b$ V+ k$ z
        {9 ^1 z  f& L( e) F
            cout<<"ERROR"<<endl;
& ]( [8 W; N8 v% O  h# ]6 J8 p        }
2 m. J" O+ d6 I+ R3 b    }3 v+ j0 C# M' d/ V
    return 0;3 `3 [! r: [# o) e
}0 j& Y5 ^' A5 Y% _% l- w

+ e3 J1 v5 _, M# E) r8 y3 U
4 V6 G9 H5 ^6 |& k6 F然后编译执行就可以了(*^_^*)1 B# U1 T. m- @- N
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ p" w' K) c' j. x      建议使用VC7或VC更高版本,或者使用GNU C++编译

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