返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,+ h) Z" Q; W8 X* i& C6 T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
7 A( Q9 b) r6 ^只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ l& l5 b5 w- }0 c参数解释:
0 a8 T0 ~% O  ]istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) Z- s1 R7 E/ S! X& I
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
% y- T+ K, K6 p; w, r返回值:
+ G; N! s0 T3 [; s% D9 R返回非0表示计算成功,0表示计算失败有错误
; O/ }4 |! }- m0 b; L" A, ]
4 H+ f+ k) D% v3 j1 }6 `% e1 }2 E, x
3 `6 I% }6 B- v
; U+ f. S$ P, }程序代码:
: x/ S7 u. f7 V4 A" G+ P* J6 x2 W& C' \& Z
namespace fy_Exp{1 t2 l  Y2 ?$ Z6 [6 G& Z( p- \
namespace {template <class _T>
$ L2 s# e9 W- T" p& }inline _T GetExpValue(_T t[], char& csym){
3 n6 F) w( n7 E" z5 F    char c=csym; csym=0;. ^* u1 m; g, V; o, {( i6 ^7 D
    switch(c){4 n. Q! t1 @8 b" n- d( i# a, D, i
    case '+':return t[0] += t[1];4 V- ]3 q6 j: h. a) z
    case '-':return t[0] -= t[1];2 v3 ^, R4 ~1 S0 g) H
    case '*':return t[0] *= t[1];0 n: c+ n$ p$ [- `% E' F2 H& |
    default: return t[0] /= t[1];//case '/':1 l9 j; A$ O- q& M# B
    }6 B7 i. Y* [' A. D9 j, I
}}* ^2 d* s+ p1 Z3 n7 ^
template <class _T, class _Tstream>: ^, [0 k6 h2 M/ S/ \' }
/* _Tstream: inputstream, _T: get return value
& A" K3 z# u, C1 T! g* Y* Return nonzero if get value successfully *// O, A) v/ S& `4 z$ d4 N
int GetExpValue(_Tstream& istrin, _T& nReturn){
1 n9 [5 P3 n1 Q: u    _T t[3] = {0}; //雨中飞燕之作1 G% N6 y4 J: k% v+ \' {
    char csym[3] = "++";, G  Q3 p: `% d: Z5 f0 U. J2 G
    int nLevel = 1, nERR = 0;, ?% |3 T2 _/ e  r# \
    if(!(istrin>>t[1]))istrin.clear();
* D( y% T+ }+ ?& g    for(;;){% J+ P8 P* `( g4 Y! o  A
        if(istrin>>csym[2]){
$ k( Z7 ~& [8 H            switch(csym[2]){; ~: w0 U1 u; H" \( f$ H* B
            case '(':8 r9 ?7 ?1 S, P# W9 g
                if(!csym[1]){nLevel=0x100; nERR=1;}else
; K0 H0 W, Z( h" l5 L) N  s5 A5 g                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 x0 Y: k) A% A2 B! |9 J                else{nLevel=0x100; nERR=1;}
, J3 ?6 i7 ]. J                break;# J# H( L+ X1 s( @  I" D
            case ')':) w# r3 X% c+ X8 j8 B2 T
                {nLevel = 0x100;}break;
3 J, R9 [) R+ C  Y7 j* I) ?            case '+':case '-':case '*':case '/':# `/ q# H7 W; h& {3 @4 f. d
                {csym[nLevel++] = csym[2];}break;
  p  |( p3 b+ ^% M! _5 N; e( T; [8 |            case ' ':case '\r':case '\n':case '\t':continue;) J1 f7 T, d. {0 o6 B4 U
            default:% R' }. |4 x/ O; m
                {nLevel=0x100; nERR=1;}2 o" _7 X- l8 M6 f8 |$ v
            }% I( i: V( b' V5 I7 K9 a
            if(nLevel==0x100)break;
! d1 U) ?- H% l- r" A            if(nLevel&0x10 || istrin>>t[2]){4 t; s" u& D  B
                nLevel &= 0xF;
0 w' j% ]0 `* b1 ^) t                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! E1 T+ k1 K5 I
                if(csym[1]=='*'||csym[1]=='/'){6 B( Z; k( I  a* m
                    GetExpValue(t+1, csym[1]);0 y' \0 A$ @, N# F; r) Y& p' A
                }2 M5 n' T2 P0 d7 o) y( L, [
                else{6 p! L) v0 o& l) ?( M& p' D8 M
                    GetExpValue(t, csym[0]);
: G2 \- ]: a! ^                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;- L# N# `0 d$ Z
                }. v: ?. _( D( d4 h5 I7 c
                nLevel = 1;
7 D5 d7 [! |: `+ u, M            }: P  M9 l; e. Z% L. U% N
            else istrin.clear();# a/ l% a) Q2 Q. D
        }* M1 v1 |$ C7 M1 n  \# ?8 N
        else{nERR = -1; break;}
2 L; O; f+ k1 T* Q/ I+ X    }4 e% y$ o7 f+ x9 F' R9 ^
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% f( l0 H: d8 s3 F+ q
    else nReturn=GetExpValue(t, csym[0]);
1 D- X' i/ B8 W/ W) v8 K    return nERR==-1?1:0;
7 T/ r+ @. ]/ ]' B7 }}}2 E7 T4 m! I5 ~- w( |0 C

0 i4 J0 Z. W/ Y3 k4 \. Z! K! M4 E' J  ]% Z) C& ?  B: _6 s
3 H& X0 y3 n  c' w2 M7 ]: `1 s
函数模板使用示例:
. f. ^3 N$ v! N- \& F. E* H在以上那段代码的后面加上以下代码:
$ L* j9 i) l7 G' ]
5 v" M0 _+ R- c2 Y$ u( l
2 z7 f9 \2 A/ _$ \7 W2 o' Q2 v, u( k6 k; \
程序代码: # M5 t8 u4 ?* {
# [* f) W$ l' M$ G. g) V9 G
#include<strstream>: C( J3 v( X# T1 A& k' U
#include<iostream>& H+ r. |$ K3 b8 U  ]: I
#include<string>
9 x  T* H) P0 K& ?+ D( v. ]using namespace std;
5 @8 M- o! a3 g. p1 X% g, |/ Eint main(void)8 v  Q. K7 N" P6 Y5 ?- r
{" f* d6 M2 Z/ G
    string s1;! m! C# N: j$ E; N
    while(cin>>s1)) m2 }; e/ b3 B% L9 c! R, `. q
    {
# O: w5 H. M+ d        istrstream isin(s1.data());  ~6 n4 n2 ?$ f) ]8 C0 V
        double d;
6 e" u8 n/ v7 E" P& b& k: V        if(fy_Exp::GetExpValue(isin, d))
1 ?- Q& S! P- H# a5 c        {) ?1 q) ~% \, u; L- H- t; q  t
            cout<<d<<endl;3 `: |7 e! K" x8 A! l
        }
8 A% h8 u  A4 S! k# l* L) S! t        else
/ O( t: z. S( |  ^        {
' D/ c- a& a  s5 v            cout<<"ERROR"<<endl;, T- n1 D9 ]( @  k( S
        }3 y% b. T3 T) X. c2 S- T
    }4 @0 ^8 m* I, d, b/ {& V/ X3 [3 G5 N1 g
    return 0;
0 {; b( P0 Z- z( m  ^}
$ x0 G! ]: T! H) `$ f
, x& B+ K  T' b$ i& N( E! g# |9 P( I' @: T
然后编译执行就可以了(*^_^*), g, Q! T/ [8 r
其它:TC++上一定编译错误,不保证在VC6上也能通过编译- A1 R7 [0 v* N: |2 z+ ^: n
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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