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

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

在9月8日那天我特意编写的,给大家分享的,
. W. q( \6 \' ]6 G8 g+ }9 |一个很方便的函数模板,可以并且只可以计算含括号的四则表达式. w  c! A: m) x5 D+ M
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( a4 X) R5 g& F; ]  c  p; ~参数解释:, p  w8 X) U- f5 Z% \
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 z6 \. a, L. c( n2 P" mnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ x2 p& T5 o$ i3 V+ O
返回值:
' n$ B" t" [8 ]8 k7 ?7 p( Y! c返回非0表示计算成功,0表示计算失败有错误2 A+ p/ ?. @" T7 z

+ ~4 i  c! m; x; w  W( c7 m ; H1 a' t2 B; }2 v% B
) ]& }2 U8 |0 u2 `. c
程序代码:
1 d8 g# A/ @( Z) _: ]
1 d/ t" I, d* {; d! U0 Y- U7 Inamespace fy_Exp{
( V  K8 P- a4 ?" o: Znamespace {template <class _T>( Z- ?; S1 t7 [1 A- _% _  m& L
inline _T GetExpValue(_T t[], char& csym){) o& a7 b/ v" O* q6 S* [, s! Z
    char c=csym; csym=0;
: C6 n# ~% u: f- b    switch(c){
/ a/ J: X7 y9 M0 c    case '+':return t[0] += t[1];
6 E8 _+ t6 m# R4 F    case '-':return t[0] -= t[1];) C; z$ Q4 a: @  o! S
    case '*':return t[0] *= t[1];
2 u6 o6 J8 o2 q, G    default: return t[0] /= t[1];//case '/':
+ O9 U& O2 n  B8 k" D    }
1 ]( ]& O- O3 {! m$ e  N8 }}}
4 q& P( Z; f" [" C4 gtemplate <class _T, class _Tstream>( {. _7 H6 i: ^+ J
/* _Tstream: inputstream, _T: get return value
* R' n; _1 C8 M- R) o* Return nonzero if get value successfully */$ M& O) c) o$ K. k! R8 @
int GetExpValue(_Tstream& istrin, _T& nReturn){2 o1 K$ F& l# u1 M' A5 z3 F! O
    _T t[3] = {0}; //雨中飞燕之作# C7 u* h; n/ U" I) G: W
    char csym[3] = "++";% C5 h  Z- s3 N7 W) S2 N( v
    int nLevel = 1, nERR = 0;  |3 V+ |9 O4 e2 c6 i7 }7 s: D
    if(!(istrin>>t[1]))istrin.clear();
" J3 |: B- _3 e8 q( D1 I3 L$ ~. p    for(;;){1 q& V: a: G8 k& O. g% O/ Y, K
        if(istrin>>csym[2]){
% o  b# B$ U9 A5 f1 Y8 n  D            switch(csym[2]){
, `7 W. s) Y3 a            case '(':8 h. y! x% }- b9 p3 f
                if(!csym[1]){nLevel=0x100; nERR=1;}else4 X8 W" F6 G8 F+ u3 _9 {- r
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- G) O5 [3 o9 i* s; t                else{nLevel=0x100; nERR=1;}( p: z: g* q" m6 _% j3 i) O
                break;6 k2 b( U' v9 Z' S9 D
            case ')':' O, B" t( R: A$ A0 I
                {nLevel = 0x100;}break;
! e2 H* x5 b: [1 l' _- h: r            case '+':case '-':case '*':case '/':
" i6 L) k9 x" n! K5 w; U# q                {csym[nLevel++] = csym[2];}break;- A- v$ E2 a1 c& _9 l
            case ' ':case '\r':case '\n':case '\t':continue;8 P5 p" w3 d, B
            default:
( L, P, z$ ]6 P8 {; |                {nLevel=0x100; nERR=1;}( O6 v( U3 x8 L! O# q4 y
            }" ~& q+ G& T7 U
            if(nLevel==0x100)break;
! J0 T2 C8 d9 M7 F5 D0 K6 v            if(nLevel&0x10 || istrin>>t[2]){1 K: O5 `5 s9 H8 C
                nLevel &= 0xF;
0 L& K2 k* T; L4 L' n, Z3 I( |                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 I" S# Y1 b8 e
                if(csym[1]=='*'||csym[1]=='/'){! _2 b& g7 n2 O' {8 z3 E  E$ f+ z
                    GetExpValue(t+1, csym[1]);3 `+ t. V' y. E' k8 u
                }
* _2 j$ _, z0 o+ r  K4 B% V                else{
" c9 z" {0 N1 o5 t' x                    GetExpValue(t, csym[0]);. R/ O, N& G( W/ u4 B6 H3 ^7 s
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' u, ^* ^, `$ b- O& _9 ]4 f, d                }
6 M& X) s' u; O9 q+ O' R* o                nLevel = 1;: V  j+ z- ?" X8 \! D, F
            }
! u& P# C2 f) G& L$ U, M: _            else istrin.clear();
; n1 ]! M& n( k* R8 N        }
' y" Y+ r( r* F        else{nERR = -1; break;}
2 x; q$ K$ ~, p" V$ G* \7 {0 |9 Q    }
9 t8 g8 `2 O- H0 U6 Q" q4 U; P    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 e& v) k9 I' R: o! f
    else nReturn=GetExpValue(t, csym[0]);8 o: G& ?& ?5 K- b
    return nERR==-1?1:0;
& ]! \: ~( n& H1 H% U}}
# ~: w* y  H* {4 {0 k5 j' l4 K. @! ^$ {, k, u5 v
! r: F9 e3 a7 F3 w3 r) A& F
" `' [4 X( P' Q. Q. z
函数模板使用示例:
8 A, N7 C4 v# @6 n, r  n在以上那段代码的后面加上以下代码:
0 {9 u+ o7 T, ~/ `8 J3 |% e2 m) N5 i" b+ {1 p! M  O
" Z' u! Q+ R$ m9 w$ I) n9 g
% c1 [4 ~, _: V
程序代码: 5 O2 q: l* o7 ]# }

9 d" O  _2 L+ r& N#include<strstream>& K/ {- H+ J+ ]! _! y
#include<iostream>' W: M% Z/ Y8 g: D
#include<string>
( }7 P* Z8 i. n& K5 Vusing namespace std;
. C/ V; ^4 ^7 ]9 `int main(void): |6 h2 W4 `- C+ i  W) U
{
  ]& ^& l. d- K" L4 t    string s1;  p* @  w" N* I  a: m* s' w, Y
    while(cin>>s1)
+ F' Q( S# I: y! ?  Y1 p8 w% P    {
0 d4 X* k' d) e4 Q        istrstream isin(s1.data());! E0 O) r! Y$ s" v' E
        double d;
: o7 _1 a9 x: W& D; t, H) V8 o        if(fy_Exp::GetExpValue(isin, d))
( R, R2 C2 S& e, t        {, X# t9 \2 l( U) P$ |9 j  G& {& Q
            cout<<d<<endl;  m  n$ p0 [  d
        }
; ^/ Y0 |2 u2 }$ B+ e! |7 g8 W        else3 ^$ c1 T6 P. R3 t* m# O: Q
        {
5 c+ C7 O9 Q9 e2 G! a/ d! u( S6 n            cout<<"ERROR"<<endl;( H; h. M/ H" s5 O
        }
6 r& E4 s3 Q+ r* M    }
0 f  E3 A. l2 h# p/ ?+ n7 R2 s    return 0;3 H& L5 f, S  m
}
+ ^* h7 H7 i" k3 c$ j% F$ v  |! G  {( J" H: l: U
, ~: K. I% ^$ s0 o/ m
然后编译执行就可以了(*^_^*)% O, I. w- q7 T- d6 N4 g
其它:TC++上一定编译错误,不保证在VC6上也能通过编译2 O6 p' n& r9 f% h. e8 k
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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