返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,) U( d4 l# F7 b! ?- x, E) U' @
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ o( o$ W2 q; J) `3 l只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)  ]" d0 A' ?, O  Y' d1 ]
参数解释:
1 i8 f9 P/ U/ distrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 \6 J1 z4 l- t- a( r" VnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
  ?6 }( o- Y* f9 n0 O$ d返回值:. ]- o) ]- e, @2 @7 y. m! D$ s
返回非0表示计算成功,0表示计算失败有错误# s5 Y" s+ |- V+ a
2 E/ N0 D6 s- a  D9 l

2 g" w2 |- W; z& _/ e' s4 D) |6 L8 R$ a# p
程序代码: 6 ~+ w; A! n& ^. Z& ?. {

) L8 S2 t) i* Dnamespace fy_Exp{8 {4 m* B2 x6 x* b" G3 o
namespace {template <class _T>$ [. ~* b! c( v3 e
inline _T GetExpValue(_T t[], char& csym){
, P2 y5 X5 b+ ]% o    char c=csym; csym=0;
7 w: s( W5 M/ _; z0 q$ ^    switch(c){
  B3 F- L& o8 z    case '+':return t[0] += t[1];
4 J2 [) D3 w* [8 Q4 R    case '-':return t[0] -= t[1];5 y( Z1 g! v! m& C, ~
    case '*':return t[0] *= t[1];8 k  f" m' Q1 s' [) i
    default: return t[0] /= t[1];//case '/':  ~# B# d7 W- ^) m  ~8 E, Q6 ^& V( q
    }
6 {* N, m! a2 `. Q" C4 q0 Y}}
' V1 {: C  J" K  }$ c2 k8 itemplate <class _T, class _Tstream>
  T1 m+ E$ r' c! M& Z! _/* _Tstream: inputstream, _T: get return value
5 K) H- M" T, @( x" x+ c* Return nonzero if get value successfully */$ s4 j$ `# u" C1 A
int GetExpValue(_Tstream& istrin, _T& nReturn){$ l* I3 R) r9 }; ]7 {
    _T t[3] = {0}; //雨中飞燕之作+ `( D4 L/ V% g6 ^7 b( g. M  e
    char csym[3] = "++";; ?; ?( B5 O- {3 _" t
    int nLevel = 1, nERR = 0;
% Q8 b/ ]1 T  |' V9 Y2 Y0 \    if(!(istrin>>t[1]))istrin.clear();
! T/ W6 e2 J( j  q    for(;;){
# A& W- U2 O% p- f: H        if(istrin>>csym[2]){1 F7 r3 ^2 i, M# z' @( f$ _5 Z
            switch(csym[2]){1 ^3 A( x; q& A  U6 B' V
            case '(':
% l# x" \: E1 Y: k, h5 Q7 F4 M                if(!csym[1]){nLevel=0x100; nERR=1;}else
* S9 {" H+ T& U- ?. G. |                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! s2 B6 V# m0 V% y2 I% v
                else{nLevel=0x100; nERR=1;}$ k2 F. b, M0 b( O
                break;& n1 W  t- e2 G
            case ')':
  |4 A! B' i7 A6 l) a                {nLevel = 0x100;}break;
2 ^8 j+ I4 q) }# m8 b! u8 g) D6 q            case '+':case '-':case '*':case '/':; u, p& [+ l1 ^" b7 c6 S! Z( W
                {csym[nLevel++] = csym[2];}break;2 S- Q& A  H( \0 n
            case ' ':case '\r':case '\n':case '\t':continue;3 ?( N5 a1 D$ b' c7 N
            default:* I) _% O3 Y- w( s0 \4 c9 m
                {nLevel=0x100; nERR=1;}
! B: U! E- u. C( ]            }
) J! ?; q$ V& t            if(nLevel==0x100)break;
, h8 O/ Q/ f+ [& K# n$ i8 Z& ^& q            if(nLevel&0x10 || istrin>>t[2]){
# F4 D$ R, ^4 z                nLevel &= 0xF;
9 n, H. f9 p7 t3 _                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! J; _% l! q& ^+ h* Q
                if(csym[1]=='*'||csym[1]=='/'){
  D) ]3 r) S6 W/ N2 B                    GetExpValue(t+1, csym[1]);! ]7 E! W& t4 S" R4 q/ z
                }
0 M% Z1 H* A. Q* Q2 E) e/ d                else{; H6 k9 `1 d0 e" y! w
                    GetExpValue(t, csym[0]);5 U8 j! O  x$ d' v* t' b
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ b0 N" o+ i* b7 Q/ f                }
: g5 {$ X$ n& m( G1 {; B& a3 m                nLevel = 1;3 e( J8 ?8 d; e& ?
            }3 a9 {8 C; k. Q0 N, m, L
            else istrin.clear();
3 r* v: l# f/ H; V: ?) U+ Q        }" `+ t3 L% N) a: E0 D
        else{nERR = -1; break;}
! X; j, j4 |( w' A/ U    }
  k0 @4 W  y; V3 f0 g6 A3 B    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ H; p  T' e; u- r! H
    else nReturn=GetExpValue(t, csym[0]);5 X. e3 _: `, ~- H! @* Y7 I; i
    return nERR==-1?1:0;
( w, v' @& {1 }% q! b2 y  g' X}}7 ]' t3 L0 E3 J2 c) q

0 P" S, r* H$ X, q5 r) c" [( F7 j$ p) M/ U6 s* @- q

8 t' j; R( O% Z  J% C/ u: Y函数模板使用示例:: Z) T; O2 M6 O
在以上那段代码的后面加上以下代码:
. D0 d& S8 b8 x' c, W( z( j
. z2 S+ \) ?4 F) w7 e* B8 ` $ z8 Q( ?* E; `' c# l2 E
& j' M4 G: k6 m  c
程序代码:
: K9 f; a6 N5 m5 E$ Q% K8 k* t+ j; q. h$ [; q
#include<strstream># [3 y4 [, t8 T- I+ L% T9 B
#include<iostream>
' s) r9 p* y" c8 U#include<string>% u8 s+ U7 z7 h. t% ]5 x
using namespace std;
3 z; Z9 n2 U4 T3 R/ Y" z& Uint main(void)
  P; F, e0 G/ r% F4 J1 t4 G  Q{
6 ?; G, X$ \: w3 ?    string s1;; `- M, D, z. g7 X9 X
    while(cin>>s1)
: R7 H( {6 |7 `3 Z3 F9 u    {
# r* D8 e$ @4 [( V3 P) z' E/ _        istrstream isin(s1.data());
  E# k0 b; R! V/ h7 }- V3 R2 _        double d;* b( d9 \% B( Y4 Y$ e" y; l2 `2 `
        if(fy_Exp::GetExpValue(isin, d))! l* D5 O0 j1 R4 \) {3 L7 M
        {, f& ~* a5 P3 y8 m0 R: r% |
            cout<<d<<endl;, o7 {/ S* A0 D4 f* k1 J* |. o9 h
        }
9 a4 s5 J5 F% p- Q        else4 {/ w# H  u: @
        {( V+ ?( E5 _( O$ I  \
            cout<<"ERROR"<<endl;5 W; p+ u) I  e+ R2 N- F
        }0 z" v3 ]/ P; L
    }) w) x; `( ^: b4 d+ a2 _
    return 0;
& C7 f( l4 S  g  U' _. C. c}
# A) [4 t) a( m& c3 C( @, _+ X; X% m! a+ K" w+ S* q
1 n, h: m) }' i) ?: ?
然后编译执行就可以了(*^_^*); n6 f/ |( T) }
其它:TC++上一定编译错误,不保证在VC6上也能通过编译5 U7 t- S5 i4 [- L# X: S: O! _
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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