返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
  @" H% a' T7 j/ D  J7 s2 a+ Q3 [一个很方便的函数模板,可以并且只可以计算含括号的四则表达式2 I5 A; \7 Z0 Y% [
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 J8 C" O! m* R" X5 f# t参数解释:
! D9 R9 w/ Y, T7 P/ U( ~$ l! Mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 f# n9 b/ I0 a* u0 x9 vnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 `+ s" ~, H& O6 r0 t
返回值:/ s$ w7 Z! V/ G4 \8 ^. d: s, c
返回非0表示计算成功,0表示计算失败有错误
- U0 M& T8 ^( b- q* J5 g# k( _6 {
+ V) g2 L% z+ e; w% a5 q9 ]. W' S 9 h. d& ~# C: N1 b+ n+ ?- y$ j
& t( I& D6 D  U7 W
程序代码: 5 v- K6 b* Z% ^4 z5 Z7 `
) X- a5 x* Y" {( g
namespace fy_Exp{
2 y6 y6 C8 X2 `0 s7 Wnamespace {template <class _T>
$ ]: Q4 X3 r7 v) `inline _T GetExpValue(_T t[], char& csym){
! C- I; h  C% y/ O9 c    char c=csym; csym=0;
) o( U" D+ E2 N* ?9 Y8 C9 F    switch(c){9 J- x6 X- }/ k; i1 t+ D
    case '+':return t[0] += t[1];
% u0 U# v6 a$ [6 _3 G1 q    case '-':return t[0] -= t[1];* U4 Q, I7 w. O9 p5 g
    case '*':return t[0] *= t[1];
9 f( _8 U, V& f. ]) J$ _    default: return t[0] /= t[1];//case '/':
3 V( Q9 p* x; ~2 z    }% A3 O  w% ]' v0 ]+ y8 E
}}
) E" Z* F- M8 O8 f) I& Dtemplate <class _T, class _Tstream>, F. R3 ~4 t( ~+ G8 J* g- z
/* _Tstream: inputstream, _T: get return value( d) C  y. G6 U1 u/ I/ N
* Return nonzero if get value successfully */; l3 D/ a5 Z7 K0 e. V  }
int GetExpValue(_Tstream& istrin, _T& nReturn){
5 S& t9 ?: S% z+ u" Z7 ~0 u    _T t[3] = {0}; //雨中飞燕之作
; \' A' s& k+ q$ t    char csym[3] = "++";. Y: M/ u4 I2 b  q+ }# m- b
    int nLevel = 1, nERR = 0;3 E7 u! R8 H' ?' l9 o
    if(!(istrin>>t[1]))istrin.clear();
4 l: ?3 @; a9 F- \/ o    for(;;){
7 ~' @3 i( `* K% F- a        if(istrin>>csym[2]){" M6 c! d& z  |3 A" h% M) t( f
            switch(csym[2]){+ {$ S$ z4 ?- v/ F. U4 s, d( a
            case '(':
4 i; l; o. H- p& w2 d5 c+ P                if(!csym[1]){nLevel=0x100; nERR=1;}else
) |! y( A/ c4 r& c7 F4 t" d                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;8 ^- \7 w: u5 a8 f+ Q5 P5 x! Z- S) |
                else{nLevel=0x100; nERR=1;}
1 K7 I  c, t2 N                break;
* x4 E7 V% C6 I8 E$ ]" ~0 T            case ')':
! N9 F& \9 V" i. B. N7 p9 N& K                {nLevel = 0x100;}break;
- z0 I, s& H$ [& Q9 c            case '+':case '-':case '*':case '/':
+ W& S/ c9 Y, l                {csym[nLevel++] = csym[2];}break;5 z; x% z: \3 |: a1 @) z+ n; t: {
            case ' ':case '\r':case '\n':case '\t':continue;
& \% T; D3 v; z: \3 x) ~$ q# E% k            default:: q" w, A" k1 W  N' r5 f) t: P7 |
                {nLevel=0x100; nERR=1;}: c. z- T" a5 O+ s  m) }& A2 \8 C; G
            }  ~6 W: f' [; N2 [2 U
            if(nLevel==0x100)break;6 }$ d4 K/ b5 |, i3 E$ a( `% ?
            if(nLevel&0x10 || istrin>>t[2]){
* t7 q1 A. }+ j1 ^. ?$ u                nLevel &= 0xF;* n0 M/ J& V0 u) U, D
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}7 `& a7 H8 c$ u
                if(csym[1]=='*'||csym[1]=='/'){) S5 u( ^( x# ]
                    GetExpValue(t+1, csym[1]);
) ^3 Q* p+ J1 h: U2 x; F                }
: ^! o2 V" h. x+ r/ z  D: v4 b, H1 K* n                else{
3 ^& \. y, C8 S9 c$ b' j                    GetExpValue(t, csym[0]);, J& U8 d: [( A4 C
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;0 J+ W( b( m1 L- X7 \( B5 i
                }, y7 l* w! {5 |2 Z+ H# [
                nLevel = 1;
  N7 C5 Y  g' g            }( @* T6 M2 H) l$ q+ K
            else istrin.clear();
) k( `# n: e& y+ n8 C  ]: g/ t7 @        }' Q# F0 [& E  w% E  J
        else{nERR = -1; break;}: _/ @9 v& \* l$ I9 a% @
    }
- \+ J* J6 [: e- i0 R+ K; F4 l- u    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% \- p9 o0 v0 Z; ~, g
    else nReturn=GetExpValue(t, csym[0]);4 y7 f4 |1 j- ]  _! n8 C% W
    return nERR==-1?1:0;% k; p3 V9 M/ }4 |& }" M
}}
* R/ _9 H2 _- n9 o" e0 g7 z0 |$ H: L# H) w0 W8 `; X3 D
) Y8 ]7 k; j6 \7 |5 Z" k

! b9 Q4 {, Z; w# A, R3 w5 f. ]函数模板使用示例:
9 O% {. B* q7 `2 W; U7 o: T在以上那段代码的后面加上以下代码:( A+ f) X% [. b& W8 k2 t7 A$ o/ e5 D

: a! z8 b- p; c
- m+ j6 C1 N; i) e0 \, Y. G$ a; F+ ]* f2 i' `
程序代码:
1 q% h" n/ l$ o- c$ ], ?7 n
1 \6 n! i1 ]. i+ p#include<strstream>
! \& k& P% `5 ?" Z4 _/ }1 B* I#include<iostream>+ U/ @: z/ j% S( h! N$ E( b
#include<string>! u, w/ B3 d* R* w) E' u
using namespace std;( j3 L9 r6 Q! C
int main(void)
4 P: ^0 z) p1 H9 j, n% T. s{
* e) e) g( f5 }: x% o9 {    string s1;
' b/ n: |! j+ o, a. C    while(cin>>s1)
* g9 `/ R: c  I' i: }, Q$ u' a8 L    {
8 H) ?- x  y% w& ~        istrstream isin(s1.data());
* U4 E2 v+ U8 z        double d;0 O% T6 i! [# q4 }3 P. Q
        if(fy_Exp::GetExpValue(isin, d)), }( m2 R  L. r# L# N) u5 a/ {7 M6 F
        {
# H+ E) f/ h! P* q) f; G8 y4 Z. a            cout<<d<<endl;
/ }8 D; W/ K, L# F! |  m8 Y        }
  ]5 v( g6 A$ q/ r* }* F        else
: V# |: r' Z) c7 H0 y3 o$ w& G: Q3 h& g        {3 ]2 V- Y; }9 f  S. T0 ]
            cout<<"ERROR"<<endl;
3 Q4 k6 `9 |2 Y1 \        }1 o7 j5 t& _1 I) Q* J6 }, ]3 x. q
    }
0 m1 }. a' _. Y! W* g7 e, q# R    return 0;
& Z$ L6 b  B  J5 x8 E6 h}
% b: u- P, E0 U$ {; L4 F
9 f# ?- f9 X$ {- l9 `% U4 E7 N9 `: @& M/ v2 L# A
然后编译执行就可以了(*^_^*)
: n" [# ?+ u3 ~; A2 p1 o' w& |) _: ?其它:TC++上一定编译错误,不保证在VC6上也能通过编译  e. h0 H& O2 S2 |
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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