返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
* g3 b- n; _; G. O) y: n; p3 M7 f2 [一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. r& |1 _' a% m5 j! a只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 }" O8 |8 Z6 G% ^3 P6 r7 f0 |: ]$ Q
参数解释:: w  U$ u! i/ A7 r; T+ E
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
5 d3 f% W* q. P9 vnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
) W; s  m! q/ g% \" [& M9 H返回值:
6 }" k+ k' M& V" x. |8 z0 A返回非0表示计算成功,0表示计算失败有错误
: Y+ o+ b8 m, ]1 k1 R+ L- R, v6 k( v( A: Q. V+ E
* G7 h( _4 y% L6 _* `6 I% S

, c8 \  a* g  k' B2 V: G程序代码:
3 @1 l0 V6 n3 A& F
+ z# }% {5 U: d. A% i1 d% ?namespace fy_Exp{1 {( t/ S5 E/ I
namespace {template <class _T>- T* w/ W6 |3 \, \6 I
inline _T GetExpValue(_T t[], char& csym){
2 n3 b# j8 }" N% Y3 n, n    char c=csym; csym=0;4 _% ?) M; S& i( J. i
    switch(c){
6 k4 O  V+ H# x; F0 }6 `  b    case '+':return t[0] += t[1];' Q* e% S. L. w1 v
    case '-':return t[0] -= t[1];
7 c5 b% I/ X4 M/ H7 w    case '*':return t[0] *= t[1];
, ?/ a4 J3 }4 ^, p    default: return t[0] /= t[1];//case '/':
0 [8 A( N& j; ?) v1 m& r' h    }
0 m& e6 W) b+ k/ g}}
& o# C7 G. f- g' G8 c9 a/ S! Htemplate <class _T, class _Tstream>) U; K. J8 a! J
/* _Tstream: inputstream, _T: get return value. x8 Z; ]3 y; o. j& `# U
* Return nonzero if get value successfully */1 k+ m# \& c% U' x; b5 |, [) Y
int GetExpValue(_Tstream& istrin, _T& nReturn){8 ?6 I. v5 g2 e( }, T
    _T t[3] = {0}; //雨中飞燕之作! _+ u# l; ^2 J! p) Z7 F
    char csym[3] = "++";
4 W6 s. [' k$ I1 k+ Q    int nLevel = 1, nERR = 0;
' u+ }& _/ j1 a! @) g+ k    if(!(istrin>>t[1]))istrin.clear();) V0 [( |2 g' E. ?3 ~! d
    for(;;){
. e9 k$ Z3 O* M0 j, y( v; p        if(istrin>>csym[2]){* K* f( {5 i1 y- X
            switch(csym[2]){; k" k+ b8 q% \: b6 @$ @: o
            case '(':! [0 C# P! }# j$ T+ e4 C7 V
                if(!csym[1]){nLevel=0x100; nERR=1;}else
/ H! T/ p* K; Y                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) n" J$ G' w* j  W9 d; U                else{nLevel=0x100; nERR=1;}
/ b) [! m, `  V& Z7 M                break;+ r1 y3 R4 z" q% L
            case ')':; L( X' R" V- E5 z+ m0 H1 e- ?
                {nLevel = 0x100;}break;
7 I6 l. L% \% ?1 ]& W7 A1 k            case '+':case '-':case '*':case '/':3 K! w- @" e5 R: J
                {csym[nLevel++] = csym[2];}break;( J* B) `- q6 C* w! _3 S2 E
            case ' ':case '\r':case '\n':case '\t':continue;9 v0 v7 F$ ]3 t
            default:8 {0 R' M6 E/ r5 T* l! F% R: `
                {nLevel=0x100; nERR=1;}
! @8 X7 e1 B, J            }$ }; s% o" p% e$ s! q
            if(nLevel==0x100)break;$ m+ x3 b. Z% N# G8 B( u$ {2 Y
            if(nLevel&0x10 || istrin>>t[2]){
: l- y) W& f- U8 c4 y                nLevel &= 0xF;
- g( B* n1 d. z1 o                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 c3 ^  l4 b0 r3 _                if(csym[1]=='*'||csym[1]=='/'){
% S+ @  B9 M" \& {; ^& y: Z                    GetExpValue(t+1, csym[1]);
0 f5 c0 z: N, H0 c+ G& t- h8 s2 l                }
2 k& X* y" L1 ~                else{
0 s' X; w4 j* F( N                    GetExpValue(t, csym[0]);1 ?0 e8 a* i/ X
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;$ s% ?; s$ g+ C8 q
                }7 _" [! n& O4 j" F: U
                nLevel = 1;' ^& v. T" H( S
            }
6 {) T% N" M+ `3 k4 O" q            else istrin.clear();
7 R4 `% ~+ X/ r        }# F3 n% P! L# P/ |
        else{nERR = -1; break;}
8 d' w8 e: N& h' A' p# n    }5 R4 K: v7 q9 k# H2 R: r! ^2 W
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" F& Q" R  T% Z- b    else nReturn=GetExpValue(t, csym[0]);1 s, d9 \8 l; m; |2 M! Q
    return nERR==-1?1:0;6 w" M" x. n" {3 k2 B% [( `
}}8 ?1 \# i/ }: q  _( z. m* c

& c6 N' m5 H* ~  u# z
& u2 c1 {+ o  G% k5 Y7 P: e  K8 V3 O& P4 Q6 x, n
函数模板使用示例:$ }( y9 ?& R5 I( e
在以上那段代码的后面加上以下代码:+ a. ]0 c" ~& q% }' b, F

  r' X: Q$ z' n: G5 @4 f ) W  d' ^' _4 l4 Z
2 k- M) ~  [5 e' y2 a" E& |/ r9 K/ F2 b
程序代码: 0 s4 _1 r! J) m! l* p

& v0 T- X$ U: Q9 U1 Y#include<strstream>0 H; N* h, F, w& [" y9 x
#include<iostream>
) ?' L$ C% K0 Q. ?1 c3 w#include<string>
0 f$ i4 d* J/ D" N  K) X$ p& ]; cusing namespace std;% Y5 ~( K, |% d8 K0 u
int main(void)3 V9 j! p# x. s$ C0 h3 n
{" Y0 y( }0 E# w* V
    string s1;' A! v0 p/ q+ [4 {
    while(cin>>s1)
" J" N7 Z2 Z; }- p    {* n) F3 A. V3 L3 K. y* H5 r
        istrstream isin(s1.data());
8 [+ r0 s& ]! U; t) z( w4 `9 t) |        double d;
& l) A/ o+ J$ R: I        if(fy_Exp::GetExpValue(isin, d))
5 u- L. l' c: A% j; R9 |        {
2 p4 {9 B3 U9 b. x- p            cout<<d<<endl;
7 N9 H2 q" \7 i6 Y* G! X        }
4 ^5 P2 O  n1 d5 Q# `9 T6 k        else
- \' `9 h1 J4 m( r6 ]; z! t2 h, T& @        {
9 z5 j) D5 [# E& `7 S            cout<<"ERROR"<<endl;0 D1 r0 R- H0 y: g' |! h
        }6 H! ?% S0 l* g7 N7 Z4 M4 l
    }/ e' Z: P% k6 F9 ?, [
    return 0;& j8 M% h% g' B5 V- g( \2 b+ c
}
8 G- M! ]& |9 X' T
/ a2 |9 t: {( U" e( E' L2 A) }, b/ M$ c
然后编译执行就可以了(*^_^*): Z4 n* D& a7 q3 Z2 r
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 D! I& [/ ~" Z* E% @+ U      建议使用VC7或VC更高版本,或者使用GNU C++编译

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