返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,/ ^, `) y9 x: ~( t5 {( X% [
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式0 u, ?8 `* I5 [6 K1 o+ S/ ~  |
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)) l7 T* i, K/ n
参数解释:
- O8 ~- y) D; U/ x( a& J5 Iistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 S& T) ~; e: K/ t
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定# N9 q+ r, v* S# U
返回值:
( Q6 e$ S6 @$ g6 b返回非0表示计算成功,0表示计算失败有错误
% M* b/ Z& f! n) x3 }3 a% c5 v! d$ T1 V7 D3 }% Y
! V) r- k" W  k

/ d0 Q4 Q& Y* b$ m* d* f程序代码:
3 J, z1 U% A5 _, T+ o5 x4 t; E. ~5 n1 J: Q" H  J
namespace fy_Exp{
* t8 _; O5 Q: u+ o( \) ]2 Onamespace {template <class _T>
8 W7 v( E, D4 q8 Yinline _T GetExpValue(_T t[], char& csym){& B5 {5 p& I) M$ i( T( p' `
    char c=csym; csym=0;: W( S5 t1 @1 H# P8 }4 m) I& Q7 U
    switch(c){
6 _8 P; L2 \+ L4 e" a: O- y$ Y    case '+':return t[0] += t[1];
! u. x1 W# s1 ~! i* T" N    case '-':return t[0] -= t[1];( A' z. |. ?6 {3 }
    case '*':return t[0] *= t[1];" P* g( E' r. S
    default: return t[0] /= t[1];//case '/':0 C9 Y1 S5 P. Z4 A0 t6 k
    }3 f5 t* y/ U) Y0 K
}}
5 B/ a' N. @1 h3 A1 k2 Rtemplate <class _T, class _Tstream>2 m9 W, v) N, U7 X/ M
/* _Tstream: inputstream, _T: get return value+ R, u0 p2 N9 N. c0 Y+ c) E
* Return nonzero if get value successfully */
) i/ x, E/ S7 T9 n# qint GetExpValue(_Tstream& istrin, _T& nReturn){0 a/ T- w+ A1 V2 e2 M. h: v- B
    _T t[3] = {0}; //雨中飞燕之作
. `5 B  t1 G( e' T0 O    char csym[3] = "++";% P( o, H+ `& C: S
    int nLevel = 1, nERR = 0;
$ i2 s: |3 X7 O; _- y0 ~    if(!(istrin>>t[1]))istrin.clear();
$ z: ~" d! z1 d/ o9 [: m    for(;;){! N% d  H+ ^: t* p9 e
        if(istrin>>csym[2]){
% [" A! b, \" U9 D* ]            switch(csym[2]){
3 _# E! ?8 e2 P& J/ w            case '(':
2 L: l8 [7 K& [7 F- g                if(!csym[1]){nLevel=0x100; nERR=1;}else* Z" \+ Q5 d( R1 q; p' p
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
$ {( e0 D  d' d% r                else{nLevel=0x100; nERR=1;}
- D/ `: a. ]3 N$ N: ]! t                break;
' E# G, [( A# P7 F            case ')':( R- v( w  I) A. m4 [& U3 A
                {nLevel = 0x100;}break;5 C& _+ C' V9 j: l" D% \0 ~, n6 Q; G3 t
            case '+':case '-':case '*':case '/':
3 r" Z# J* d+ G  B5 _4 S# q                {csym[nLevel++] = csym[2];}break;) `6 b# c& K9 z+ h0 E$ |$ U4 f
            case ' ':case '\r':case '\n':case '\t':continue;0 V4 a/ ~7 [7 K: ]2 D
            default:
6 A9 Y" ?# a* \# q8 T9 z                {nLevel=0x100; nERR=1;}7 g- `, f/ Q+ d/ H$ c
            }
8 ~# R2 e4 ?& B7 }' W0 e            if(nLevel==0x100)break;3 O& c  H4 D- \
            if(nLevel&0x10 || istrin>>t[2]){5 e2 i6 F1 W, j; n3 X8 c: i1 Y
                nLevel &= 0xF;
4 _$ b; R: y+ n4 k1 b                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
  P8 d% x9 Z3 `6 p9 s                if(csym[1]=='*'||csym[1]=='/'){/ g9 L5 q# _6 _9 q2 T7 B4 L0 z
                    GetExpValue(t+1, csym[1]);
: c. y, E% ?3 C# Q                }
. }3 @$ \! d! t( [8 @( P                else{5 f; R3 ]' B* d6 g' M4 C. m
                    GetExpValue(t, csym[0]);# |5 Q) K0 m9 \) G9 n1 s
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# S6 M% [2 V8 q; a9 y8 v5 @. x# L                }' [7 O: d  q  N* k0 [
                nLevel = 1;
7 E0 w7 a4 T5 ^; {+ h5 }, w            }  H. t$ o5 S- c  h7 v" T$ d
            else istrin.clear();
) _  n0 v& K7 Q* Y2 C" I        }& ?, g5 O& ]; |( S  l& s) W( A
        else{nERR = -1; break;}
! o$ o! x) q) i. ^8 f- p) F* l. W    }* ^! f* L' v7 d' {# B; d0 Y! z
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
) d# I3 r+ S) n! @+ D1 t    else nReturn=GetExpValue(t, csym[0]);( {2 p6 ?* I: x) G3 r4 c
    return nERR==-1?1:0;
! f5 ~, z7 V( }. g9 H8 P}}6 s- U4 Z, d& r+ M& R7 T  F

& Y2 P! U, ]; |+ N" l
+ l1 h9 [  D2 W9 u5 W) S" I9 c  w# Q. K$ c. ^5 a
函数模板使用示例:0 y$ n/ n( l2 V: J2 i- y/ y
在以上那段代码的后面加上以下代码:
, y, R6 b0 G: b1 v6 [. s$ A5 J8 G+ N2 u" p
! d1 |# j& p8 S8 x7 W

$ c) N: g6 d+ v  P9 w# s程序代码:
2 U% ]& M% s: V; _) c; k- Z; |! |4 r; `# w2 {- ^
#include<strstream>
; }- l4 D' j" |) c' \8 q#include<iostream>
( B  Q1 S% K9 G9 y#include<string>
# q; p3 x2 s* {1 v2 Kusing namespace std;
' o! ^& ?* y0 I5 w9 zint main(void)1 `' T$ n4 h) v7 M& a2 y+ j( {' N
{
) |" N* E, i  w9 Z$ t/ W    string s1;
- [4 W. o" T  M/ I6 J    while(cin>>s1)
0 y2 E) r4 u1 }6 P: T! i" r    {& ]# F6 g1 q& R) D! G. V! v. }
        istrstream isin(s1.data());
6 [4 [( F0 R+ P7 T" x$ b# U8 W( f        double d;
' P6 `! L  t" i2 Q( z% \- Y        if(fy_Exp::GetExpValue(isin, d))
7 \# \4 S6 F' ]% S        {1 V7 m; o' B: Q! F
            cout<<d<<endl;
/ S3 Z" V7 Z( N% x        }7 v: @) u* c( c
        else9 B( x) o1 Y, Q) m; Y6 Q
        {
$ g  K4 {5 v  R            cout<<"ERROR"<<endl;
! u  o8 G/ D( _- I        }
# }+ G/ f: U7 |* |    }" M. I& C& F& _/ @4 w; h. e2 Y* g% t
    return 0;
0 x/ G* L+ g  O. f}+ \1 M3 ?3 [; e$ Y* i

8 t  O  S9 Z1 t0 \; L4 u+ _4 Y6 I8 h& ]3 u! T$ ~/ S
然后编译执行就可以了(*^_^*)$ J" F! `6 E& n6 @. V
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& c6 `3 V5 ^! \: D2 n$ N! `0 X8 J6 J      建议使用VC7或VC更高版本,或者使用GNU C++编译

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