返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
* }# e. @/ i6 [, R8 u! {. Y* s一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
( b3 g8 a0 y9 m: u: ]  @: L$ y只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 o6 M* M* a& r) I
参数解释:
( _: `  _2 R8 n+ Tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- b  E' L! G! v7 ]nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% q( ]' \% r, E4 {7 c  E& X9 B
返回值:
; z. f7 F7 d( L* z; U3 ~返回非0表示计算成功,0表示计算失败有错误
# y$ F! @  f$ [$ a
8 T8 L+ P7 a- a+ Q% c& W5 S5 D : j( c4 z3 @9 D7 Z: ^, s' h: o, o
; }2 }) F6 }0 i( a+ U* \
程序代码: & I: @  _; E: D2 C0 P1 G8 f
* Y8 Z4 y; \* }% r
namespace fy_Exp{& j, A+ j4 ?" |* N3 f
namespace {template <class _T>4 f5 G3 K7 z! V- N7 _
inline _T GetExpValue(_T t[], char& csym){
  B" T5 k  w8 d! _    char c=csym; csym=0;+ L0 c4 @( _& V
    switch(c){
& \7 a( \; J. i6 g, Z: r    case '+':return t[0] += t[1];
, y# H! A2 I$ r, t. v    case '-':return t[0] -= t[1];
# {$ G3 n" j- Z$ b, j    case '*':return t[0] *= t[1];1 w3 n. y8 L% x- d" Z0 _
    default: return t[0] /= t[1];//case '/':8 J7 o( M) R8 C6 G* O2 r7 c' v9 L
    }. a, l" R& g) D( \  F1 O9 D
}}
6 ~" I0 N, @( Y* Stemplate <class _T, class _Tstream>3 F7 h9 [9 e7 q
/* _Tstream: inputstream, _T: get return value/ d2 n7 h& l2 @
* Return nonzero if get value successfully */6 K# Q, z2 T6 C" H
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 t  K6 x) _) k9 {    _T t[3] = {0}; //雨中飞燕之作
0 C( d1 N& Z: M, D/ \, N    char csym[3] = "++";
; f1 V3 f8 q( @7 `: ^    int nLevel = 1, nERR = 0;9 I9 s3 K. _4 D  G
    if(!(istrin>>t[1]))istrin.clear();( d& B; L# i' K1 t+ p" ?) C
    for(;;){
6 n* S" o4 v9 N6 s        if(istrin>>csym[2]){
# t8 `; Q8 Q8 T, e9 V+ s            switch(csym[2]){
4 R8 [- W) z& L4 ^            case '(':$ r  [# o# e; X( M% v) m
                if(!csym[1]){nLevel=0x100; nERR=1;}else! z/ [. t; l, j  H! E* G' E
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, J! Q& V& R1 s* F                else{nLevel=0x100; nERR=1;}
- T6 Q( l( S. L. b$ C                break;
2 o1 R6 [9 h8 z' J6 l! X            case ')':# n8 q  t3 |/ h' C6 W- Y, U" @
                {nLevel = 0x100;}break;
- u$ a* i$ _5 j0 Y( U/ D            case '+':case '-':case '*':case '/':! a* b$ `' m- W& X! F
                {csym[nLevel++] = csym[2];}break;7 y' R& W1 a$ T* W
            case ' ':case '\r':case '\n':case '\t':continue;8 D' n! W; [; p% M3 D
            default:
1 r2 E8 P& z* P5 ]5 Z4 `1 ~) t: \                {nLevel=0x100; nERR=1;}0 f( x+ D0 K! q5 _
            }
% u7 M# G. L( h1 X8 I, p            if(nLevel==0x100)break;
# z% X$ H7 \% v$ H, Q            if(nLevel&0x10 || istrin>>t[2]){
9 j$ u9 g) k4 L# R1 X: L                nLevel &= 0xF;
9 E; I4 D/ T; t+ O                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
4 K3 p( [( {* d. e                if(csym[1]=='*'||csym[1]=='/'){. x9 d7 y: N! L2 C9 _: P
                    GetExpValue(t+1, csym[1]);. Z3 y7 D$ j% u3 c
                }
3 f" L: c  V1 q+ U% Y                else{) o( M; E4 S9 v3 G7 v- j
                    GetExpValue(t, csym[0]);
  {; w! `$ N& c# h7 Z/ v                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;) t) f! t) M) n6 f6 U
                }( G1 z$ P: N+ d& W- T
                nLevel = 1;. J$ P9 H2 D4 U3 F) m1 v
            }% q' _/ n6 n1 M4 ^- v
            else istrin.clear();
* W2 L5 ~* ?( K7 {7 e. `        }  [0 m: R& V2 j
        else{nERR = -1; break;}
& b- ?! y8 X+ W3 _$ A    }
( X& H; J$ k% h' |- u  T    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) C) M* g2 h. [. q  L
    else nReturn=GetExpValue(t, csym[0]);  R# Q% d; c) q9 Z' }
    return nERR==-1?1:0;+ ^9 y( F/ U1 ~; B
}}
, p5 P* P( V/ ^, W, C" L5 D+ @& V/ p. @

  b; T" y$ `( H" I! L+ m- Y% O" ~. n" G
函数模板使用示例:1 q) f$ x- e  b; F0 Y1 F+ B
在以上那段代码的后面加上以下代码:! u- r* I; R' }' H3 ^; o

4 M  T$ E+ x; Z. ?
# _  @/ F. G) A. u2 D+ ~* S3 n# S% x3 Q& Y6 J0 K
程序代码:
% d( ~; C4 j% x/ }  ]  c
0 g8 C" ^  h( ]1 z3 j#include<strstream>, ]2 Z" m5 ~0 a+ H5 V. ]2 H
#include<iostream>
7 `9 d6 d. ]2 r6 K$ I#include<string>
- |) C% u# l. W" [using namespace std;$ L$ p4 q8 j% h* |; L0 ]
int main(void)
. p2 P2 i1 c. E% t! J% O{
2 o$ l0 w9 B/ q9 b    string s1;
/ ^6 x% s0 ^6 S! i% S    while(cin>>s1). B! G' P3 G1 w, _, M: h4 z
    {
1 X3 M1 m" `6 R4 f        istrstream isin(s1.data());& M0 y$ k+ U& I
        double d;$ Q# s* b3 T/ m+ T  E* J5 ^) t
        if(fy_Exp::GetExpValue(isin, d))5 w9 b5 c% I/ e4 X5 R
        {
- _' m5 H3 G) a  ]5 I/ m            cout<<d<<endl;
: \- A; J8 P) }4 ^' D        }* |3 t- F- g8 A* T" Q- t8 p
        else0 l! P  i" d) }% }$ i
        {  L; Q7 ]* I4 A& G" D! h- @; A
            cout<<"ERROR"<<endl;
* ?/ e1 }1 @5 h$ s- r+ J' q        }
6 I3 x# V$ Y" r# {6 R- `: ^  R    }
4 D; Y% @7 g* u9 W    return 0;( M0 J$ k) O1 R9 t2 C# v
}
' g, d; ^  q$ y4 i4 M- f
6 V. ?9 w8 ^/ a, b2 _7 S  F
- N, t7 o; Z  ^' S7 @* n然后编译执行就可以了(*^_^*)
6 I8 ^) I$ v- y' ?! u1 l其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 a5 P$ K% v* I! w9 R& A( v. \
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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