返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,( c* y+ z) P  y/ d2 c- s
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
( D4 l0 T( ?$ [只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 X- @8 h* q, G& h% W参数解释:# |# R& j/ r$ N8 }7 f
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
! _- ~) V* O4 t) `3 WnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定, `  C/ m/ q' `# e
返回值:3 t. r5 O. e+ Z. t
返回非0表示计算成功,0表示计算失败有错误* [- u7 D: B6 c2 y$ w  ^8 j6 q

, G$ E, d: g. ^# j- K* Q5 A, v
  A" I2 r* [# c) t: J/ f, J- P1 p( l) l  c
程序代码:
! O( V/ \* y+ U
# g, i6 S( F: L/ C. v( ]namespace fy_Exp{" @5 f& a! Z* a& p
namespace {template <class _T>) a! G( N: Q& K8 H* U  B/ o
inline _T GetExpValue(_T t[], char& csym){, m0 M$ N3 C4 r  E9 U
    char c=csym; csym=0;
4 {# A" a. A( i    switch(c){/ m: x9 {4 N8 U5 L0 \! `* |( \" m2 X4 P  O
    case '+':return t[0] += t[1];& d1 o& {! M% [! a
    case '-':return t[0] -= t[1];
2 b7 c- r, z: f4 D. q! Y% U    case '*':return t[0] *= t[1];6 G  H1 @$ h2 _3 i/ c  @
    default: return t[0] /= t[1];//case '/':; v$ O6 l# f, K  b6 C8 w
    }
. p3 q$ i1 ^0 J) v/ k7 P8 O}}
8 r) J8 G  w& Z# ]template <class _T, class _Tstream>
4 t8 O, A8 F5 A9 x/* _Tstream: inputstream, _T: get return value( t# \7 x% k+ A4 l
* Return nonzero if get value successfully */
, I& J! G( [; t, @5 [3 I6 Cint GetExpValue(_Tstream& istrin, _T& nReturn){$ w* p& k' v" S. P+ ^
    _T t[3] = {0}; //雨中飞燕之作
1 r0 o) j8 a! I. o5 @7 u5 G    char csym[3] = "++";) f  K. m) f6 X& v* F) ]# o4 _
    int nLevel = 1, nERR = 0;
2 Q  K3 I! [8 Z& m2 }& v4 [0 R    if(!(istrin>>t[1]))istrin.clear();
( ]* L) h, n/ h    for(;;){& L7 R4 N0 X" F" \
        if(istrin>>csym[2]){! i* ^/ {( s6 c9 T
            switch(csym[2]){
. m- a: M7 `8 A3 w7 O            case '(':' v& j: A& y1 C2 w4 H) q* d; @
                if(!csym[1]){nLevel=0x100; nERR=1;}else, S' e5 A% @$ l, u1 d' U
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( n# I) Y5 l: e- a0 A8 `
                else{nLevel=0x100; nERR=1;}2 m% V9 X9 |2 I% \
                break;
6 K+ x& G$ \% s) \! ]# B: v            case ')':
( A- t8 q1 B; T0 _( Y                {nLevel = 0x100;}break;
- G5 k* }" C+ ?5 _! f4 d% o) s: u            case '+':case '-':case '*':case '/':
* K. a7 b! C1 T                {csym[nLevel++] = csym[2];}break;
% }0 K% M- M7 W6 V5 r% Q. e            case ' ':case '\r':case '\n':case '\t':continue;, d$ q: }! d/ E. H
            default:
0 `" K! e* M, B# u4 x( [                {nLevel=0x100; nERR=1;}
/ J% B! o: \- Q0 E8 ~            }  z) N& A3 p+ u6 j/ u
            if(nLevel==0x100)break;
/ m. W! v3 y3 `3 [1 T0 Q! e            if(nLevel&0x10 || istrin>>t[2]){
; M; p& Q0 D" S' \/ Y                nLevel &= 0xF;% y* I# e+ e0 P3 k+ j) b& B
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. Q) Z9 e/ f: m) {' Y5 L, Z
                if(csym[1]=='*'||csym[1]=='/'){
4 `* ^( J' L1 ^, X) _7 A/ l                    GetExpValue(t+1, csym[1]);
9 i9 g0 @" h" c$ D% S                }
, j* p8 k) W* o2 M% R                else{3 ~2 f, g/ f- _! s4 K
                    GetExpValue(t, csym[0]);7 ~# ]! G- c* p1 K0 A
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
2 A( u# b0 w/ k$ N                }
0 I0 n, Q7 I! c3 c                nLevel = 1;
' N7 r; j: S* `. K$ g6 j3 v            }8 D' P! a# S0 F
            else istrin.clear();* \  K" e9 Z, f* z
        }
3 O( f$ w' W- l7 \        else{nERR = -1; break;}  F: U3 `, p* [% H+ W0 |' Z
    }  D* W' Q0 D9 y5 ^
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( l1 X# K- @' E! D7 c0 `5 D
    else nReturn=GetExpValue(t, csym[0]);
/ M1 k. L5 W; a& j( K    return nERR==-1?1:0;
" {' p- C6 J3 e% ~: R}}% b* D. Q* p+ {" H% ]9 g5 K+ z  h
* @6 I0 Z8 s9 M7 F7 `
! m, w4 ]  m' G1 i2 n9 F
  A8 z0 N2 u& {" y4 `7 [( U
函数模板使用示例:# j+ M- T! I+ C. @, i+ e
在以上那段代码的后面加上以下代码:
) ]/ |" Z4 C# E: |) G$ f  K* ]0 F( M+ Q! O2 P

5 m1 F  d& K4 A) d  t* ]8 B7 S- w& X, H- y' P$ e1 k- k! F
程序代码:
7 ?; t$ `1 R6 p( [! z: G1 y
8 ]" I' h' M& R; I$ F/ o#include<strstream>. C3 i2 e0 v( X) n
#include<iostream>
( C" Q% q! L! ^+ }$ g& P2 A9 H#include<string>
' f* F8 t- b4 B6 ousing namespace std;
4 Q( f% x( p8 e% t$ D( o  r: e! K; mint main(void)
! I  L0 N$ D: f& z  A3 V. g{. {+ l* W  n7 ~3 W
    string s1;$ P" ^$ E# C! n) w
    while(cin>>s1)( n+ I5 W+ _' Z' ~+ i
    {; O' @4 [5 ]! h7 g( ]' O! T& b$ B
        istrstream isin(s1.data());
) \6 \8 j( E3 N, A        double d;/ x, k4 |/ r8 w3 X0 [3 S) J" z
        if(fy_Exp::GetExpValue(isin, d))' W5 g  l; m) r. i' g
        {* ?5 @! `4 B, m0 X" y
            cout<<d<<endl;  x, B4 r+ `$ Q7 M
        }! B0 i7 K+ a1 s( j0 m( O* ~' o! x/ J9 f6 H2 Y
        else
9 a7 n$ ^/ R5 C9 Z7 {4 f. q        {6 w4 {3 N$ K, n. Y
            cout<<"ERROR"<<endl;
* f6 X( n8 k+ i; o# b7 W0 e7 N        }. t7 G6 \. M- V% \7 |" ?- j; e# M
    }
. a/ I; r: h" a6 s    return 0;
8 X( k& b2 r8 c9 d* ], A}
, F, L# e# h, O. B2 o1 x8 }
, ?/ ~+ K- D1 f/ ^! K& \9 j5 _0 b4 e' K$ Q1 `" S8 y
然后编译执行就可以了(*^_^*)( e8 x/ Q0 f, L# `
其它:TC++上一定编译错误,不保证在VC6上也能通过编译, `1 x* I1 n) h9 K
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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