返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
3 B: K  _8 w5 F* c+ U4 X+ K一个很方便的函数模板,可以并且只可以计算含括号的四则表达式6 H3 J4 I. W3 W- m
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
: `  k0 b: V3 S4 P8 U* `0 Q2 b. Y参数解释:
# K: a* K5 P( K6 nistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) d* l( s( c7 i, a/ o5 m
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定- }# c1 {+ W+ c
返回值:
. y" r/ e% U  r6 S, ~返回非0表示计算成功,0表示计算失败有错误
; ?1 R5 F! E! W- E# r  `
( ?1 k+ ~# x; _/ w, R; {7 N , c& g6 j3 V! y7 @
. j% }, i% ^: A; P7 u
程序代码:
1 @% V6 a. }& P: n
7 N# }! _: @! U: X* @5 _namespace fy_Exp{
* s" ~" @# A! fnamespace {template <class _T>
7 h0 q1 x) L; Dinline _T GetExpValue(_T t[], char& csym){
- K; B7 O6 }  r3 V% I    char c=csym; csym=0;
: G- T9 }% p. ]8 P' `    switch(c){
, G. U! e  _/ \( V) K; z, h    case '+':return t[0] += t[1];
3 }+ D/ J8 [) [2 [    case '-':return t[0] -= t[1];; n7 K5 p" E) f6 w8 z
    case '*':return t[0] *= t[1];5 V: ?, e5 @: B/ M& x: Z& @- l8 N
    default: return t[0] /= t[1];//case '/':0 ^+ p7 j' Y( {, S$ u- g
    }
* m5 E0 J+ ^( z  N& T}}( J* ~# y) ?" ~$ M. C
template <class _T, class _Tstream>+ I+ m" b# h. `, e, k
/* _Tstream: inputstream, _T: get return value" t5 `  Y& k& T+ f+ j/ F
* Return nonzero if get value successfully */
; \9 s& ?4 E  u& s2 ^, @& f1 s+ Nint GetExpValue(_Tstream& istrin, _T& nReturn){9 x5 u+ l% r0 f) Q; V; b
    _T t[3] = {0}; //雨中飞燕之作3 x" C% q3 A9 i5 D' X% p. k4 ^4 p. z9 j
    char csym[3] = "++";
/ s: @) W, \) w# M" Y0 f$ P    int nLevel = 1, nERR = 0;) [0 a+ n* O% H! f+ t  ]
    if(!(istrin>>t[1]))istrin.clear();
$ ^% V& d. @' {    for(;;){
# Q0 k4 r; m' v* Y" P1 b8 P        if(istrin>>csym[2]){
) w& {! u$ t* c# d7 x: L            switch(csym[2]){
2 d9 x5 x/ y; U, ^* \            case '(':) a$ G% p1 B9 `+ f& W5 k
                if(!csym[1]){nLevel=0x100; nERR=1;}else* B) p; E3 z6 ~( V2 I
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;4 T/ C: b# D) m3 r
                else{nLevel=0x100; nERR=1;}8 H5 d6 ^$ }* b, S( h2 g& A- \
                break;
5 w4 _/ L1 k$ y/ V, c            case ')':& m6 u$ ]& L  z1 `9 S1 l% P+ D
                {nLevel = 0x100;}break;; w0 a% R! Z" S2 g( j+ r
            case '+':case '-':case '*':case '/':8 z, b( V( {2 M- y3 u
                {csym[nLevel++] = csym[2];}break;
% @& L3 q2 u* A, R; n3 @" Z            case ' ':case '\r':case '\n':case '\t':continue;3 D7 a) [( j* N9 y- W, {
            default:
' h; z5 S$ [# _) }2 r1 o3 @- s                {nLevel=0x100; nERR=1;}
" P( _5 n! v+ @            }
( M! ~" n6 c% r, }            if(nLevel==0x100)break;
: \+ g" L, z( H) T0 s, K            if(nLevel&0x10 || istrin>>t[2]){
. w5 `8 h5 }" O2 f6 u                nLevel &= 0xF;
7 d; Q2 [, k3 a; J                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
$ M9 |( L( C8 G* W7 N+ u6 z* y( A8 m                if(csym[1]=='*'||csym[1]=='/'){
7 U# X- g1 V. ]                    GetExpValue(t+1, csym[1]);
4 S* V( o5 J& G                }
0 `, N$ `9 g) B                else{
4 ]/ I% B' U7 G                    GetExpValue(t, csym[0]);" F  y9 X! V0 O& J6 B1 \
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;- o  y6 Z& @  r9 {5 l  P* m" I
                }
% e+ B# K1 [$ ?                nLevel = 1;  O2 B; a0 C3 w( m0 W! S+ s
            }
; s! D( R, A7 g1 w+ R7 f  ?. L            else istrin.clear();
7 G$ g& z, T  M        }* ~! B4 ]9 H: J1 \- b& ?6 _) \
        else{nERR = -1; break;}6 D+ {% Y  K% w
    }0 M0 T) P% H' D
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);0 [; s5 B- O5 v7 F
    else nReturn=GetExpValue(t, csym[0]);
0 m! l" _  `$ ?- e    return nERR==-1?1:0;
$ q& ]0 }% b4 X. f% l, q}}/ ]; n: {3 M; J1 N8 ^5 r) n

: K) ?. O) E/ L# V& ?. @& T) o! O

" t0 k8 K% g$ Z/ d# a函数模板使用示例:. \8 h! @, O+ `/ f
在以上那段代码的后面加上以下代码:
4 t+ k7 u$ D  b$ O( Y! v4 u; R/ Y) p9 n

/ _9 X; h* N6 ?1 y; k, W7 h2 m
. F, o5 @+ c% D1 [2 V程序代码:
2 M$ [% m- G% o  p' V# A; \# S- z. c
#include<strstream>  B/ r) O0 t6 u; T$ f
#include<iostream>% c5 @1 X1 V( y" ?% i
#include<string>
8 `3 M+ x- x7 h) c( Y' U! }using namespace std;
, Q3 g; P1 u% N6 I5 u& @0 r4 bint main(void)  `% `5 m- f9 U" L% q
{
, n0 W; S+ t/ T* @    string s1;
4 B4 C# n% o. z' R5 G% p3 B    while(cin>>s1)4 D: |  R9 _9 M4 J% m7 a+ P
    {& ?4 \# L) C; `8 G; x2 b, W0 Y5 \0 W
        istrstream isin(s1.data());  _1 E# N8 d- \- M' l0 |
        double d;
- F  p/ a( B" E! x6 K        if(fy_Exp::GetExpValue(isin, d))* Q3 S0 J" n, F
        {
/ y- @/ _/ G* G$ P( b/ ]            cout<<d<<endl;0 k' X  y3 ?6 \. l; p
        }+ |  v6 y" _2 ~  Y% T; h
        else) J3 D6 J* E! f$ X2 [! h9 j; T
        {
9 a: T2 T* J- _8 M) v; h5 Q# k            cout<<"ERROR"<<endl;
- R" x' V1 ?, k( ~1 K  m  B  n        }
/ \( X. M; `6 S; b+ w& y( k    }
& O2 `3 j2 E% m7 m! _    return 0;  I. o" r/ h" `" ^/ c. ^* M
}. C8 B* [8 n: w
% E2 G" l( n" J' I

$ F' K9 q% U2 j/ K/ l( l3 n5 f然后编译执行就可以了(*^_^*)0 `1 y$ h/ o4 v$ ^0 k
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
  d+ G2 X0 T& {3 @  l! I      建议使用VC7或VC更高版本,或者使用GNU C++编译

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