返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
+ ~' D/ {" b) z: g( I6 Y* a: W一个很方便的函数模板,可以并且只可以计算含括号的四则表达式( Q1 n3 Z5 U8 l: I  H
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
; L! N1 t7 ?& [' E0 t- g$ h参数解释:
9 U! U* [5 @/ Z4 `istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
, w1 {! E3 @2 LnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定! V' r  `3 i' o, ^4 H4 n
返回值:
- o& H$ p" k9 q4 ~" K* Q0 [+ f+ }返回非0表示计算成功,0表示计算失败有错误: J4 V: K8 j' M% r

3 Z& {& {- Z$ g2 c) H 0 v) I  p+ S% F: q

7 u% V* }; i% x+ R% s# j2 \程序代码:
- Q  a8 ]5 Q8 o
" J( J& j! u  f- znamespace fy_Exp{0 T4 G( [% H# G4 \6 z* T; @1 P
namespace {template <class _T>
% a* ?! \5 H6 J2 q7 r) Sinline _T GetExpValue(_T t[], char& csym){6 Z% X1 z) S5 a8 \- x, t* t$ u* R
    char c=csym; csym=0;
$ L4 w! c( _- Z& H    switch(c){
6 A# t# m, d4 W2 J; y4 R    case '+':return t[0] += t[1];% \8 j+ m" q4 j9 B- [
    case '-':return t[0] -= t[1];1 |0 T4 M0 f0 A6 z9 O
    case '*':return t[0] *= t[1];" a0 S, P  f; t9 g
    default: return t[0] /= t[1];//case '/':
1 [; t- K$ u8 }/ ]: i5 L$ ^" u) h6 C    }4 m# Y* |+ L5 g3 E5 y
}}
9 |8 Y. {; F* s0 b( v' ]template <class _T, class _Tstream>
" d" o1 O$ l/ g" A- j. ?. [/* _Tstream: inputstream, _T: get return value
6 h5 q3 e5 j* K- b# \* Return nonzero if get value successfully */# n; `# i. U7 x% {  [  q( \3 T; |& a
int GetExpValue(_Tstream& istrin, _T& nReturn){
. k3 U% `. @3 v    _T t[3] = {0}; //雨中飞燕之作
' m! Z+ l& i5 G8 y- K    char csym[3] = "++";
( r7 P! k! I3 p# W# U    int nLevel = 1, nERR = 0;/ g6 d; K. e' Y% L
    if(!(istrin>>t[1]))istrin.clear();) E  K% \3 e; b) p2 K% h
    for(;;){- i! F* L# e8 r: m7 s
        if(istrin>>csym[2]){3 n$ @% v8 g/ |
            switch(csym[2]){
" N. ]7 g/ R( p2 i/ k            case '(':& ^& ^; V9 _& O" m
                if(!csym[1]){nLevel=0x100; nERR=1;}else
3 G# d# B; h8 a  @+ ~+ O                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
; D$ n, K0 R  S. B+ u# \) X                else{nLevel=0x100; nERR=1;}
+ R; u5 L; V" @" e                break;
+ ~4 g( m5 b# E- T  h4 a2 ~+ }" E            case ')':5 D+ e& m7 l5 B) v4 j
                {nLevel = 0x100;}break;3 J6 z: B7 D5 i" e6 H
            case '+':case '-':case '*':case '/':
( U* r: {5 B4 @3 j                {csym[nLevel++] = csym[2];}break;
, i; A) q3 H: D: |            case ' ':case '\r':case '\n':case '\t':continue;
; Q5 M5 ^# S- h0 K            default:
3 v. M# z2 ]* W6 Q% i- w* G                {nLevel=0x100; nERR=1;}  q. c. n3 u% W. d2 v  S9 s' ^$ f
            }
! u. M; s* Y( X1 ~. W            if(nLevel==0x100)break;/ ^& m9 _3 q4 K
            if(nLevel&0x10 || istrin>>t[2]){4 j" q- M$ r( W2 j  m2 J* z( F
                nLevel &= 0xF;  ^; B, S* |* r
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! I6 S. Y+ T7 ~
                if(csym[1]=='*'||csym[1]=='/'){. p( ~0 G9 A5 o* }+ E% N$ Y
                    GetExpValue(t+1, csym[1]);: Q% `5 u/ p( F9 ~; C- `) c
                }& N( l0 `9 W; A1 A
                else{
2 v0 W8 z- h! M                    GetExpValue(t, csym[0]);
$ ]+ R) c% r, s4 O                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;9 g: X7 c, G. m
                }
  i& l- L  o- B                nLevel = 1;
9 V5 k0 x/ O, @5 L% k3 f2 y# K            }; A3 i: y8 ^: O! M  t2 a
            else istrin.clear();
; Z& K+ D9 T8 I& L) ]        }% O( {. E5 E5 t% x  O
        else{nERR = -1; break;}
$ K1 x' A. q: M9 X5 Y5 R) J, O    }0 [& Z/ E5 |/ z# p: O) x  V# M$ [5 c
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 h- h, R9 G. j$ R. [/ i$ S
    else nReturn=GetExpValue(t, csym[0]);# i$ Z5 s+ r$ x" M- z% p
    return nERR==-1?1:0;8 X! i- A3 l; L6 m3 W0 u& \
}}  y/ ~- u: L. j0 J% @
5 Y; z) Y* g) \0 S( [

- z4 o& W" m- A7 ]' V+ h# `. @4 ^! C  ]3 p& Q. t
函数模板使用示例:
' a% \5 w% M& N; L  C+ O, Y在以上那段代码的后面加上以下代码:# m+ b5 @  f9 h1 q, G$ x6 s$ u
: `' o6 k+ `  d, `1 R1 o

0 j& U" r6 s3 U% X. \' G6 T; a2 j" O* b, j2 ^' E* i
程序代码: 0 h/ E0 g4 h+ H/ e, h
4 {: h" ]4 v, j2 }
#include<strstream>
' ?" W, g3 k& Q2 }9 x7 a#include<iostream>
. k- P4 ]8 ~2 x/ C, d#include<string>4 }$ H3 E' y* {5 i
using namespace std;
7 M+ A/ i0 A$ Q  Uint main(void)6 d, l4 y+ F" G1 I# x" d; t. X3 m
{% f3 y* Q7 L$ w
    string s1;7 B; k3 [5 k9 D9 M: G8 ?
    while(cin>>s1)! L' R& e$ G( p" t) K
    {% m" G' t) K! z" S* A; W" R! j3 _
        istrstream isin(s1.data());; M8 h/ M& \5 I% @- u3 w
        double d;
. x- ?+ w" F2 |) E& H5 D# T3 H7 ?& M$ e        if(fy_Exp::GetExpValue(isin, d))' X7 Z1 I& p: N1 P! `
        {
+ b) L% P' R  `7 n) r            cout<<d<<endl;
, N1 |0 [7 ~0 s! B: @* I6 J        }
- v0 Q. D6 K& B9 N! ~        else0 H/ A' R8 Z* W/ Q. E1 f" ~
        {7 e# [* b3 I: a& I
            cout<<"ERROR"<<endl;% e6 ^3 J/ E, J+ T6 Q$ h
        }
3 i" b. e2 q: \3 Y2 A( v- T  `    }4 D" a, N- o; d5 [& u6 m
    return 0;3 j9 q2 m! @- ^. E( o$ q
}. C+ f: Z) S2 W! h- s) Y
; g' o4 x5 w; s5 f. g  d

. i' b" C' C0 }# S% O& m/ B- t然后编译执行就可以了(*^_^*)1 h8 s6 l1 b1 N: L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译* ~0 l$ b* E  r1 k
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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