返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,( {& R9 J, g" ?6 d& f4 y$ G: i; c
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ Y' W5 R( D; Q( R5 O, w/ O
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): Y6 n% O" ]  M9 Z- `, K6 ^; b9 y* ~
参数解释:( t$ ?4 F$ q' a9 h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流: f2 a4 B- x( H& d/ E
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) V+ `' z. N5 S7 k' x6 H1 G. Y1 C
返回值:
6 u" V+ j2 \0 V/ y" x2 |返回非0表示计算成功,0表示计算失败有错误* J" O1 W/ P- t- J. c' \; a

$ p6 M) F8 A& @$ B+ u9 W & t. y% M' M+ Q. l9 f; @) M

, n2 y9 d! V6 w/ K& _程序代码: , N( C7 v, q" A- G9 }

& C) q9 r3 _, W+ Y( C: h9 Tnamespace fy_Exp{3 k/ x- A( l* V9 l, F$ \0 P$ k
namespace {template <class _T>9 Z- O9 o) I0 K
inline _T GetExpValue(_T t[], char& csym){: K0 r! T7 n( M
    char c=csym; csym=0;6 j( |/ t2 P0 {9 J
    switch(c){
' a0 z4 L% s1 z& o! I4 b, o) u    case '+':return t[0] += t[1];8 `6 T6 J" F+ p) A
    case '-':return t[0] -= t[1];3 ~$ J7 ~+ }+ ~$ p4 O
    case '*':return t[0] *= t[1];
$ h* G1 d4 H" W# ]% e; a    default: return t[0] /= t[1];//case '/':% g/ l6 J- Z# d" z3 F
    }
+ ~! f! S# ?9 s3 {' o}}
  f8 p5 f; t( X3 _7 i+ ftemplate <class _T, class _Tstream>1 E/ d- g- }& V) N" L. j
