返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
+ N& f0 N% w1 |" ?一个很方便的函数模板,可以并且只可以计算含括号的四则表达式, ?1 j! K+ x$ O# P4 _
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& @, t0 Z. g' g9 k( ~1 S- l$ ~参数解释:
- X  z: d. g/ w) l8 W4 Aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流/ h; [7 j6 c. E$ E  S# e& U4 L
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
  r( S7 U/ Z( ?- Y返回值:
4 R7 p+ ^% y* [返回非0表示计算成功,0表示计算失败有错误
: B, K- z% J. k; p; l; J: C9 {1 E# D% N+ K: S

& Q# x4 r0 f: b( ^5 P3 b* B- q5 o  H( n+ V5 d% i) J, \: t9 ]
程序代码:
1 f  f0 c+ v! @6 f" {- P* Z% R2 N( K- `$ }, }  g
namespace fy_Exp{: P* @/ @3 L7 K' _8 X6 z
namespace {template <class _T>
$ |. t0 r! W$ z) }( O# einline _T GetExpValue(_T t[], char& csym){7 L# j3 h" Y$ q
    char c=csym; csym=0;
7 x. Z, ^7 z" j9 G% G    switch(c){/ A% z. x* _! z; y4 C
    case '+':return t[0] += t[1];
+ y$ u& [$ a* M$ S& g    case '-':return t[0] -= t[1];
% r' W; }5 N; C2 X3 b' R    case '*':return t[0] *= t[1];3 M$ T/ S0 k( r8 u7 j: |% [5 w
    default: return t[0] /= t[1];//case '/':
) A7 U7 f1 e: a  w. u4 \+ R  O' h    }
6 Q7 y$ g7 `0 ^0 V& G5 z4 z6 P}}6 w: D& m8 l8 q$ Q9 s6 Y' B  S
template <class _T, class _Tstream>5 h0 |/ d9 ]* j
/* _Tstream: inputstream, _T: get return value
* D! R4 g7 [- `4 s5 Z* Return nonzero if get value successfully */
0 b) [# q, x# C0 Zint GetExpValue(_Tstream& istrin, _T& nReturn){$ P9 |" t" R" ~7 q) m# p5 I9 [
    _T t[3] = {0}; //雨中飞燕之作% B" D% Z; V9 ?  K5 S$ j
    char csym[3] = "++";
8 o3 [4 i( n, ^# i* T    int nLevel = 1, nERR = 0;
* Z" k; L$ b# t0 ?    if(!(istrin>>t[1]))istrin.clear();
9 ?! |" |( u! U& b" G% c! D9 Y    for(;;){& R& [- Y  j4 C) W3 @
        if(istrin>>csym[2]){5 Z: G' z9 a; c7 M& r
            switch(csym[2]){
. p6 z! W$ c3 w6 K' x            case '(':
- `6 Z* ^: X% k( A                if(!csym[1]){nLevel=0x100; nERR=1;}else- A! C  ?; H' S4 d! O# [
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
. @7 A+ }7 F( e% s2 Y1 P/ ~                else{nLevel=0x100; nERR=1;}* _- w* Y* v+ ]0 j4 F( C
                break;. ]/ ~" H( n  a9 i8 I2 p3 m2 P
            case ')':
0 w# ?  r0 v% ?9 K: V) Q5 s  `& b) |                {nLevel = 0x100;}break;
6 @5 ?+ F6 E0 x* R, O            case '+':case '-':case '*':case '/':" Y, z: ~3 j3 I& q. D2 {0 l8 S
                {csym[nLevel++] = csym[2];}break;
( b7 M9 Y8 A; b% @            case ' ':case '\r':case '\n':case '\t':continue;# n8 J! R% L9 g" s! V$ S
            default:" }! C7 n3 s3 b( n, X
                {nLevel=0x100; nERR=1;}! F( p2 R- E4 L$ w
            }& i- g2 x# E+ O6 s. y% k3 [  T0 v# y
            if(nLevel==0x100)break;9 E( @0 u9 l+ n6 `/ I/ [7 i4 i! p
            if(nLevel&0x10 || istrin>>t[2]){
1 a* ]4 P! N/ n                nLevel &= 0xF;
. _* A- G# ^+ W0 V4 a. j                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
% B" V' S! ^, `+ }- w6 y8 y  {                if(csym[1]=='*'||csym[1]=='/'){
+ e, [: u3 Q0 z1 }                    GetExpValue(t+1, csym[1]);
$ d1 {* ?  z! m* c. J                }2 h. ^4 e# r$ G" b: q
                else{
# i3 }# `% Y* D. U% U                    GetExpValue(t, csym[0]);) O. V/ u& g* M! f4 u6 I
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
4 c& Q/ N" E1 G; O) T& `                }
4 [5 v9 r+ ^# d8 U+ b# X( a                nLevel = 1;
  s# Y4 C$ {0 f7 [  }+ G' \            }
! d5 d# o" g  N- p! S& V            else istrin.clear();0 A! k2 r* |# t, q' M7 J$ K
        }
' q5 f, Q# |3 A        else{nERR = -1; break;}
$ N8 S7 ]& u! B+ k" c( P  a9 |    }
/ ]8 s8 b% O+ c: Z    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 G4 K' m& U7 V, w4 |+ |! d6 A) d    else nReturn=GetExpValue(t, csym[0]);
! x$ y9 X1 Z$ E  b5 w+ c  \    return nERR==-1?1:0;
2 l" \+ u* ]0 L9 n' d2 d" G  A}}+ f( M/ M5 u- s9 q2 L9 P
- C( ^$ K' p' d- }8 G9 E

  D5 b. y1 A7 o& M- n9 n( n& z; m0 h2 h. b* a# w/ m
函数模板使用示例:
/ \* U; r; U) h: V. j在以上那段代码的后面加上以下代码:
8 o! |  \" _/ j. k- U
  z+ G) m2 J  }
" a( E  r' @  ^$ A2 ?: O' a
3 I+ y' J% G* q: h4 O. I程序代码: 4 v) E' j' |- `/ }) T0 P
$ |" t- ^' G2 [9 E  q( J
#include<strstream>
& R# T: ~5 h+ \1 v. l) k  t9 j#include<iostream>& a& j1 ?! ~% w' U- R- V
#include<string>
3 d3 \) C) B$ l- T! m5 dusing namespace std;
* N( c+ M3 |4 W: g0 hint main(void)+ M& s+ W4 V! J- |
{
! S  m3 V' {" d% v3 i    string s1;
1 p5 W* U) v9 }/ z    while(cin>>s1)
2 \7 X& s+ {) e4 i1 o) v    {/ i, m+ J$ ~9 ]* _+ c; v7 E
        istrstream isin(s1.data());
8 F( D8 p8 d- P& I: T! ?        double d;
% r% R" y( m) B' }2 U2 n9 q3 K        if(fy_Exp::GetExpValue(isin, d))
( ~, S% y# q/ P+ t6 m' {5 i        {5 G' v6 m, X1 d3 d/ O4 Y4 A
            cout<<d<<endl;" }8 `* P$ A$ z% B
        }2 s5 E- s- _* F; s
        else
. \% T3 J7 k: D4 @+ Y        {) Y3 F% B. t3 @( b
            cout<<"ERROR"<<endl;* {+ T0 ?- @0 _# }' N! a
        }6 p, X! R$ q9 R4 c& [( d# T
    }, a# q7 S* l# \6 e6 h2 W1 d' Y
    return 0;1 A5 H+ h( z) u+ n* ~/ Q( M
}4 Y& O8 \$ w; l7 ]; Q/ u0 t& N' L
+ {5 }# Y3 L& k$ V' j
% _5 O2 _( ]% R4 e0 C
然后编译执行就可以了(*^_^*)2 i* Z2 b0 G' X) W
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
2 X" D9 x1 P' `! z6 H9 r      建议使用VC7或VC更高版本,或者使用GNU C++编译

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