返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
: j4 P7 ^) z; |; X) [一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
; F8 M$ B( w( ?. i, n7 ?只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)* h& T9 h# B0 D4 ^( y; a
参数解释:  T1 i: T0 Q: f; A% n9 E, B
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; `* o0 g+ e5 m: `* k3 ~5 S9 bnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 ]8 o" y8 T3 f  S( q: _7 F
返回值:
- n4 d9 m1 O( J5 O1 J% Q返回非0表示计算成功,0表示计算失败有错误/ L- q9 s2 X1 b% K& c# d! P
' ?. C6 R% ?2 v/ D# a0 a2 Y

/ ?) }# f- g) F. l3 w% ~7 }5 `4 C: E' C; b7 n* S7 z/ q
程序代码:
( G9 c/ e$ @; m& m: ~3 T4 ~
; a' v  n- x$ n1 dnamespace fy_Exp{
7 {  K% b$ C& o+ S: Znamespace {template <class _T>6 t" n! ~# O5 W5 d3 g# i! B- G
inline _T GetExpValue(_T t[], char& csym){
0 J) C& m" s2 @2 |    char c=csym; csym=0;' k; o' m+ q: r6 F  L$ A
    switch(c){: ]. x; }8 j, {, w$ X. H7 w- Z* O
    case '+':return t[0] += t[1];
# E1 Y# p# G5 d; r3 {    case '-':return t[0] -= t[1];" V3 R  v( O  {$ o
    case '*':return t[0] *= t[1];
3 G( M$ F; a. P3 a5 ]    default: return t[0] /= t[1];//case '/':
2 L4 D: s$ Y( J7 @    }& n* x5 \" T. W) ~9 J
}}, Q' ^) \3 J% M1 E3 `5 _
template <class _T, class _Tstream>( b6 h: P, w4 p, _0 H
/* _Tstream: inputstream, _T: get return value% z! ~9 _( [  T: R/ ~6 h9 H
* Return nonzero if get value successfully */+ ^4 `8 e9 l$ C7 I6 G" ]1 c; r6 N
int GetExpValue(_Tstream& istrin, _T& nReturn){% u) C  u8 ?" F
    _T t[3] = {0}; //雨中飞燕之作5 V/ g; [7 b' L0 E( L* }
    char csym[3] = "++";1 Q8 s( [2 l/ }6 \1 y' R* f
    int nLevel = 1, nERR = 0;
" [5 w+ u- I, [, N$ q& Q5 B    if(!(istrin>>t[1]))istrin.clear();
. h5 S: z! i0 _! W" e    for(;;){5 u  t6 q" V* N* z; E) L8 w7 N
        if(istrin>>csym[2]){
7 t: ~0 a8 K6 ^            switch(csym[2]){
3 ~! l3 |5 Y% O            case '(':
" C; M/ ^. b# N8 Q( \                if(!csym[1]){nLevel=0x100; nERR=1;}else
( T8 a. b; \- y; n, N- Q                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;$ ]2 }6 R2 t3 B+ V# V6 I
                else{nLevel=0x100; nERR=1;}! }. q( w% @5 ^3 s
                break;& ^6 H4 E* i7 j% M
            case ')':2 f$ L: ^; f  B$ |% ]& C
                {nLevel = 0x100;}break;
2 `) a+ Z+ V* W            case '+':case '-':case '*':case '/':: [2 R- k; l6 {/ y2 M
                {csym[nLevel++] = csym[2];}break;
& X4 N' L* y3 O3 o7 ^9 x            case ' ':case '\r':case '\n':case '\t':continue;8 }: X6 \8 L7 m2 W, l9 y/ q8 D2 f
            default:; e9 K/ o( a6 l, |& |, U- z
                {nLevel=0x100; nERR=1;}
( G3 A8 b8 v  F            }# F. O  ?' E+ m  Y
            if(nLevel==0x100)break;
% q! I% l* e$ x3 Q            if(nLevel&0x10 || istrin>>t[2]){
) k# C' O! x( N" u4 n, ?                nLevel &= 0xF;
6 K4 f- ~( y: l" \                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 E0 i2 h) \8 E' w
                if(csym[1]=='*'||csym[1]=='/'){
, l) L% t$ j" ^9 w: c. F                    GetExpValue(t+1, csym[1]);
$ U  ^1 Z+ z8 \* M2 c$ ^' }( U                }' T, j. j1 b. I9 G% X
                else{
8 P( c. L4 d& R( E& S& X  F                    GetExpValue(t, csym[0]);" |# e) ]/ s% w: h! e: d! q+ ?
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
- r4 D7 m: h" h3 O* b8 A1 Q) X                }, W2 y7 `( i& }5 q& y5 k8 d
                nLevel = 1;
4 ?# e8 X, ~8 {1 \            }
/ P2 b( w: q9 F0 W; C7 K            else istrin.clear();" c( u7 s+ O& ]/ h
        }4 ~3 Z6 R) E$ y8 |% g. y8 H7 c( E
        else{nERR = -1; break;}& P  f- D1 g: e3 x1 c( C
    }$ G) k% D7 W# R1 F
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" A- {/ C5 D. S    else nReturn=GetExpValue(t, csym[0]);' p) _6 a# t5 M) V& O, e" ~& z
    return nERR==-1?1:0;- N$ P- ~8 [5 q# H# q
}}$ g( k: S' M, O6 }" l' W

4 @- O7 L  Q3 s- x9 h1 \+ Q; @) M

% |6 f. I- H0 L9 k函数模板使用示例:
, E+ w) s" w1 G: `在以上那段代码的后面加上以下代码:
7 E& L' }7 b) [& m
) y) n) y+ n3 P6 J. o7 s3 O# q ' ]1 [) U$ t4 y' P& F5 Z

+ T5 @) {  w+ s$ U2 p$ G, }5 [程序代码: ) |; N5 y+ L! a

6 h2 r9 z, X9 P9 g0 a# c#include<strstream>& [. t  c' Y% H6 F
#include<iostream>
, k" U* v% K; U#include<string>
1 h7 U5 u8 K' ~2 D# @% J% k' P9 Jusing namespace std;6 [9 D, t. }7 t
int main(void)
' L# Q. R- A8 Z; x9 Y4 a{( r3 {- k9 y0 P) ?* m
    string s1;3 K$ f( ]4 b$ ]8 |- Z
    while(cin>>s1)
