返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
9 V" S/ f% m5 u一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" _) {: j3 r) q; J. K
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 I' N4 w2 _0 r1 ^2 y参数解释:) V% N' g/ s) p& i) T
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" \  H: l; M1 F8 enReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
5 N. V0 ]/ |* B' M) F) d4 ]% ?返回值:$ |0 G( p. F1 e  b0 h' k
返回非0表示计算成功,0表示计算失败有错误
5 R1 E. b4 B6 @6 \& T- `# ?
9 n# c2 ?/ |# x% R3 o/ C! u% h: N % H6 f$ F" r2 B1 K

5 `0 |2 d/ m1 e6 @程序代码: 6 N& {: B8 x8 M, M/ N' Y! Q, R* l

9 H) N# i. q% y- C$ c7 h& _namespace fy_Exp{
3 z, g. J3 T% t% m  ~namespace {template <class _T>. H+ N: }2 l- ^6 ^% _( }
inline _T GetExpValue(_T t[], char& csym){: C) S% [3 }2 f+ w9 A# C. k
    char c=csym; csym=0;
' b9 @2 Y4 B) h) u    switch(c){
" r) Q6 O" ^& B1 k& `, o' n    case '+':return t[0] += t[1];- p8 _9 b* g. m, D5 _. \
    case '-':return t[0] -= t[1];2 r5 ]; f: L; }2 _* j' `/ j+ ^/ c
    case '*':return t[0] *= t[1];
* a& n! Q8 m( o, F% ?9 L    default: return t[0] /= t[1];//case '/':
+ `0 r) l+ W  q, _    }) S0 _1 \9 ]' q2 R+ F" Q
}}+ P* w4 G4 a4 l; ?7 Q1 }3 |
template <class _T, class _Tstream>
! t' ~  u! w0 y, v( o4 E/* _Tstream: inputstream, _T: get return value
% m: t% d  {! X* Return nonzero if get value successfully */4 I( L5 X4 R# C  q
int GetExpValue(_Tstream& istrin, _T& nReturn){. Y: }* E$ o0 G2 h
    _T t[3] = {0}; //雨中飞燕之作
4 O: q3 e: N( S; W0 q    char csym[3] = "++";- Y8 k5 s3 H1 H; \7 O% Q0 R/ m4 D
    int nLevel = 1, nERR = 0;* f- u% O9 Z- T$ U& v
    if(!(istrin>>t[1]))istrin.clear();+ m$ P4 D2 m/ H$ N  w$ X) j& Q5 y
    for(;;){/ k6 R' P. F7 A: {& Y
        if(istrin>>csym[2]){4 v5 v6 t1 H$ U- v# ~
            switch(csym[2]){$ K  Q* d! [! H# x4 z: B' |
            case '(':
* _7 f* l( _% g" F- \- m                if(!csym[1]){nLevel=0x100; nERR=1;}else2 L/ S/ _! b! M5 l$ V$ }8 v
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 R& |, C7 J2 g5 N                else{nLevel=0x100; nERR=1;}2 _" Y  y1 f( k
                break;% V  z6 R$ Q7 V, _
            case ')':
8 f3 y0 r; q/ F  H' s                {nLevel = 0x100;}break;" N& d! a1 P+ u4 T, M- k
            case '+':case '-':case '*':case '/':
3 K; a. Z( Z5 s+ h! D; S: v: T                {csym[nLevel++] = csym[2];}break;
$ r5 a$ F! r- _' ^            case ' ':case '\r':case '\n':case '\t':continue;
; u- z" h# m- u& C4 x            default:
' W( y% b6 M3 Y7 P" ?3 K/ g) L                {nLevel=0x100; nERR=1;}
/ o! s2 ]# Y7 V, v            }: |! T1 i3 Y& y  I& E  {
            if(nLevel==0x100)break;
' X' ^5 N3 Q0 J5 d            if(nLevel&0x10 || istrin>>t[2]){; `4 p6 A4 p2 {" m0 z( Q% v& r$ l
                nLevel &= 0xF;* [) o1 X% {$ G- f
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 [7 ^( x) I) |  p( M" E                if(csym[1]=='*'||csym[1]=='/'){3 [# a! |: K5 W; v6 m( U$ v
                    GetExpValue(t+1, csym[1]);
! G! j! ]! X3 g( e3 ]& j                }
2 S# q" l  d; ?3 E. _% ?                else{* Y7 _0 b  A& |
                    GetExpValue(t, csym[0]);
5 z0 |3 p* k8 ~& X2 M/ K                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 V! h- f, L; j  u7 R5 z2 l
                }
6 w# `0 Q5 Z* {                nLevel = 1;* A2 ^9 b% b# a2 Y6 L" ?
            }& m, q' D  k" @1 w# K5 c
            else istrin.clear();
