返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,. T! M: ?+ G8 f+ z1 C6 w4 m- u
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
0 F+ H! |, j! V/ x' c只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( p+ M8 \- b6 ~参数解释:
9 s+ ^4 z3 G4 F* g, I  h5 }; Eistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: ~3 t. B+ Q) k( `" F7 }nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
7 g" e* n; Q* M9 ?) j' k返回值:- @8 y# V: y5 C1 t9 ^
返回非0表示计算成功,0表示计算失败有错误
" ~  L6 l/ B& ]* c4 q
3 ]+ W1 P1 T) p- { / n3 U( K2 k4 K7 r+ c! v* v+ V  x; u
& J. j2 t$ w7 v( q' ]$ {  H
程序代码: . ~6 o7 u3 l0 R: t

+ O8 R; F# z* M# r# u2 ~' Rnamespace fy_Exp{. W( ~) ]+ q& u
namespace {template <class _T>
0 |7 E1 x+ j& Rinline _T GetExpValue(_T t[], char& csym){1 j8 ]* L' d9 ~
    char c=csym; csym=0;
' D  X$ ~' k9 O9 h' b    switch(c){0 J8 r/ o9 G$ R0 O
    case '+':return t[0] += t[1];
' H, C: I9 Y. E2 x* V8 y+ y" Z9 m    case '-':return t[0] -= t[1];! O9 G, _, }' F, U
    case '*':return t[0] *= t[1];
: a+ `  h$ `5 U/ S, D0 x9 L0 N/ M    default: return t[0] /= t[1];//case '/':4 g( z6 P: b( j+ _
    }
- M) R+ E* x  Q}}& P1 G" J- O8 u0 R& J
template <class _T, class _Tstream>
& T( x# r& |! w9 O: W/* _Tstream: inputstream, _T: get return value/ Q# s  q( U8 h2 |
* Return nonzero if get value successfully */' _3 F+ E4 H7 T# a4 b" G1 Q/ x# g
int GetExpValue(_Tstream& istrin, _T& nReturn){
" d6 G7 e: \4 l* g9 Q( C$ @; m# a+ ?$ Y    _T t[3] = {0}; //雨中飞燕之作
) N- t9 x$ j. V4 t- S    char csym[3] = "++";4 h" S- w# U" w
    int nLevel = 1, nERR = 0;
2 L6 M: H2 u6 E' @    if(!(istrin>>t[1]))istrin.clear();% Y& x6 C/ _7 P4 W
    for(;;){
) x" m- U, ^/ w$ N6 [5 i3 s        if(istrin>>csym[2]){
7 y5 W* F% Q2 t, C            switch(csym[2]){& n! U1 K) D/ l7 E0 U/ V8 D' i
            case '(':- y, h, u7 |  j2 @2 N% t4 m
                if(!csym[1]){nLevel=0x100; nERR=1;}else! I% w+ i8 {2 h& C* Q* @  r
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 f" E1 J* s/ D. C
                else{nLevel=0x100; nERR=1;}
6 ~9 }# W* w4 h8 T0 ?  b                break;" r8 Z. a* N  Y5 P% n0 K  m$ b
            case ')':
5 ]6 G+ ]4 F  p  s, f4 N$ e3 x- ~                {nLevel = 0x100;}break;
3 {' X5 T& P0 R! G5 p" u            case '+':case '-':case '*':case '/':/ Z# F( r- B& r" x
                {csym[nLevel++] = csym[2];}break;
" i3 F1 Y- v  o1 s$ N4 V            case ' ':case '\r':case '\n':case '\t':continue;. Y( B+ _) i: J* {
            default:7 K* I% Q/ {$ N3 @) m; ]
                {nLevel=0x100; nERR=1;}  v% q$ v7 s, G) @7 d
            }/ N6 K* W5 Z4 t( r
            if(nLevel==0x100)break;
- W% x9 g" F$ ~            if(nLevel&0x10 || istrin>>t[2]){* l4 |: C. h- G. d8 c5 P/ D
                nLevel &= 0xF;
( v( X% w( u5 b; T" A/ F' g                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}4 g- S. X2 r) X
                if(csym[1]=='*'||csym[1]=='/'){
5 b. m  y& l  _  M$ ^                    GetExpValue(t+1, csym[1]);3 |; ~& Y4 Q5 b; T. T* k
                }1 t$ G% w+ E( X! H
                else{7 f# e" t& m# G& T  Q, F5 R4 r# ]
                    GetExpValue(t, csym[0]);( G4 c( x0 u. q* V4 x
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! P. k5 j& t2 t' L                }
" V+ A* H8 n* a" S3 C                nLevel = 1;
# o$ q, ^8 N* p            }
4 v+ c5 x  a7 F' o! J9 O+ S- K6 C            else istrin.clear();
" Z; W6 @. @) i2 g) `        }
1 v# C& V: a! ^; k$ s! A( N        else{nERR = -1; break;}
- _, o7 j! j2 M9 S6 [: v    }
3 n* C9 x6 ]  Q* b# x; o    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 t& j* |. v' {& m    else nReturn=GetExpValue(t, csym[0]);' [: H4 {+ d9 L& K4 ~
    return nERR==-1?1:0;2 C* u* |( e5 j& n1 H
}}
. m+ F: }+ Q4 E/ a6 i* u2 x4 T( r. P7 |* L6 B" u+ r- D

, O; v) c' b& o. o) z- }) f. P0 S0 C. B# B
函数模板使用示例:
. t0 s4 ~1 Q  l+ ?在以上那段代码的后面加上以下代码:
4 G% m  H' V7 i1 f$ T& {  B0 |2 y& R3 ]6 H+ S' q8 y" }
' u& X5 Y. s) I* O

. r9 b) K! d( [4 R! Z$ I程序代码: ! N$ B: {1 D; q; |6 {% ]1 D$ }. U

/ {, i% S( X2 C( t#include<strstream>
0 J& c- h2 I& U) m- E#include<iostream>/ D+ _; g! k" R. G/ E, Z  S# z
#include<string>
8 F6 ~7 I! U) iusing namespace std;; y# a, m6 o5 _4 A
int main(void)
0 r) y5 `' I4 b/ g0 y{/ {9 L! H& T) t5 U) V2 _5 F
    string s1;
+ j+ {0 B' [# Q: Y- J! T0 H    while(cin>>s1)
) z- o3 v8 E- }; V  H    {
: Q8 K9 [' [$ y, ]4 |. S        istrstream isin(s1.data());
/ k% @# h* |6 E: n9 I        double d;0 G- M$ u9 D5 }' Q" D+ P
        if(fy_Exp::GetExpValue(isin, d))/ H0 ~/ W$ ?* E
        {
  [, I9 }! Z; C* w( g1 f            cout<<d<<endl;
: }5 {( L) F2 C* C+ z        }
7 X7 q  t( ]- t        else+ t7 A/ A; t* Q2 g
        {  |8 {: K' R9 S5 x  h
            cout<<"ERROR"<<endl;5 W) a4 R' H( I3 b$ }2 k  _
        }: s1 u0 Q. n+ V( y
    }
) n4 {; S. M7 o) M0 o) q, |3 @0 s    return 0;
* W8 C/ C6 S( }! F}. C; I& Y- e; x. q: I5 j

, A# D* e4 Q) O# V$ M  |% b* W9 y6 t& l! M( X: s
然后编译执行就可以了(*^_^*)) f/ a1 P1 Q- j# F# ^- v
其它:TC++上一定编译错误,不保证在VC6上也能通过编译- E$ b) J6 F: n. W* S
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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