返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,; V/ g  w/ P8 y' y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式% v' W$ `& r8 h1 @& F( K
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' i. y' c7 [2 d- W参数解释:- z+ D  ~3 F/ l/ `7 \
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 G: ~2 V. ~! B# T
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 @7 N* T7 S, H$ J返回值:
8 D: u3 r; `  ?+ o+ U7 ?4 M4 i返回非0表示计算成功,0表示计算失败有错误
/ X. B! ?6 U5 q& w2 I2 s
3 X6 A7 `( P8 I) m' [ 0 V# _/ ]/ |- D% X" P
6 g! `% b% a% r/ n
程序代码:
3 J1 b$ u, R, F3 }: z8 B, s2 m
! P8 H% B" T" f' ^2 V! _( Pnamespace fy_Exp{
- _& [8 w7 V& b/ k) D& j; ?. \9 unamespace {template <class _T>
8 e5 I; p& Q6 _# V8 Tinline _T GetExpValue(_T t[], char& csym){+ W3 b! u6 M4 w# O; A9 h) y
    char c=csym; csym=0;
( B; K9 ^( w, T4 m& L    switch(c){2 o& E9 d2 g5 n) s! b/ _
    case '+':return t[0] += t[1];
$ D/ P1 t" d; F. _9 _, }    case '-':return t[0] -= t[1];  P% e4 M0 k! B% B$ T; ~3 |8 q
    case '*':return t[0] *= t[1];
+ q# h! A4 c0 a3 v% V' w6 X    default: return t[0] /= t[1];//case '/':
! [8 y! F$ j- ^  _. r) v* T    }% e, b0 W/ s( _2 b- B& d$ h( q
}}* \/ k( ?" A5 J! @2 l* `
template <class _T, class _Tstream>
* L# N. f2 v% o5 e1 W6 R( l0 f/* _Tstream: inputstream, _T: get return value
* A) j4 q8 c) x* Y* Return nonzero if get value successfully */
7 _  P5 d' ^. s, F0 gint GetExpValue(_Tstream& istrin, _T& nReturn){
5 x- Q- t: e* I  }# w) l    _T t[3] = {0}; //雨中飞燕之作: K3 O$ @! P7 A
    char csym[3] = "++";# R+ f" [+ a8 c$ i) R
    int nLevel = 1, nERR = 0;" Y* p7 v1 ?  t9 b  s: {( b; v0 K
    if(!(istrin>>t[1]))istrin.clear();
$ F# a" P& O. ?; b! m* [    for(;;){0 F5 \+ H4 B0 q3 n
        if(istrin>>csym[2]){
0 P+ p- \% \, v& y) r/ B            switch(csym[2]){- l# q! T  p. {, a
            case '(':
  b0 Q7 d' [8 v$ [3 x! [; @                if(!csym[1]){nLevel=0x100; nERR=1;}else4 W2 ]. H  K7 W# X* F2 z3 C
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 \" r8 g& I6 H. S+ \( h" U$ H1 m
                else{nLevel=0x100; nERR=1;}
9 Y. e3 l* }- |9 }( t& w. k$ K                break;
$ V+ `( l# c2 z  C4 y            case ')':; G/ {% d# k& i- A. Y
                {nLevel = 0x100;}break;) s3 \4 ~; v2 u# {  u( ?# `; v
            case '+':case '-':case '*':case '/':
5 c$ x' s1 p- ?3 \; ]! k3 B; N                {csym[nLevel++] = csym[2];}break;
4 U+ o; t2 |4 n( _3 n3 @. B            case ' ':case '\r':case '\n':case '\t':continue;
' u7 {/ @8 N1 g  l$ ~            default:
5 R5 ]! a; j2 y* r" E                {nLevel=0x100; nERR=1;}. j2 E( p. T, n/ G" D
            }. w8 o' b8 l3 A' S$ A. A
            if(nLevel==0x100)break;