/* _Tstream: inputstream, _T: get return value! A  c+ A; C/ V' Z; E# C  K
* Return nonzero if get value successfully */1 \/ v1 T% ~/ F
int GetExpValue(_Tstream& istrin, _T& nReturn){' Q- V7 g; ~9 v7 C
    _T t[3] = {0}; //雨中飞燕之作! {+ h8 b' Y6 B, Z6 I- a6 @
    char csym[3] = "++";
1 {/ O9 H, q6 c( b* L1 z    int nLevel = 1, nERR = 0;
6 u- \/ @9 ?7 Z' b! D2 _. D    if(!(istrin>>t[1]))istrin.clear();2 B, C  u1 _( a# K8 Z3 t( h/ y
    for(;;){% Q, U$ g- E7 f
        if(istrin>>csym[2]){+ u# A" j$ W  |# `5 ?
            switch(csym[2]){
5 v& \+ i9 H1 W$ Q2 T! B            case '(':  r/ d+ J# |" v7 x  L6 }
                if(!csym[1]){nLevel=0x100; nERR=1;}else. A# O8 Y/ o# W5 q: N  F: i
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
1 a8 k+ o: @. T2 M  Y                else{nLevel=0x100; nERR=1;}! ?& L) j: Y0 A! B( H* Q+ D' [& B
                break;
/ h0 y" e0 o$ z/ X: c; d9 v            case ')':. v7 c9 z: D4 K1 B. P. g$ t8 \. R' B
                {nLevel = 0x100;}break;+ i% Z7 _* D1 }# f, k/ X3 J
            case '+':case '-':case '*':case '/':) o( r& ?* l: a7 d3 g+ Z' u
                {csym[nLevel++] = csym[2];}break;
3 T, f/ M( z$ b. \3 l& F1 ?            case ' ':case '\r':case '\n':case '\t':continue;
. Z5 C5 C9 _& M3 u* p2 `7 n            default:( H1 _% a/ b; T: U+ [
                {nLevel=0x100; nERR=1;}
2 t7 l; K3 E& }2 ]6 o# a4 y6 C            }2 X0 {7 H: r3 n& ~- S& v" C
            if(nLevel==0x100)break;
5 g7 }4 Q, H& P            if(nLevel&0x10 || istrin>>t[2]){) B" G/ x* c) ^; O
                nLevel &= 0xF;
2 u& |+ Q! C: ~( d! C( Z, `                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. s; ~2 t' I2 e# x. n- ]                if(csym[1]=='*'||csym[1]=='/'){; R9 f8 x% z- n  j
                    GetExpValue(t+1, csym[1]);
5 _1 o$ S9 @2 d4 H  j+ h# |                }
% S$ K' z0 I& ^+ h2 a                else{
9 ]/ h* a) s) C6 {: V                    GetExpValue(t, csym[0]);
; |1 s* O& P# d1 r/ [$ x                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
2 U$ Y3 y  j0 ]                }! ^' ~2 o3 g: }/ Q
                nLevel = 1;
4 X% [' s6 O* W% M            }
+ h; Z( r( F; U( w& Y  @            else istrin.clear();* G# J8 K& I) ]- \; K' g& e& L) i
        }
+ `" h* O+ u1 a! ^        else{nERR = -1; break;}
2 `; ]4 ^+ f/ J! @+ d    }9 G+ X, A9 h2 d, }
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. n7 P6 x! X7 B4 H0 ?    else nReturn=GetExpValue(t, csym[0]);
5 n! I2 q9 U! {    return nERR==-1?1:0;- Z+ w* x1 v% ?$ v7 T+ J, \
}}
  ~8 D& h1 E# E" y6 L$ S
5 c# B" p9 G4 k/ N3 e8 o
! b" L- Z6 ~# z1 @: K/ {5 Z) T! D) c/ [$ J# o
函数模板使用示例:
% n" a3 I( A' m0 K1 e6 Y在以上那段代码的后面加上以下代码:
9 h! a$ x! I; y- H+ G
4 y( n# A" o& {' H7 Y
7 f# B& M# O& u  N4 \+ t, ?! \; P" q! T' j4 j
程序代码: ' ^& Q( g/ Q- _
- Q! w& Q) }0 \' E7 H* s) d1 N1 w$ U
#include<strstream>4 p8 H% L+ y4 P( w. k
#include<iostream>
, S$ j: \; g! K$ O/ X* W#include<string>
8 ?% J8 L- L; U% b# eusing namespace std;
9 I. O$ Z( _9 |int main(void)
. m' U' s5 E( i3 _{7 x4 q& i" ^, |7 g0 i+ }
    string s1;
$ x( G9 O! L4 s# g1 F% a0 p( O1 m    while(cin>>s1)2 [& W. w8 ]9 K, e5 B0 K  J
    {( m/ d7 [# N7 g+ t
        istrstream isin(s1.data());: w3 b9 X1 X6 H6 V; T
        double d;3 Y* w! W4 F1 V+ ^! o
        if(fy_Exp::GetExpValue(isin, d))
5 Q! |. P" u! Z* d- c        {: `; W2 e* ^$ X) {7 L
            cout<<d<<endl;" t4 K. K, `6 @' ]* x
        }
1 X# T: O: w+ Q( o        else
* h% a, O7 f( \        {
( `5 @3 Y% E$ n( {            cout<<"ERROR"<<endl;
) w6 V0 {& ]! f; E2 n' G        }
) J# R1 L8 `9 [- _) n9 w    }
. ^' c# t$ M: m' i6 o    return 0;3 O! e7 U* ?4 }: f+ V
}/ G- u4 G5 k( C, F: d% v. C
, d9 H0 e3 F. F) N% j" `3 L

9 m; s& h) _8 _6 U$ i然后编译执行就可以了(*^_^*)
- \: g- N1 ]& v: `其它:TC++上一定编译错误,不保证在VC6上也能通过编译" D! S) w2 L( m' ?+ `( |
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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