返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,/ T% r7 F& s* Q4 N* t# A/ _
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 }' I5 c9 o6 ^1 j/ _3 @( }" F" z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)- }; V! T# d* Z4 x
参数解释:; |" H4 k& {1 W1 B% j# M
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
% J" w) a# t8 E! x% SnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定# e: @1 a0 w$ V9 C
返回值:
) w( Q9 h  i, Y2 ], U* A2 b& Z3 }( n返回非0表示计算成功,0表示计算失败有错误) y  v) i; b( d- f1 ]. S
5 E. f# B* e- M
& d6 p/ Q- r; z% N1 u
! {- c" R4 ~3 e/ ~5 Q
程序代码: / `+ E! w  ?  J8 a7 l( l3 q

  R9 `3 r4 y$ T" _; U9 q8 ?$ Inamespace fy_Exp{
# G' R2 l* i7 f+ C. Z8 p3 q( o1 Nnamespace {template <class _T>5 F; U3 ~) }! n+ A" n5 d
inline _T GetExpValue(_T t[], char& csym){* ^6 B( G6 p1 u7 c4 b# T1 m
    char c=csym; csym=0;+ G, B! x0 N" J/ Z. a1 R, B1 }9 g
    switch(c){
8 R' Z( d% {- u) k2 O- Q9 ?7 {    case '+':return t[0] += t[1];* X$ S6 H3 f3 ^9 {4 r4 B
    case '-':return t[0] -= t[1];) O$ ]$ k' c0 J7 g
    case '*':return t[0] *= t[1];) v" ^! L+ e( t6 j7 Q
    default: return t[0] /= t[1];//case '/':
0 w  m; N+ c9 D8 @    }
! j7 j, k! M( l, M. p}}
) g- w) q9 _, ~0 @1 H& h5 Utemplate <class _T, class _Tstream>
2 H0 c, S3 r5 |6 L/* _Tstream: inputstream, _T: get return value$ ^/ K: S; W0 g. P
* Return nonzero if get value successfully */5 r. j; T- @# o( N7 N
int GetExpValue(_Tstream& istrin, _T& nReturn){5 C+ I6 Z/ T" T& G; F) t
    _T t[3] = {0}; //雨中飞燕之作
& ^1 I; `, R+ a- f& t$ ?- \- ~    char csym[3] = "++";
7 N6 s& S- K" ?; N. v9 G    int nLevel = 1, nERR = 0;
. P% I: E; X1 `    if(!(istrin>>t[1]))istrin.clear();2 l7 `+ Y/ e) g+ y
    for(;;){+ `, F/ L) P, h" y5 d7 [4 ^3 n
        if(istrin>>csym[2]){, U1 F5 T0 I/ i( Y: W8 X/ H
            switch(csym[2]){" A! N4 {% m! `6 h, K4 i
            case '(':$ `" W: S& g* C* C/ H( q
                if(!csym[1]){nLevel=0x100; nERR=1;}else) j# k- g. O3 [6 V* ]
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
4 R. l) H' `4 F0 S2 D$ n* W) Z                else{nLevel=0x100; nERR=1;}7 J- s# q' p3 L7 f
                break;0 M, c+ S: ?% y' g6 V7 Q2 N4 W
            case ')':
, L1 ~  ?! U& O$ b% V8 Y# ]6 G                {nLevel = 0x100;}break;! V1 n/ H9 P7 n) s* x; I: \
            case '+':case '-':case '*':case '/':
: }3 }  F: Y7 _6 z* O  r                {csym[nLevel++] = csym[2];}break;* T6 R7 ?* f0 ?6 u9 `7 T
            case ' ':case '\r':case '\n':case '\t':continue;1 A" t  _# K; |% K! ?
            default:
  t4 ]- ~# m0 L2 ?# m3 L                {nLevel=0x100; nERR=1;}
: A  V# \/ h2 U- K            }9 a0 m% ^0 l! J0 Y. e  R5 d, B2 R
            if(nLevel==0x100)break;
4 j3 b3 ?3 h7 T$ p! p            if(nLevel&0x10 || istrin>>t[2]){: {  U- o4 V* Z3 H) ~
                nLevel &= 0xF;
9 Y) u: Q0 W6 F6 X& x                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 c, O+ `' y& J% q                if(csym[1]=='*'||csym[1]=='/'){
2 @' p& Q" T/ R- [; u5 F7 _                    GetExpValue(t+1, csym[1]);2 I/ z; B' v7 G3 e
                }9 N( U! I. F+ W- U
                else{
* k& L; ?  D3 Q( v' }0 N& U                    GetExpValue(t, csym[0]);0 E/ V* L/ j0 b9 \5 S7 F
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;+ X" Y# i& p$ [0 z+ ?( u9 a
                }
/ s' h* S) o% ~- Q                nLevel = 1;
% m. B2 |1 \# [            }$ l$ y+ _5 }& X0 @3 g  M- r9 j
            else istrin.clear();4 R8 K4 S2 n- C" q
        }
: P+ G6 }( _$ W2 o8 m        else{nERR = -1; break;}& \" ?% ?, u; A
    }
