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

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

在9月8日那天我特意编写的,给大家分享的,
2 b. p. b# R% i$ X0 K- ]3 ^一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' y; H4 |# b) J6 S$ k! O) v# n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! @3 U. W2 ?0 r9 \9 P6 k4 ]
参数解释:/ ~; O" ~: b7 I/ X( d8 y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
% {- u# n2 v) Z& a$ N& D( ^nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: U/ n; A# m0 E' Z" {
返回值:
% }2 G7 X2 U6 }9 e0 K返回非0表示计算成功,0表示计算失败有错误
  ^6 Y, t4 z6 |8 o
: q" i. p0 c6 |& q# U; G " Y( g  p& e0 N# K- R
' r: F7 ]5 N# F! F! `3 G( O0 _( J
程序代码:
: n8 w, c* R" e% ~0 t% E8 b- b& l4 Y# l6 S0 u. y
namespace fy_Exp{
+ Y0 v) d5 ?+ y( ]! K4 w) x6 k" Inamespace {template <class _T>7 |" t- o6 i4 u: [
inline _T GetExpValue(_T t[], char& csym){& m5 i8 e. X) K! d4 e- h
    char c=csym; csym=0;7 @2 v% N* ~) y  t
    switch(c){9 u3 C" X% l( s  x
    case '+':return t[0] += t[1];& A5 }* Y) n6 V0 i* I9 @4 `  g
    case '-':return t[0] -= t[1];
1 {) `5 o2 e4 `    case '*':return t[0] *= t[1];
7 V$ E. b$ I3 c$ t# v    default: return t[0] /= t[1];//case '/':' s9 G2 O, y5 Q* f, |1 A% i. r
    }
9 m$ c) j+ t9 p8 ^4 Z% H}}
! M! z8 P8 e8 F' ~/ y$ {+ Gtemplate <class _T, class _Tstream>
" e  m9 Z& n* f9 B# a/* _Tstream: inputstream, _T: get return value. ~! h4 i2 g' K! r
* Return nonzero if get value successfully */, C  ^! |( V. m2 a" G. [. Y2 x
int GetExpValue(_Tstream& istrin, _T& nReturn){
/ {* P# A1 l' v3 R1 p    _T t[3] = {0}; //雨中飞燕之作
/ \9 k5 q) ^$ O$ ?2 ~    char csym[3] = "++";
& N3 J& z- n' }7 }    int nLevel = 1, nERR = 0;
, J: s+ T% ]8 `; {+ v0 @    if(!(istrin>>t[1]))istrin.clear();# Y: a: c6 k. L
    for(;;){; I1 \5 l6 ^# }8 ~. f2 o! F
        if(istrin>>csym[2]){: h. M4 \: r1 A% v
            switch(csym[2]){/ m4 t9 M7 ?3 ]
            case '(':
. [0 \) R- w% U% n                if(!csym[1]){nLevel=0x100; nERR=1;}else
& F: L3 R0 c* `6 g5 q# U                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ X4 [/ x, R- t" H                else{nLevel=0x100; nERR=1;}5 Z9 J8 t0 T9 Z4 |$ T9 ~7 Q- q
                break;
4 _8 W1 f( @' i! {% u8 B. j            case ')':3 H& P( p9 |7 \" A5 g7 K, g
                {nLevel = 0x100;}break;
2 R3 H$ q' s" d; X, M5 ?& R6 r            case '+':case '-':case '*':case '/':
' T; v, ~8 D0 g  `4 C/ G                {csym[nLevel++] = csym[2];}break;/ ^, C) O/ T, v( l3 b
            case ' ':case '\r':case '\n':case '\t':continue;
6 W& K% k$ S+ |. _2 d' \* M- p- m8 J7 |            default:
5 u2 |5 V/ J$ x$ r5 _                {nLevel=0x100; nERR=1;}$ m* Z, T$ A9 _/ h
            }8 ^# L1 o4 O- w( j# w6 R! i
            if(nLevel==0x100)break;4 e! j6 c$ H. @9 E) M8 j- \
            if(nLevel&0x10 || istrin>>t[2]){
( p$ a4 i' g9 N3 v6 B                nLevel &= 0xF;- h& {  H* h* I& l$ U( y1 w
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, u5 k# G# t( {& t$ C0 t
                if(csym[1]=='*'||csym[1]=='/'){/ a* L- n6 j  L% J6 s
                    GetExpValue(t+1, csym[1]);/ y9 s( ~$ z, _- }  j; e! ?
                }) z6 g  j) m+ a; o! h/ {% }
                else{. Z4 p$ U8 \: a- n8 |  \1 Q" ^6 R
                    GetExpValue(t, csym[0]);- G$ N" f1 B5 C% z& j- K5 |: |
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 _. Q% O# y. `" Z- B
                }- z, i( n7 {. Y. e7 E& t$ N
                nLevel = 1;! r1 H$ \7 O9 M. H* ?, M5 \& W
            }  W4 I# Z6 q) V1 F: j' g
            else istrin.clear();
4 C/ s: S1 [+ O        }; ~8 U4 w* f) P4 N# x2 E
        else{nERR = -1; break;}9 G+ R: S8 K! P6 K7 f$ I6 X, _
    }
