获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
* e& c/ t1 m& q  ?2 {! B; L* f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 H3 v- A) s+ s, y# L. }只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
: ~* _6 _' u/ }, @/ b' W参数解释:
* I( a5 H7 d$ Cistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ z5 `6 A* }3 n4 n/ ]$ O8 W
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. i; w) D" v5 M6 n5 d$ Y
返回值:% }$ u! D! A8 K$ k' Z
返回非0表示计算成功,0表示计算失败有错误' u- }* x. S% o% N' S# I

2 S4 s/ `7 R2 {' ?/ h/ A! I
  `# j; b/ C7 N; l7 b  u  D9 L6 \8 S# V7 t3 W0 {8 Q0 J/ {! V$ A2 z, i0 {
程序代码: 4 U( c1 W  t8 M) P& `
0 c# |$ G& @# n6 E" W, h& ]* Y
namespace fy_Exp{
: L3 v2 R7 D: b& f; K, \5 p3 Snamespace {template <class _T>8 w+ H! A, h1 ~$ P0 |
inline _T GetExpValue(_T t[], char& csym){
, ^- S% l# C' a7 ]    char c=csym; csym=0;  w6 O4 T+ ?; d. q. {5 P
    switch(c){
4 J- Y$ I# j- v    case '+':return t[0] += t[1];
6 e: H5 g8 a, V9 Z& o+ @+ G; p, C7 A    case '-':return t[0] -= t[1];5 ~* ^& a  Y$ R  r4 Q- r
    case '*':return t[0] *= t[1];
" w" _& S' c5 s4 @    default: return t[0] /= t[1];//case '/':
3 p$ `( _! K' k    }
1 W3 o$ m+ L; `2 o5 c7 {: p}}- ~0 e3 n. Q% _% [: |1 \+ J7 S
template <class _T, class _Tstream>
# @1 a* q% {* c4 Q6 W/* _Tstream: inputstream, _T: get return value
$ x9 A$ p  b0 J3 a: O) W* Return nonzero if get value successfully */
2 [/ K% l6 }1 d, }, pint GetExpValue(_Tstream& istrin, _T& nReturn){
1 o9 R# P2 G% y2 h  E" C    _T t[3] = {0}; //雨中飞燕之作
! r4 E" f( V3 U. ]/ a    char csym[3] = "++";+ }% O" Z  ]! O( b5 a& z5 p1 e8 t8 w
    int nLevel = 1, nERR = 0;
5 u  H* }; m  Z5 m# P    if(!(istrin>>t[1]))istrin.clear();
2 c8 ]  [) i4 L& W3 B    for(;;){8 D. b! L# ~8 u. m
        if(istrin>>csym[2]){
. r7 h5 L8 D9 H' m            switch(csym[2]){
3 i/ u& q' B3 U            case '(':; ^  ]3 \4 W8 g7 [+ v/ `
                if(!csym[1]){nLevel=0x100; nERR=1;}else% C5 F1 o8 t2 g
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 r1 I  z3 l0 D9 r& x. Q                else{nLevel=0x100; nERR=1;}. p  l/ ]' {; x; \5 O' y& q' H
                break;1 \: u/ P! I4 @/ S  O* J: K
            case ')':
# t, M7 R4 Z7 y0 Z7 l9 Q                {nLevel = 0x100;}break;6 {- I' `! n: o1 W5 V& T- _8 g) U
            case '+':case '-':case '*':case '/':
9 M% l. }* r4 Z9 p                {csym[nLevel++] = csym[2];}break;
7 o8 n+ \  h7 G# V; ~            case ' ':case '\r':case '\n':case '\t':continue;
. Y: g9 g; G" }9 p+ d+ j            default:( S6 C$ S( |/ r+ v( B
                {nLevel=0x100; nERR=1;}
2 X( l# N3 B! D, B: G            }
) _( \# e, l# V( B9 l            if(nLevel==0x100)break;
" t7 y# ^5 a% P- q            if(nLevel&0x10 || istrin>>t[2]){
. D7 }9 v' h# ~: ~( k% G                nLevel &= 0xF;$ F$ X$ @7 N5 r' e9 M& X6 k4 X5 ?
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 ~/ L1 y9 U* K                if(csym[1]=='*'||csym[1]=='/'){* X: ~/ g+ k9 R3 U4 c# q; R) _
                    GetExpValue(t+1, csym[1]);
' O9 O$ i" i" ]9 R' S                }  l" V6 g1 J' C
                else{6 L; ~2 H( g- c, D
                    GetExpValue(t, csym[0]);
/ r3 x8 B  O+ p. n9 {. g                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ G  d" e% y# R3 |                }
) g! _4 V* t. \, `; O6 {1 J, w                nLevel = 1;  f( x( p+ h0 `; c0 N
            }
3 P0 j9 R' a8 O1 P  e! [! v3 a            else istrin.clear();
# O: y; |! {9 }% i  d, R, N: s        }9 `/ v9 y3 Y. J6 S& a
        else{nERR = -1; break;}) e  x* R- n) \0 m
    }: b& j4 W! w3 G; L" E
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 Q2 X3 K( E0 g! t% \. Z
    else nReturn=GetExpValue(t, csym[0]);0 U2 U  N- \: T7 m7 f8 A6 ?! I
    return nERR==-1?1:0;6 a# c* d6 E4 T9 \, ?6 h4 a
}}
! x5 B- i' h) b) g. x. V2 f! c" C" R* ~4 R5 Q) W. w* A

3 E* A; `4 d5 r/ l0 B) J
. Y) D9 L2 S' s9 R5 R, b函数模板使用示例:
/ s9 v. z" I: z; F9 K0 v$ r  f在以上那段代码的后面加上以下代码:
, u* ?; W4 o3 K$ q2 @8 B6 l* F1 p/ N% }6 H& S( e

  i* c' j3 t8 J/ h" q& }
/ N& @; b- i) m程序代码: / Q* ?$ ?8 U. y7 F4 G
2 T& y+ t' a6 S+ M2 U( n3 F5 e! S
#include<strstream>
& ^+ W) z8 O+ Z5 V" J#include<iostream>- @. T$ g& h/ s9 q. Q' C
#include<string>
& q/ n- A1 T6 lusing namespace std;
: Z1 v4 S$ l: S9 }, M! E: Q" Fint main(void)
+ h9 I* [# x/ }5 M: N: X  j{
3 {* Q  N6 C' \3 ~/ ?    string s1;$ ?7 t4 l% Y2 O
    while(cin>>s1)) z+ A; b+ G& w  F' \
    {( I2 G4 }7 K( e  s  z
        istrstream isin(s1.data());% c3 ^" Q0 @  ~- c5 @+ k3 p
        double d;3 G; e& _; q9 @7 n& A
        if(fy_Exp::GetExpValue(isin, d))
8 Y$ m2 I9 `+ {0 @$ f        {
+ q( @+ z* ?1 d8 t4 q9 |            cout<<d<<endl;
9 o; m: `) }" \0 \/ k& T$ g7 h        }
8 E. v5 e1 H1 t5 E        else  v* {; s3 h% q# [/ D
        {$ Y. H: n1 u4 H  v2 w* Q
            cout<<"ERROR"<<endl;; B- u8 ]) u; t# C$ o/ o* F, ~
        }) A+ X8 C6 m6 i( A
    }( m! W0 d  _1 n& ]
    return 0;
! p0 R/ t) R' Y- o: N}
7 W% a) D8 w2 Q, l# `0 v0 T7 j1 V
# O; x" q7 ~+ m& b
- L  D2 z$ k4 ?' A7 t然后编译执行就可以了(*^_^*)3 G6 G7 ?) ^/ l
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ x! ~7 }! G( P1 ?: w      建议使用VC7或VC更高版本,或者使用GNU C++编译

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