0 y9 s$ p+ j+ J2 s    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);2 x# ]1 x3 Y. W
    else nReturn=GetExpValue(t, csym[0]);
" v- c2 H- z1 `! |' J    return nERR==-1?1:0;1 ~3 h; @6 W% e- j# ^+ m
}}4 I! h6 r7 m) `- U" L1 I7 d1 _
1 P' b8 \( Z5 e5 f3 h) u

/ n: b* x3 Q' d0 ^$ T. A+ \2 H6 P  }* A2 M8 \# b
函数模板使用示例:
7 Y$ G. w/ {' j9 P* e3 z" ?在以上那段代码的后面加上以下代码:
/ [+ U8 ~7 k  D$ v" k- P  f" u5 Y+ ]5 f
) e/ b" W+ R! \' m% Y0 q
5 T* X6 B$ }. W9 O# i
程序代码: ' V" e0 u' U3 W

! k& m, X$ K( K; B+ x#include<strstream>: ?- M- U' I  {
#include<iostream>4 _  u7 I; x3 d4 {3 D
#include<string>  u. F; u3 }+ ~' c, H0 Q# q! w) l$ r, a) h
using namespace std;
& B, _% S7 m* C5 }int main(void)
% @9 U4 [: ?5 O5 u{
' _* Q* H$ L* Z7 I# u    string s1;8 M! j7 l: l$ B6 [& I
    while(cin>>s1)
" |- \" `1 U4 Z6 ^: w! H0 z) T: D    {8 Q3 B9 X9 Q8 i+ Y: ^+ P2 ?$ R
        istrstream isin(s1.data());
$ J" o# @  [% A% `0 \: i        double d;
5 M3 J: I" \! u+ f! `# g, q! w) C        if(fy_Exp::GetExpValue(isin, d))# r# p" i2 N4 {
        {
6 V* @4 q7 E# S! I* A! D  N0 b: G            cout<<d<<endl;  c' {4 k% `4 T: b" O' r3 U
        }
0 Y# \  \9 r% @. @! f  y; ]7 [7 X        else+ u4 S) C0 n" \4 E
        {% @' B! y- I3 w& s4 l( l0 ~
            cout<<"ERROR"<<endl;& S0 z2 e3 b% |# o
        }8 w# h4 x; ?7 V5 U+ L/ S
    }
2 p( H3 G3 e3 J' n2 a% [, o    return 0;) h! s4 E; U/ u+ W& h6 D
}
" f, F' O1 S) c# S8 q& }% d2 _& O6 c6 N% N6 {

8 X- P& P' b+ S" [然后编译执行就可以了(*^_^*)% s* x+ Z, _8 j6 U4 K9 Q6 \8 ]: s0 D
其它:TC++上一定编译错误,不保证在VC6上也能通过编译( i  w4 o6 Z2 P. Z! a7 K) R6 m7 Q4 d
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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