' x, Z2 \: V$ V+ I) P/ h" d0 l) J        }
8 f9 r+ |, q) [4 ?( o  P2 D        else{nERR = -1; break;}
! F4 d  b7 C7 n% Y1 K8 C* u  B& X    }
: I% @0 j" v9 N" K  k    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 z6 j5 `/ k/ ?7 i, [, n    else nReturn=GetExpValue(t, csym[0]);9 D  R/ o8 b1 |
    return nERR==-1?1:0;, h6 H  a% H2 R
}}0 z" h& p) h4 Z2 D

4 C+ S- H0 Z( {" D) a& o% T) r, t; z! x* N# i3 w: Q( H9 v
+ o* u. C) j" `0 f6 D5 `
函数模板使用示例:7 P' w; @" ~; f6 P  r+ u
在以上那段代码的后面加上以下代码:( c8 |% Y( l: X1 P( D8 |

0 X/ q  j5 p+ A* T! V2 J: ^9 V: U* V
$ R: p& G2 k* |8 k' u
: q6 B: t0 |3 n0 k- w& `程序代码: 9 c/ C: z+ L1 S9 l* k( Q4 L' [

: D1 W' i0 f' G% `5 Z# v8 l: @#include<strstream>2 b4 e* i- \) g$ X  }1 h( |
#include<iostream>, P1 {3 P) ?5 ]  w
#include<string>6 Y  Z- t7 Q3 P5 b/ `  v+ z8 a3 x
using namespace std;
" k9 k8 K8 b/ i) ?6 ^% ^; W' Nint main(void)
/ n  t  C3 f9 o# |{' \# R5 o4 j4 s5 ^
    string s1;  T' F4 [, T( |6 r" Y
    while(cin>>s1)
. O$ `+ A: g) V; l    {
8 Z8 M( ~% u8 F, i/ {! F5 N! d- R        istrstream isin(s1.data());  s8 |4 b* X+ A+ y7 k5 X
        double d;! ^' o( y1 P1 z: v8 y9 o
        if(fy_Exp::GetExpValue(isin, d))
* l* {& |3 |; n. ^        {
" a9 Q: z! ^; l$ |3 ^% c: V            cout<<d<<endl;
& j; M# Z; F$ _) u. k        }
" ?  N* ^* B, `        else, A! b0 ?% \7 B  F% \7 A  I; `
        {' w+ Z+ n& j  x" I) @7 H
            cout<<"ERROR"<<endl;
7 S' A7 U9 \" X. ]- m        }) ^. K. q7 _) y4 I6 y
    }
- v3 Y0 c6 c4 ^* d3 K! T    return 0;9 r/ E/ G6 ?5 x9 S
}
% a8 H7 q7 Q- Y7 M; L1 T& c" Y4 N) A$ e

1 l! p+ u3 f8 @- ?然后编译执行就可以了(*^_^*)
  X- R- e0 |" O3 e3 R其它:TC++上一定编译错误,不保证在VC6上也能通过编译
, l! Y% V: n! w" c1 M      建议使用VC7或VC更高版本,或者使用GNU C++编译

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