返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,9 b& t+ B- d- S* j4 E
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
0 G. Y7 i( Y0 w( \) s只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)  W; i# p; O1 H2 B
参数解释:! u% ^2 f% _* O0 u  m0 h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ _3 J) u* w) }, Q4 Y& znReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) V  k/ R4 O1 D) g# e2 T0 n+ l
返回值:
) E1 g. o9 q5 M返回非0表示计算成功,0表示计算失败有错误
- b' o  h  ]2 [
  ?4 P% ?. Q( I# t% n, ~# g. l 1 Q' P' Y- J- [; l# _' S" z
# W8 o3 P; H: e- }+ l
程序代码:
) p. J: T9 s0 a- k- @" \( f
) k( s, x( ~* `# C& S, gnamespace fy_Exp{
9 P) ~+ Y& p/ s7 Mnamespace {template <class _T>
5 G' ?9 V, b9 }9 [6 `3 L3 t5 Qinline _T GetExpValue(_T t[], char& csym){
0 [7 W4 `+ `+ G3 l( n    char c=csym; csym=0;
; T9 e* z8 f7 @    switch(c){6 e$ x1 X3 n( ~4 k5 R1 D
    case '+':return t[0] += t[1];1 f7 h: s1 {) Q3 n7 l
    case '-':return t[0] -= t[1];
* c4 t8 A) H/ B/ h    case '*':return t[0] *= t[1];
0 O( B, [# a, `' K8 ^3 W    default: return t[0] /= t[1];//case '/':6 [) {" _4 u1 x. y1 \5 [
    }
# N1 Q' i2 @% [* r+ Y1 k}}
2 S) F' b0 N9 G. D& ~template <class _T, class _Tstream>
5 b+ {% |: Y6 B/* _Tstream: inputstream, _T: get return value
) i  f% Z% G9 L* Return nonzero if get value successfully */3 ^" ]" J+ c4 w8 o/ ~
int GetExpValue(_Tstream& istrin, _T& nReturn){4 z# Z* a' A( i, O
    _T t[3] = {0}; //雨中飞燕之作
# q) I$ h- P- J) f    char csym[3] = "++";. t) H3 T2 H& K
    int nLevel = 1, nERR = 0;, L/ n/ x: V7 L; {- B
    if(!(istrin>>t[1]))istrin.clear();* l0 r% B8 R  h. O' \3 q* T
    for(;;){( `% I# y9 b' Z3 r3 W' b
        if(istrin>>csym[2]){+ k0 S: \) P4 r
            switch(csym[2]){! G0 H5 F& U- h# j: X  b* ~  P0 p
            case '(':
. j' x" y7 l$ I                if(!csym[1]){nLevel=0x100; nERR=1;}else
3 q) H/ B, S* K1 G                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
  ^6 ?' v( }* I                else{nLevel=0x100; nERR=1;}
5 O7 k# d2 ?+ N  Z  ?; {# \                break;  u% t6 _% E3 K
            case ')':
+ W% }5 x1 B3 S- M                {nLevel = 0x100;}break;- b, x; E" t1 {& j) @
            case '+':case '-':case '*':case '/':
% {1 |' c4 [+ |1 H                {csym[nLevel++] = csym[2];}break;
3 x/ w7 r9 N+ d; Z! O0 G            case ' ':case '\r':case '\n':case '\t':continue;
% B3 n( c1 u1 {1 }4 Q            default:! k6 q$ h; |! V" X, P& ?8 L" P
                {nLevel=0x100; nERR=1;}
( {' |1 D2 f+ j; Y4 t4 T0 V            }
4 p  @7 a# l# P4 j  g1 i            if(nLevel==0x100)break;
: C$ t6 e% ]* k! T: Y9 z' |            if(nLevel&0x10 || istrin>>t[2]){( U  Q* J( m2 N4 }, |. M7 \
                nLevel &= 0xF;% U% I+ b: {/ z* d+ ?1 c) V: |: `
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; A% w1 J5 v0 p! w& m                if(csym[1]=='*'||csym[1]=='/'){6 g9 ?6 R, c# _% J! Z* `0 S
                    GetExpValue(t+1, csym[1]);
+ `/ ^/ w: A3 C; H0 x( y- o                }9 g5 G6 A7 |6 u* H1 w) h7 O' d3 w  T
                else{% M, [& g: g$ g0 M: f% Y$ D# R
                    GetExpValue(t, csym[0]);9 F+ T# i8 [% m( Z$ @" _# _/ j
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;) v1 X. n/ l7 I5 F% n8 I
                }; l% ~4 D" A  H& H0 @8 I  z
                nLevel = 1;
) a  Q1 F8 b1 G. m            }
3 r4 R, b) d/ k' S1 o5 f( W3 Q' |$ J            else istrin.clear();
' m, a  {( C# V( ^. b        }; \0 u) \3 Y6 G4 X- a; K
        else{nERR = -1; break;}4 o& I, @. K* X
    }
! i; ?9 u  T/ E    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);: L( `) i, }- ]/ T' b
    else nReturn=GetExpValue(t, csym[0]);4 r5 M0 O' X8 T" R
    return nERR==-1?1:0;
8 ]& ^: i  P% Q( r+ ~# r) @}}
- ?! i9 g5 I6 j" M
+ {1 H& w$ F. c( H# `3 R. ^) U- a
( Z  V+ O+ T1 N7 @! c! Y  m2 s9 G6 Y. x' s) Q3 j
函数模板使用示例:5 W8 M% l/ P+ L( F4 X6 Z  j0 O
在以上那段代码的后面加上以下代码:
% W0 M. x& M+ a# Q' J
/ r3 F+ Q! w5 z5 A1 I - z9 n- @& q. u# c

1 ?! \3 d5 P# Q  U6 C程序代码:
& ~, n! d6 y/ ^3 ]( M
: I! r, h. J1 F1 r: Z/ P( V+ K( ^) q#include<strstream>
7 p: }! }( g  @& i) r# n8 J#include<iostream>
) O8 H6 s; v& F#include<string>
! Y, ~5 s& @+ [; ?" T  \using namespace std;) d; M  [2 S0 ?/ h' r8 Y
int main(void)
- i; ^9 k! y6 j$ r{  r5 c: t* y# }3 F  d! Z
    string s1;. R4 \" m& P3 P4 W
    while(cin>>s1)
! Z- a' A0 T1 X" Y+ X    {
. N5 E( H* Q! R7 s( N, W" y' F, h        istrstream isin(s1.data());
% f' h; N6 x; A% _# H        double d;/ ~5 e+ M) R- \, i
        if(fy_Exp::GetExpValue(isin, d))2 t+ W: I* g( X) `
        {
5 A* D6 a  e  l9 C            cout<<d<<endl;
% L/ u' z4 S% A- D7 d7 @        }
* r, c$ ~6 K% d+ b% [! g        else* T4 x; G4 O( h# Z
        {
" E# N$ f2 B1 K! y! `  ]& ?            cout<<"ERROR"<<endl;
( m5 _1 z" c  V" _        }# S( X0 q& B0 Y# k
    }
/ T: _4 ]7 h/ [9 ]: q    return 0;
3 G1 `) m8 v5 r8 N/ l" P}
( i# Y" j2 U3 @8 q$ G
8 C- ]  ?8 t  U4 X0 I9 R& s+ k) ?, g5 b! l& ?5 L& |4 g
然后编译执行就可以了(*^_^*)1 }% w( C1 Z8 T+ t/ Z% D& O
其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 P' {% H0 A( N
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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