获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,: W  S* _5 g5 g) R" \
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 W9 w& y9 g# t; o只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. O' b$ a: z, {1 K8 i) n参数解释:3 B5 W2 o" N, r9 [# k  ?
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流: A6 }, b. G% Q; m0 X" n
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 Y$ @) J0 Z9 l+ B* j
返回值:& E: `) Q1 W; r$ B0 Y
返回非0表示计算成功,0表示计算失败有错误
" ]4 @1 _' j& y) H8 \; r8 N/ V) G. \! J- d# u/ Y4 F
. x" O/ l! }3 Y% n& z4 E
9 g: m4 X- Y. p# f) C& j7 P+ _
程序代码:
* Y: ]0 U3 i$ ~7 Y. M1 y* N* O  A! m" d
namespace fy_Exp{
* Q: l- F* E$ Z) rnamespace {template <class _T>
+ T6 |4 \, c0 C) L1 Minline _T GetExpValue(_T t[], char& csym){3 k- N! R, T$ j; P8 u# w
    char c=csym; csym=0;+ s* v6 B$ M( p; J* K; G
    switch(c){
' O+ Z3 j9 |. i8 L$ A    case '+':return t[0] += t[1];
& \0 _! \* `( D5 x    case '-':return t[0] -= t[1];
8 A* j5 ]9 K" Q; c    case '*':return t[0] *= t[1];
! f1 G8 h, ^( L0 A& ~0 p    default: return t[0] /= t[1];//case '/':, U% g# y3 h4 k
    }
% z! p* l' O+ m7 T) J}}2 I5 Y4 y' y& f. p* t
template <class _T, class _Tstream>
2 I1 C8 }2 y4 k* R; N3 r  o/* _Tstream: inputstream, _T: get return value9 i; [/ y) v% c$ A8 n/ z6 A) t
* Return nonzero if get value successfully */. E: F4 N! B! A( J+ a
int GetExpValue(_Tstream& istrin, _T& nReturn){6 K0 X6 L6 {- I5 l5 M$ a
    _T t[3] = {0}; //雨中飞燕之作
' N5 c  b1 _2 S" e' N, g8 @    char csym[3] = "++";
5 U0 L/ Y; h5 \0 e    int nLevel = 1, nERR = 0;! S& ]2 ?- O( Z# s0 q7 \$ x
    if(!(istrin>>t[1]))istrin.clear();' o3 Z) [8 v' w% w) ?
    for(;;){8 ~- k- }9 X* i- L/ }: s
        if(istrin>>csym[2]){. ]: _" h. x! |0 F, H
            switch(csym[2]){2 @& q4 s) {. v
            case '(':: o" O( R$ O! \# g2 H
                if(!csym[1]){nLevel=0x100; nERR=1;}else8 t. W* q, J$ ?$ [" @
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
4 f' T, k7 K+ a* v- ^$ ]$ c                else{nLevel=0x100; nERR=1;}
- t  _, b7 e' L. M# w2 W9 r" X                break;& W+ _' [/ @( ]6 H+ [
            case ')':9 c' C3 b/ h/ S4 u
                {nLevel = 0x100;}break;6 N8 d- R/ G" C  c3 A8 @* u  c
            case '+':case '-':case '*':case '/':
  t8 M" Y& X! n  w                {csym[nLevel++] = csym[2];}break;+ ~" P/ W+ z4 ^+ J& A2 L9 b
            case ' ':case '\r':case '\n':case '\t':continue;3 s) I" n" u" j5 B
            default:
0 x. m# a( L6 _6 h- Q+ k$ t6 p                {nLevel=0x100; nERR=1;}
" l8 p% L  w3 i. H: g3 R            }
. F  [: I: U4 C0 H5 a% c            if(nLevel==0x100)break;- Q) T4 g5 z: B) v% p* e6 ?7 w- g
            if(nLevel&0x10 || istrin>>t[2]){# O$ k' p2 F( ^; R
                nLevel &= 0xF;. A3 q: M& _/ E7 r3 U1 V
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 i: c  D# A4 l) r/ A% O                if(csym[1]=='*'||csym[1]=='/'){- }6 }6 q# c# \' V8 r3 }
                    GetExpValue(t+1, csym[1]);
% m/ W% n4 n, \- l/ h9 O! x                }' V" C+ Y5 z  ^( X
                else{. i4 U/ B5 x! q% S. Q& F3 E, S9 R, ~
                    GetExpValue(t, csym[0]);. w7 T0 m* x3 ~3 ~% l9 K. D
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 }" L% ~, X8 f+ k/ k9 A/ }                }
- T: f% F$ u3 ?) R) r$ T                nLevel = 1;
- X! `+ P+ K8 _- U) `) q            }9 i6 @# b% {$ `: D; v; a# e9 V
            else istrin.clear();" s" Z/ U5 n. X6 x
        }
6 I6 T: x! `6 S  h        else{nERR = -1; break;}9 _5 m6 H) @: @$ p( [; a
    }: Y( j4 H2 S' B$ m# L" I$ E
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( Q0 x) o/ e8 H% M: V    else nReturn=GetExpValue(t, csym[0]);$ }3 G: H! e+ p* U
    return nERR==-1?1:0;9 }' y. y1 \$ f9 f) i
}}
% G" ?) B$ W& R+ `3 ?! h0 I% ?2 v" H2 ^8 I" o
( J1 e$ W( q( V1 R3 x/ b

  Z8 n( |3 B+ L% }1 }函数模板使用示例:2 a- i2 J. c& u# n0 e% \
在以上那段代码的后面加上以下代码:
1 Z8 h) Y% L  t
- w! k( \, t9 v  P 1 {. L5 b/ G  `( {' r) w8 z* a

7 P: J" p2 ]& Q# R4 m/ \0 n2 n程序代码:   k7 I, Z0 u- V9 s; u# g) ~. L

' O2 E/ Y7 K. O+ s. P' M#include<strstream>% B2 D) ]; W5 T* M. B
#include<iostream>9 b+ V. p7 |+ n7 s" n) o6 m
#include<string>
) t* |! P6 e: W8 Z/ i1 ousing namespace std;
, [) }9 X% `) E4 l+ wint main(void)
' E6 l* j0 v% b5 c1 q{' D  w4 x8 [) Q" o2 u! \, w
    string s1;4 h4 S" i/ I% {8 F  z  w
    while(cin>>s1)
6 c! b: Q: P. j$ a' b0 y    {
! x" }9 h# P( T# W7 g        istrstream isin(s1.data());
0 s0 T1 |# O; A9 i5 D        double d;
$ p" O' U% w( P( j        if(fy_Exp::GetExpValue(isin, d))
) ?: Z$ g6 z  f8 |6 z# R        {
( ~9 c6 [" l2 g( G6 p# s            cout<<d<<endl;
8 V9 O1 v' f" c! x- y4 z+ @        }) E: j1 w' ]/ j5 C
        else
* s1 S" y. f8 ?6 ?% Z        {
5 F. I. F' M# q" D            cout<<"ERROR"<<endl;
8 b" ], w% [0 [6 ~1 G0 b" D        }. i3 i, m* Z7 z2 z/ F
    }
8 [0 p0 J* H% x8 M  i+ J    return 0;
8 d7 @+ C( G$ M! z4 R# Z4 H}5 t" x( i6 E0 e& V7 q

' {- |5 d3 ]( x* o. j
8 x" S+ @7 F, I4 W. [然后编译执行就可以了(*^_^*)
0 n- O. _" H, W: O0 r其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 H0 `4 M/ I: f0 x; C      建议使用VC7或VC更高版本,或者使用GNU C++编译

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