4 Z+ U! L$ e0 e: ]9 ^4 u# p9 ]    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 }3 B0 r0 I4 n5 W  k( o
    else nReturn=GetExpValue(t, csym[0]);$ E0 T  U% \% W: X# o
    return nERR==-1?1:0;
& Z5 Q& z' y# d4 `}}* N/ Y2 w' V' ]- j; F
' Z5 o* |  x& ]4 F  N5 D+ c6 i. d

+ `; V/ y; H8 l) r6 r9 [/ c; @* l! d$ |: j! ~
函数模板使用示例:
+ [6 [3 T4 L4 e; q9 T7 T在以上那段代码的后面加上以下代码:
) c5 a3 A: M: \3 V, K; f- l1 E+ p2 {! U# i" N9 {+ H( M. T; s0 K/ f
/ _1 j* l" l. s5 s  Z

5 ~% ^+ S! a' F( K) J0 L4 T* v程序代码:
3 c5 d' S8 d2 f  M" a' H5 G0 ]3 K  Q
#include<strstream>
7 q) A3 X/ S+ V#include<iostream>( J2 C2 t  R. }2 L8 h. v
#include<string>; V' y' R/ Q2 Y7 ~
using namespace std;" e. E( N' ^1 q  ~
int main(void)
, n* I2 I" v+ F* ~' c' i{$ b- Z% B. S8 `
    string s1;
1 G+ h/ F) R8 X* o* A$ Y    while(cin>>s1)
, l/ v8 h5 u2 e    {
4 e) _3 _5 @9 ^, r  C        istrstream isin(s1.data());
, [! H, J# u; t; J% D  _        double d;
* g6 [5 V7 z0 {' L2 H4 K$ \        if(fy_Exp::GetExpValue(isin, d))
4 o8 T8 h, I5 S4 P' R. f  G  l        {9 I6 C) T- q, }7 L6 ^
            cout<<d<<endl;) u3 U# u  i8 \0 a
        }) \1 K$ K8 N& N& N1 o( W" K; C  G/ A
        else' o  j- E9 v. t% R
        {
; }/ G. P" I5 {0 r, B            cout<<"ERROR"<<endl;$ H* c1 F) f0 B
        }
$ J+ Q/ M8 |6 S0 r9 M# M4 L    }: B3 ]8 t5 y' p# Y1 H. f; M
    return 0;6 P8 b8 j/ s0 K" U  o( |
}0 r; r, f. j5 E- a& m. q6 K" l
# X) r$ \- G' c! h
+ ]. l  V$ A$ {" q" z! g
然后编译执行就可以了(*^_^*)
! y  K5 w- Q& C" Y7 e& \" g& d/ l3 C其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# U  H9 a3 g% C  S( }$ ~& B1 e  C      建议使用VC7或VC更高版本,或者使用GNU C++编译

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