返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,2 o: x/ Q8 A) A
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 C) b% Y% r  ]只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ f- G, s4 D! Q/ c/ O参数解释:! X) I% n& t4 t+ s
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
% ~8 u$ G- S! Z) L, xnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定  N. I) m$ i4 L. i- _% D3 T0 T$ B
返回值:8 k# k8 l/ }9 }7 ]1 p
返回非0表示计算成功,0表示计算失败有错误" }( [9 T' G  ]% x
! ], z' T3 P4 e1 ~* H
# ]% @; v) d% {
9 Z: e: p3 }  a
程序代码: ; @3 l  n. P1 {( l

- z5 V& B/ `5 D% N3 }  Mnamespace fy_Exp{
; r4 r2 t" A* b& s. snamespace {template <class _T>0 g5 v6 N: ?* b. M" g9 ~9 j
inline _T GetExpValue(_T t[], char& csym){/ ~6 O/ J$ Q% j, b1 `
    char c=csym; csym=0;) |4 {7 Y" `7 J1 v
    switch(c){
5 O! n& U1 p! j) \. L4 C0 `' R    case '+':return t[0] += t[1];
" Y/ F/ U  ]" n) r% c  J    case '-':return t[0] -= t[1];
6 y- m) t) B7 u: R    case '*':return t[0] *= t[1];
9 a4 _* y5 E, v    default: return t[0] /= t[1];//case '/':
7 `& W7 n9 G3 u) Q( t    }1 s. d$ V' R2 R* t- f" T
}}
- N* ^2 o% Z6 M  ?5 T9 Ttemplate <class _T, class _Tstream>3 ]9 b3 f1 K/ C1 C6 W4 r
/* _Tstream: inputstream, _T: get return value% m6 C7 n/ K0 d; z8 N" m
* Return nonzero if get value successfully */; q0 C$ ~7 t. N# _
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 p: [& S' D6 E- S* L5 s0 S  U    _T t[3] = {0}; //雨中飞燕之作
  R1 S/ t* e8 F' h; |# V& r    char csym[3] = "++";; [% X  C1 y" X2 }
    int nLevel = 1, nERR = 0;1 j- @1 p( t' s( j1 X- t
    if(!(istrin>>t[1]))istrin.clear();
% i" @# y# N# e; O* d- u7 F) D# ^, d    for(;;){
1 a5 @0 {, {5 m. m- t        if(istrin>>csym[2]){
2 L+ {  {0 j# I            switch(csym[2]){  r' `3 M( k, W9 d. s6 k/ Q
            case '(':
  J2 u% I& y# q                if(!csym[1]){nLevel=0x100; nERR=1;}else
# l  i8 k) j: N- S5 S% R; Y                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;8 `4 P$ G: w% s1 ^
                else{nLevel=0x100; nERR=1;}6 K: f+ K' C* o* L
                break;
0 f1 p% M1 U0 D6 ~$ c) r& u! u2 Z            case ')':
9 ]8 Z) P3 F$ u# d0 Q                {nLevel = 0x100;}break;
+ u/ x% S3 o6 g; ]! L            case '+':case '-':case '*':case '/':
) S# |3 Q# {/ c) Y                {csym[nLevel++] = csym[2];}break;$ Z( [5 k  k& U
            case ' ':case '\r':case '\n':case '\t':continue;, Z) I1 g7 Q1 `9 O3 ~8 T0 o6 }
            default:
! s- \- Q& Y6 U, t4 e2 E- l                {nLevel=0x100; nERR=1;}% P6 _4 A4 [7 f  j7 h
            }$ `( x% T; G  @& r+ X
            if(nLevel==0x100)break;2 ]: |2 W7 f; K3 E. l
            if(nLevel&0x10 || istrin>>t[2]){
& W+ R. G; O+ L+ M                nLevel &= 0xF;3 x  P( G2 w% R
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 S- `+ U: j1 [6 U                if(csym[1]=='*'||csym[1]=='/'){) N+ m& z) \5 U- l
                    GetExpValue(t+1, csym[1]);
; P. E4 E  M5 l8 ?                }
; Z5 {: T8 Z, G* P& O/ M: r                else{4 S6 S% d, @! V$ [' }
                    GetExpValue(t, csym[0]);
$ D2 \9 u; N1 h  Z. J, \                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
( x! v# h, K  ~1 J3 Y                }2 J; _1 f$ ~) q" T+ r- e
                nLevel = 1;
. X4 a% c% A# k7 W0 C            }9 F5 _8 F9 m4 z% J  ]
            else istrin.clear();
6 K6 n! H) h8 q        }
2 d5 a$ r  v! w        else{nERR = -1; break;}
7 \# t* K! k9 R4 J) O    }8 O/ ~0 l7 m3 `( {# i
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" a* n) z  r5 |$ v& h3 k( B, b    else nReturn=GetExpValue(t, csym[0]);4 [5 `  U- g0 [
    return nERR==-1?1:0;( R! _1 S  Z3 s# }
}}
) p3 T) j5 @- h: {; T
+ j! C/ @! }) z, n' X/ g) G2 f7 [0 S4 a$ D

' L( j4 M/ h6 N& t函数模板使用示例:
" h) v1 V4 s& C! V6 n* ?2 t. B在以上那段代码的后面加上以下代码:, R( r  \1 J4 u8 ~, \7 n
6 g) D& H% v8 j$ [9 U( B

7 H! p* _3 Q5 M. B
( x9 K, |. j1 d5 z. g程序代码:
+ s6 ]+ C. {. X# ~- e
0 s7 o2 I) F- d#include<strstream>
  z/ {5 e% o- c, k. r( m# O#include<iostream>8 |# |) A5 K3 I; L+ }
#include<string>
3 n# \  h! S' g, c5 eusing namespace std;
  ^/ B  Z0 [, F3 X. R$ R2 iint main(void)' I( a2 v* S, w
{
4 h0 j- b" K! `5 Y8 ?    string s1;
6 P+ \, z" Z" o2 N6 Y/ M. n    while(cin>>s1). E- W5 G( `# \5 c- i* S
    {- x" y4 q0 x& j3 S! N7 `6 o1 y
        istrstream isin(s1.data());( h& c* Y8 m( a2 @' K( N& a9 x
        double d;
  |# a. b  Q- i3 `, l        if(fy_Exp::GetExpValue(isin, d))+ g. g6 N* ~2 w) y9 u
        {. i. U4 r$ x0 N0 [0 d
            cout<<d<<endl;
( @) v: }2 l; ~+ R        }
) `* ?9 H4 H/ A* b- [, H        else, X5 u0 i4 v: F1 E: a9 {
        {( b/ @! w9 p+ a5 b' _
            cout<<"ERROR"<<endl;
1 R  [, r0 h" V3 B! D! j- b        }4 p0 r% v4 f) l* A
    }' R3 i( `9 f0 i! y! h! D8 M
    return 0;5 {: K# V9 F* z! G
}* b  e# _' R6 G' Y2 q& R# _

! }( w' k- W& K4 d# h' b
4 {7 @$ B: u, b' L然后编译执行就可以了(*^_^*)
7 F0 i; L3 }, w- S; A9 w其它:TC++上一定编译错误,不保证在VC6上也能通过编译, \6 P! n4 @1 l  r
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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