返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
0 a: s+ q7 \2 _% r8 _一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
3 P; A' C# z5 J# y7 O1 `只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( k  d* O( Q$ p  h: n
参数解释:
& M+ z* ?, G. }# O2 ]istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
* \9 K+ c- N  \, {" F) a" jnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 ^1 J" ]# N, ?/ o
返回值:: V1 d4 c$ c0 n9 |
返回非0表示计算成功,0表示计算失败有错误4 a4 }! w* P4 O. _( ~

$ I0 T0 m8 x2 e! Z- |
/ _) i, a, E1 M- D
6 \* U# a# P* p" ^) V0 O程序代码:
0 ~0 e4 ?0 v& C/ c6 F! M: M* q- x( p1 R8 \
namespace fy_Exp{) R% _. C, A! Y/ b
namespace {template <class _T>7 o8 e) y) `" E0 k4 f! \5 J
inline _T GetExpValue(_T t[], char& csym){# c/ p) h3 E, T! b( Y4 A
    char c=csym; csym=0;. l. E: h, D; P4 u" h$ x# @
    switch(c){+ {& B& c- p: A& O1 C
    case '+':return t[0] += t[1];4 t; T( b$ b/ m/ n- J& A2 y5 b' M: i
    case '-':return t[0] -= t[1];' ]2 o4 v- k5 k- O$ [1 v. b; E
    case '*':return t[0] *= t[1];, g/ F+ X* m! P% Q+ U
    default: return t[0] /= t[1];//case '/':2 Q! i! l" d4 g" i% f. S
    }( j& p0 w0 P0 v) p
}}/ y% ^  X  l2 l2 t- M' B3 E
template <class _T, class _Tstream># [: B& I' Y: l, [4 U- v
/* _Tstream: inputstream, _T: get return value
/ f. V+ V/ t; h4 o* Q1 E5 p* Return nonzero if get value successfully */6 }' Y# W, D: i" m* t: j% m2 K. N
int GetExpValue(_Tstream& istrin, _T& nReturn){& F6 ]. X$ _$ R$ A
    _T t[3] = {0}; //雨中飞燕之作9 P- x) Q3 q9 ]2 ^) R# V
    char csym[3] = "++";
4 D3 Y1 R+ C1 ^: [- D    int nLevel = 1, nERR = 0;
  I! M" k7 f: P& q% C    if(!(istrin>>t[1]))istrin.clear();
7 u$ p) g# k% f8 h' I( K/ I8 G    for(;;){. [2 j  o0 ^* H3 W5 q1 h3 M( K
        if(istrin>>csym[2]){" Q9 T' x) v* Z' C5 R/ B+ y
            switch(csym[2]){
  j  ]# ?# c5 H            case '(':' X/ v) _; M8 X5 T% g% e; g: y
                if(!csym[1]){nLevel=0x100; nERR=1;}else
, S1 Z7 V9 A) n) ^- N1 C" I+ v+ _                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# S4 f3 {+ p3 t1 q
                else{nLevel=0x100; nERR=1;}$ [1 `" `2 S7 b7 U
                break;7 U- }. t, `! R- m9 N9 E
            case ')':# T( f% ~4 E6 Z: t. ?9 d
                {nLevel = 0x100;}break;
4 H% J6 ?2 _0 r8 F. S. P; a            case '+':case '-':case '*':case '/':7 g! m. }- h* l- s
                {csym[nLevel++] = csym[2];}break;: X" h4 I4 k. Z7 l) [  Y0 _
            case ' ':case '\r':case '\n':case '\t':continue;
3 W4 L9 V0 y* ~+ m            default:
: k0 |8 G% d0 S1 r                {nLevel=0x100; nERR=1;}! w- u9 v" X/ }& j
            }
. ]& ^) }8 s3 x1 w) ~- A$ G" Y            if(nLevel==0x100)break;2 {, g5 r* ]. ~: f, q9 X. u1 ?6 N1 U
            if(nLevel&0x10 || istrin>>t[2]){
# M9 o. K! i- u7 w+ m                nLevel &= 0xF;) I- A  u/ y+ p
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
1 N0 R1 C0 G6 v% j/ M- K6 {; j                if(csym[1]=='*'||csym[1]=='/'){; t, s  N& `) O4 c2 u! P
                    GetExpValue(t+1, csym[1]);4 R9 @3 Q( w+ `
                }) M  p0 t; M0 m* I" i- x( m0 H
                else{
& I" z$ R, q( |- p' m) N" u                    GetExpValue(t, csym[0]);
  k+ f7 C3 c5 a% B" [! f; q" p4 g                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 F4 g* j  e) ^$ @  q& Z                }' N0 t8 @' z5 g) |1 `% J2 H6 p
                nLevel = 1;. d& y4 m. U! x# J; P
            }
