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

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

在9月8日那天我特意编写的,给大家分享的,
9 E" V! @0 H& f; j一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& j; j9 o  w7 I; |+ h
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
: N  w  o. E9 h1 V  F( W/ U参数解释:1 p, _2 [, B, r: G
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
* `7 e  j+ |! o2 x/ qnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 l; [  `' k5 x& |返回值:5 r( z1 v$ F  w# |3 F+ K( ?; |
返回非0表示计算成功,0表示计算失败有错误/ u0 i% g! c$ Q: |& o! G
, M/ P: i% [. M6 h5 E* R, A1 m8 Z
- v7 A* q( E* ~* @; o) M! q2 Q
# {1 V) t2 j( [% C2 F  y  t# C
程序代码: & b' L+ n% L( w8 N

4 N4 r; a3 U; L4 Rnamespace fy_Exp{* p: O. e0 f( c3 a; i! M9 V
namespace {template <class _T>; R8 v- L. v) b, S. Y) @: S
inline _T GetExpValue(_T t[], char& csym){6 C+ B- o+ o) {2 S
    char c=csym; csym=0;
0 \- U) I8 M: O/ M    switch(c){
7 u# U# \) P9 A3 m2 q# x1 w    case '+':return t[0] += t[1];
+ s. D/ k. f; S) Q- W0 e    case '-':return t[0] -= t[1];, W  ~5 E+ U$ Q7 i7 p  i
    case '*':return t[0] *= t[1];
. z& C- n- ^' ^" U    default: return t[0] /= t[1];//case '/':
# [8 W: a. F' M0 d3 }+ k    }# o4 c( v3 }4 }; r9 }6 a: ^
}}6 }' s3 B$ z- ]8 Y& x
template <class _T, class _Tstream>( U+ d/ p. K# Q: v6 u) C' F% g
/* _Tstream: inputstream, _T: get return value7 t& d$ h. h. o$ ~
* Return nonzero if get value successfully */
7 w! Y, M! r$ K2 Xint GetExpValue(_Tstream& istrin, _T& nReturn){
6 i) A* {2 k" L7 Y4 \: W* E0 I    _T t[3] = {0}; //雨中飞燕之作
" T. v1 T) v7 \' A6 ^) D    char csym[3] = "++";
! S9 z" U$ R: R. ]0 e  a% ~/ `+ D    int nLevel = 1, nERR = 0;- l2 M# R# q# H- C# C
    if(!(istrin>>t[1]))istrin.clear();
$ S8 h2 @' s" E# u/ C4 m" [5 w/ @    for(;;){
% k6 k0 H; n7 `2 F: K$ l) b- B8 s3 H        if(istrin>>csym[2]){4 ~4 {" l; J, t9 E
            switch(csym[2]){
$ n/ w3 Z8 ?! x; \; ^            case '(':
9 Y! o6 D4 w' G; s                if(!csym[1]){nLevel=0x100; nERR=1;}else; w1 `. [. I4 p
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, a0 q" R9 O6 {$ F7 y
                else{nLevel=0x100; nERR=1;}
$ x" Y( m" i' Q8 u- S                break;
( P! V6 E& f4 o5 p8 {* h9 }- e- w6 Y2 X            case ')':
" e& n) I: h2 \. R# |                {nLevel = 0x100;}break;
/ H) h! g* R( x            case '+':case '-':case '*':case '/':
& x* q& {, ?( i1 w' o                {csym[nLevel++] = csym[2];}break;, k9 q2 {5 U' Q* \. \6 L# r
            case ' ':case '\r':case '\n':case '\t':continue;
# m+ B" ?% T4 d  P; L            default:# d  l! B( y3 b# Y5 P) T1 ^
                {nLevel=0x100; nERR=1;}7 J# ]" W; s8 w3 A7 ]
            }
) B' W7 m" \; X- J            if(nLevel==0x100)break;. v% W3 ^8 D6 c' V6 d: j  m8 R# N# H
            if(nLevel&0x10 || istrin>>t[2]){
7 N) c" g# M4 o7 O& ?                nLevel &= 0xF;4 ]9 g& O1 k) Q; k+ _6 F" G
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) C& L) _' k( B+ B4 a
                if(csym[1]=='*'||csym[1]=='/'){8 |( C! m& d! ~, @6 c4 o- {! h0 h
                    GetExpValue(t+1, csym[1]);
/ S: H3 k: }0 B) y: _9 ~& I2 ~3 j                }1 {9 H* z' j9 h
                else{0 B8 D4 o0 A5 R" D* _/ x
                    GetExpValue(t, csym[0]);1 r, C% N) J( f8 R1 {4 F
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! o' C+ D3 i* b% b6 {: y                }
0 K0 r' V8 |& I; v4 v4 l0 z, C                nLevel = 1;
/ I3 A5 `0 }) J/ a2 H            }' G* W/ }. g/ k  k. r# H, m: Z
            else istrin.clear();/ h- I7 Q6 P( \2 ^3 n& O1 ^* c5 S
        }
. j3 W' [9 f7 D# c' Q3 ~7 P        else{nERR = -1; break;}
0 m/ S* r- K" T$ K    }
( C  ]. n+ [- v3 y: \4 ^  Z* Q" \1 @    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 \( B6 t  _, O
    else nReturn=GetExpValue(t, csym[0]);
3 y/ G# M; v1 u- X4 O    return nERR==-1?1:0;
0 o: d" G) {7 @2 j; o+ j}}
3 s. c' B* I6 M# q  ^1 O
* `: l% }- p. @# H& E; u. x, K
/ {' V5 g7 r* ]* P6 z) p  [
# e1 n9 R6 j9 ^; H7 q函数模板使用示例:
8 `0 W' d0 V  h+ ~5 g在以上那段代码的后面加上以下代码:
! S: u0 K9 p" z6 X5 J8 Q% C2 a
- A3 H1 H, ?; D 0 \. r: V2 r! Z6 Q* A% O
! B% g9 o$ j6 k, o% u0 a
程序代码: 3 j8 X1 T! ^5 U* ^8 W$ |8 V
9 J: s- Z( P. a* G- a
#include<strstream>5 L' \$ \& a: d  s
#include<iostream>) u. n3 H; r! A: J
#include<string>
* Z1 I" R0 `+ t, L" m4 nusing namespace std;3 d+ O0 l! l& P4 h) L" `% P7 o  q
int main(void)
3 m0 y9 t  x$ y. E7 F+ R5 \{
" t$ \$ G1 }- o5 f: ^, y    string s1;
* ]6 m1 F: y, ]3 C# f/ V! k; y    while(cin>>s1)
; T5 j7 Q! Z8 Z/ C    {
4 E, K  e& ]& j2 C        istrstream isin(s1.data());
5 D' A8 j0 V! s& f% T3 Y        double d;
0 g& |$ x2 ?% E! {        if(fy_Exp::GetExpValue(isin, d)). |( A+ C8 _! ?# K* @  n1 A
        {: o+ b, V) v: E) g
            cout<<d<<endl;) d: Y; _, a6 g; d- J* Q
        }9 {& n1 V4 w, f3 V) {1 F  e" ?
        else
. s7 e/ h3 ?4 \. H  i! [' f        {+ v2 D  k/ R1 J% h9 \* ]6 K4 Y
            cout<<"ERROR"<<endl;
$ q# W$ Y4 o! l# U2 x4 @: j        }) Z6 n4 [1 |! z0 b8 |7 D
    }& |6 g, U( F) H5 H
    return 0;* f3 M5 q; s2 p3 N
}
3 m4 j9 g2 Q' s, Q) U+ w+ H7 [5 r5 e) @) C
4 Q3 S0 j- E/ X1 ~" x# L8 ?
然后编译执行就可以了(*^_^*)
" X& u/ m5 v) Q) q其它:TC++上一定编译错误,不保证在VC6上也能通过编译
2 j$ G5 i- _- z- b; `0 W      建议使用VC7或VC更高版本,或者使用GNU C++编译

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