' a) X" X; Q5 Q: a8 E4 ^            if(nLevel&0x10 || istrin>>t[2]){
+ P" T' p1 L0 B+ x: y; v                nLevel &= 0xF;
* Q- `7 ^/ y6 l/ F) w                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 W1 }0 j) H8 L: t4 a2 z
                if(csym[1]=='*'||csym[1]=='/'){
$ q- \# R( i* g  K; l/ j                    GetExpValue(t+1, csym[1]);3 q3 G" d, |  D. y" t2 i8 c9 p( e7 \
                }
6 G) E& \  [( K% f5 O- t( \( @                else{4 }! M/ H. r9 Y
                    GetExpValue(t, csym[0]);
6 f* n7 `: D# A% s% i8 V                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
- Y: a/ a  z$ ^' ^                }
( S3 n4 Q- v, H& o* D- D2 K& Z                nLevel = 1;! O. W) ]  O3 S  v( O
            }
! q9 q5 f  l( @* M( K( Z" i            else istrin.clear();- f+ [. Y# y6 p
        }
# f* g0 E: P4 O3 f2 b" U3 k        else{nERR = -1; break;}" ~* q* b7 g( H
    }9 B" A3 p3 n0 \5 A1 r+ d8 p
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 d7 L+ v3 \% b/ C, t' A7 g
    else nReturn=GetExpValue(t, csym[0]);
1 l& Z) c9 m# ^; f$ V    return nERR==-1?1:0;
+ m# ^7 L  F: B8 `8 X8 P}}
& o. Y7 ^) ~2 |% E- w" h4 [3 K% @$ w  q& k; A$ [
0 [4 f+ O2 j; Y& v# h0 e$ S

( m5 M4 r3 M* G4 T: I( w: t' K函数模板使用示例:; e' i& H+ l6 x/ p; H: U
在以上那段代码的后面加上以下代码:( U% y+ A8 _% I3 C# h! |
# k6 }6 \9 L9 T8 _9 t! B
$ l/ w" k' i. y

( @1 z- m. W8 }/ \& |程序代码: 1 H' O9 M/ X3 q9 E+ C- t/ k
" P* V7 x( \9 z# I8 a
#include<strstream>8 G; t6 P$ z: i- d
#include<iostream>
: V+ y/ E% U/ v. u& b#include<string>1 G* a/ L7 ^! L. d
using namespace std;
9 s) b8 B3 }! O$ p: @int main(void)/ X8 P$ L- {7 y4 E
{- M: ~) b  x. g& s& q- A3 m! K
    string s1;* D; U0 z/ ~" _  D* D
    while(cin>>s1)+ }' U  q! ?2 Q( B. x
    {
6 z3 R) q( @& b        istrstream isin(s1.data());
& b5 H+ B" e# q1 a8 d; W        double d;
) B: ^% V3 B: @& x! p# c        if(fy_Exp::GetExpValue(isin, d))
7 N. a8 G: j( u" m- a        {) I: w+ l( X2 i
            cout<<d<<endl;
* Q1 n9 Z6 x7 B1 W; O. h        }
$ T' }  m% }" i! z        else. h- R$ p7 {7 Z/ o: L. {! z4 [
        {
: v: p3 m* n- H* F: i            cout<<"ERROR"<<endl;
8 s9 N' a7 {# l        }% F. H1 n5 g5 U( M& J% K  b6 Y3 J
    }0 `6 d9 V# l* P: i% z- ^
    return 0;
: M% c( d  ?/ j4 ^- \& I- I}" b; d$ K" m# \5 C. m; m3 d! W) B* K
; E2 l- M7 F* x5 M: E2 e. Z

  {: w7 s2 L9 k3 [然后编译执行就可以了(*^_^*)* K0 Q3 \6 N; B- v( x
其它:TC++上一定编译错误,不保证在VC6上也能通过编译. U5 m8 _) c, B" [" B! @
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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