返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
7 a! C- u0 X5 n8 I, S) J一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) S8 ?- B- Y7 W4 V6 m只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
2 A8 _: m/ a" z4 I& w参数解释:7 r3 B8 q2 X; A6 ^$ D% w$ t
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 r3 X. p* J  Y* _) v5 A6 I
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 K7 \- T# n/ w& x返回值:
( H' d; \/ l& {! a% h' S返回非0表示计算成功,0表示计算失败有错误+ ]& g% j4 d' K
/ C6 s: M6 I& a$ N& k
* S' S8 _+ @- F

6 Y& G3 S& V+ O8 {1 C; [程序代码:
8 X& D+ F4 p9 O/ [  [: k9 Q% b5 u7 d( P$ f
namespace fy_Exp{+ f' \4 U8 P" Q
namespace {template <class _T>! {8 o$ ?+ r9 k7 V6 y" t
inline _T GetExpValue(_T t[], char& csym){
4 ?0 v$ @1 h. H5 N! F6 A! f    char c=csym; csym=0;
. [9 f1 O, b8 F4 O: }( \9 N& }$ H    switch(c){
7 a; H' i* d8 X7 o* k3 ^    case '+':return t[0] += t[1];/ ^8 X! S6 q3 Z4 }# g  P/ ]
    case '-':return t[0] -= t[1];$ |' e3 Y- M! P: b: J+ d2 e
    case '*':return t[0] *= t[1];
, j6 H6 s( Q4 S) K    default: return t[0] /= t[1];//case '/':
/ [+ C: @. `& C& X( D! x3 G3 Z7 M    }0 L  Y4 {' O2 Y. u. ]# j8 Q
}}
/ k+ D$ M0 r9 I4 ]template <class _T, class _Tstream>
+ |) y% P* ]9 X" e, z) o/* _Tstream: inputstream, _T: get return value
8 [4 {, ^( O% ~* Return nonzero if get value successfully */
0 @1 f! e: `# V# oint GetExpValue(_Tstream& istrin, _T& nReturn){! |! `" h4 D$ O: g4 y
    _T t[3] = {0}; //雨中飞燕之作2 T6 z1 E; N5 P9 f
    char csym[3] = "++";
0 s' K# x- z. T0 c    int nLevel = 1, nERR = 0;
" t0 `4 o6 {# z6 @. v, p    if(!(istrin>>t[1]))istrin.clear();
0 U% o  k0 ]7 ?  |* [    for(;;){
9 {% t3 ^4 n- S: [; X5 g" u        if(istrin>>csym[2]){& R; d% J! o' P  y+ S; P/ s+ t
            switch(csym[2]){
" z1 F- J/ X3 M1 w            case '(':9 C4 W8 c; `- _. N' @% H) m
                if(!csym[1]){nLevel=0x100; nERR=1;}else, D$ o8 E) i- O- D' q. ]
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
& h/ u; c7 a2 W  ?9 ^5 F                else{nLevel=0x100; nERR=1;}4 A" F1 e' P2 ^
                break;
+ \& v0 G) Z: G            case ')':
: W! P8 P1 U% E1 f: j                {nLevel = 0x100;}break;: o' L6 u: [' \, r6 q
            case '+':case '-':case '*':case '/':  J! `2 b8 j( z2 J& ?
                {csym[nLevel++] = csym[2];}break;" b  [9 f7 J% g4 H# a6 p5 [  y
            case ' ':case '\r':case '\n':case '\t':continue;1 ^5 w5 u& t$ o% T5 h7 P* Q
            default:8 p4 B& c" [3 O
                {nLevel=0x100; nERR=1;}1 ~2 S2 W5 l+ Z6 T* w' B) j
            }. J+ Q  n3 x5 M/ u- E& [: r. G
            if(nLevel==0x100)break;
- G( n, B" E$ M/ b/ [# g            if(nLevel&0x10 || istrin>>t[2]){' v& O% ^) b0 [  i3 v1 r
                nLevel &= 0xF;
$ X" y0 o% _. n. ^. S8 s                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, J8 t" [8 Z4 A! A- h! j4 c" G
                if(csym[1]=='*'||csym[1]=='/'){( R8 d3 x" `) r
                    GetExpValue(t+1, csym[1]);
2 J  G3 A& W% \# Q( m% G2 l                }) d% K1 |4 I  [. d8 J# ~
                else{6 ?4 O4 Y% k6 w" v; @
                    GetExpValue(t, csym[0]);
8 @, e: a% U7 ?/ f' j, a: r* \                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& e9 t0 D+ S1 o& J" y2 Y/ f* \                }
1 b+ b( l/ u/ |& h  X( e                nLevel = 1;1 U( l$ b6 R4 I; C' `) F4 o
            }2 A% {# B% ^; G( w! |$ L
            else istrin.clear();
2 Y: X( n( W5 }5 H8 c2 v0 U        }
+ W& I7 _4 w: A% w6 L9 H8 U: J        else{nERR = -1; break;}
/ B$ x0 U9 w: ?- ?    }1 _5 W# }7 X! i7 D
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 f) b5 \( Q8 m2 L/ O; p" G% |6 S
    else nReturn=GetExpValue(t, csym[0]);9 |  B; h0 `( s) e7 c9 b! y
    return nERR==-1?1:0;: d- R0 T: ^, a: D- q. e- f1 v
}}( H- t: H: n* H6 g% T( c2 Q" I
$ }, Y4 Z8 O) J4 R- s9 H. I' ?5 j

6 S2 x9 ~- B. n0 {, }) r+ G4 L7 B' O' f
函数模板使用示例:
7 k8 S0 R1 @7 `" i' I/ ^在以上那段代码的后面加上以下代码:
: N- G% L' z7 B8 H# Z. \2 r" L  R9 R8 G3 t8 z
3 K* ^6 Y* K) w9 `; N

5 L. |  p+ m$ k6 _程序代码:
8 `& Z3 X: @  M8 u% h8 B2 n: d! |2 m8 }1 J3 y
#include<strstream>4 P3 R* y% w% u. i+ L4 ]
#include<iostream>
4 f. H8 D; l6 U) q& `#include<string>2 U' c9 @( B  O4 o  N
using namespace std;
) v6 ^, K" x5 A6 I6 {int main(void)3 j5 Y+ ^9 O2 \* s
{
7 w# B) n  F* U; x" k( C    string s1;( z5 F) M7 ]% `/ _& V1 m: {7 w, X* O
    while(cin>>s1)# O1 U" D1 P8 O9 s
    {$ j$ j' y& t8 ~& u" K" l
        istrstream isin(s1.data());
5 u# }$ s! _- t5 E' h5 Z) v        double d;3 M- h# }1 b4 \3 ~0 n
        if(fy_Exp::GetExpValue(isin, d))
, G1 P: X% ^& V4 {/ Z        {
* ~. T, u" k+ K/ I) L" U            cout<<d<<endl;; r. u2 U% L* B6 ^, P
        }
" r, H! s1 l, A5 a  G+ N6 w. L        else
4 u" X2 W! Q8 U6 P' z/ R* E3 N        {  m- }! a- E3 S5 u
            cout<<"ERROR"<<endl;
: r# e9 @- c& w& p2 V        }
8 Y7 ~8 W; _, u' ]+ }+ z    }* R5 D8 C4 ]. d) ]
    return 0;7 V5 b& Z% W* D" A
}5 c8 m2 z+ f; P+ [; u/ o

" ?# E, O* C. t7 ]1 D0 }; \
, V( m+ q6 O: {然后编译执行就可以了(*^_^*)1 ^3 m- G& V& }. _
其它:TC++上一定编译错误,不保证在VC6上也能通过编译: O& q0 @7 [, e( o9 i$ U
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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