9 N4 ]0 L9 `/ r) U6 B6 D% @+ O    {
  O  e; [, S1 C& T$ r0 E" Y6 ~        istrstream isin(s1.data());
8 N) \8 ?  Z2 s$ a+ P0 t( g( F        double d;- K  Q9 g( h% n$ I
        if(fy_Exp::GetExpValue(isin, d))$ j; |3 i. K. I( y; f# v
        {
# w* V0 A7 B* k" q4 w0 @+ r            cout<<d<<endl;
4 U7 v2 ?7 F: y- H2 @1 a        }
9 ]% Z  E5 Z8 b$ b. Z1 {+ I        else( G$ w$ Z3 J5 e0 A3 w
        {8 k% v) s4 T  h& [. K
            cout<<"ERROR"<<endl;# I3 |5 s* q5 K3 T
        }
- {& U+ A6 o. w. [) f5 c; Q* M    }
0 ?6 ~! I0 o& t# [    return 0;- v5 Z; G/ W; d+ A& @+ j# v
}
' @/ D; i% g( H$ T- E
1 M& V* ?( a* o) C- q+ @
; I5 ]6 P) O) J! q然后编译执行就可以了(*^_^*)4 W% m" Q4 A" x/ b/ A
其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 H! `3 D2 O$ k; S* [4 _7 Q2 X& D
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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