1 o9 G" b) ^8 M1 r" x            else istrin.clear();
: }+ y8 `0 [9 r9 ~4 z' p/ t6 d( u        }
/ {0 w! d: c, a+ y. U: y  L; m        else{nERR = -1; break;}7 M: |* R8 n# y  M9 c' K
    }/ u7 G: ^2 r! ]* j3 p
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
+ C3 D' u+ P0 x) L- D) C; Q" L    else nReturn=GetExpValue(t, csym[0]);5 c0 f) ~3 z& w; l
    return nERR==-1?1:0;
! [5 L) X2 o$ t: B; F8 m$ s2 M. `}}; R6 S% G' I! Y# l
6 u: v' U# U: }: w- e* G' s; b
/ S5 |. q) K! O! P" b$ [5 G
9 y4 j  g5 J$ I" H  h, I
函数模板使用示例:+ p! B( ^& p/ i; D4 u+ ~4 _
在以上那段代码的后面加上以下代码:/ Y. F( n3 u: n- s) n

" W; V1 H+ q! R$ p
9 h+ F, q/ b* _( z" P
, [& O5 }7 z* ?9 U; }, ^2 @程序代码: ; f% m2 H) O8 @# ]; h

" @) S+ R, M' x' `. h#include<strstream>
+ z( P) y& f" u8 \, ~' T#include<iostream>
2 e. x, M2 ^1 @, B) }: F; I#include<string>
/ N$ }2 t1 f/ Vusing namespace std;
: m) l1 S1 R0 A- qint main(void)4 w6 K; @- k; M
{# h% F8 g2 Q1 p  G
    string s1;
4 Z2 X! \, v# `3 B0 Q    while(cin>>s1)" i2 K3 E  y! j4 B0 k- d0 P( W  J
    {
3 ?2 r7 J5 J* G  c: ~( v) y        istrstream isin(s1.data());( w( S8 l: Q; J7 E$ k8 q* `, s
        double d;
) m( T3 a6 m- g% G" K) {        if(fy_Exp::GetExpValue(isin, d))* C: d. Q# e2 y, Q8 H! [/ R- _, B
        {* L" }+ ~9 D& @6 X6 x6 F: i
            cout<<d<<endl;
/ E. m, g7 b- i- s        }
$ a. V. ^$ `8 U# I        else
$ H) Y/ E! c  S8 x1 t8 T5 _' S        {
  D+ q1 R8 w# l# x5 u! D            cout<<"ERROR"<<endl;& ^; Q# a* O; d# ~. ^- I5 H- ?) t
        }3 j) l; u6 `' F) t0 w/ F& ?1 h
    }
& P5 b; Z- G5 J2 h7 K/ K    return 0;0 r8 K2 \. f1 {, I2 |1 @' `- _1 {
}, f: `  m# Z/ u6 i

; `, U6 d! n7 D% ]( C# e5 |9 V/ {& u+ f0 @: _
然后编译执行就可以了(*^_^*)
" w  O, {5 w  U" j7 I0 F* x) Z9 T其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 T: n  ]$ a- H6 F$ S  n      建议使用VC7或VC更高版本,或者使用GNU C++编译

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