返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
3 Q2 r: [3 s+ D. q, q9 g7 R一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 T+ t3 X! W, I5 |4 y
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& j$ |9 M2 _* m& c参数解释:* x) g. _0 M  D6 F" B8 C
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 s6 L- j& w  w& g+ ?; L) znReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定$ h1 }+ v5 K  ?0 V+ }9 Q, k
返回值:
* V! ]8 ^- f: {1 E5 P返回非0表示计算成功,0表示计算失败有错误; v) I: F$ \' y, m5 Q9 \

1 d& }; `- ]! {+ y4 n8 @$ p * P; k" p5 y# B8 a/ }& w- a& H

6 S4 t' q3 D" l' ^* P3 E程序代码: , l( h$ @% n7 T0 ?% m
1 c" ^" h& |% Q8 e* _
namespace fy_Exp{; Z' w; e+ C$ I5 x# ?3 c
namespace {template <class _T>
" u# e6 U1 v% [. V7 V' ^5 minline _T GetExpValue(_T t[], char& csym){
% f! `- ]$ F# q    char c=csym; csym=0;
0 `- u: Q9 p4 @  L: r0 k; n    switch(c){7 q1 L9 V$ y& V- x) X. V; r
    case '+':return t[0] += t[1];' w6 c% N6 r8 P" x: Q
    case '-':return t[0] -= t[1];
3 a4 h* Y2 q+ i* J    case '*':return t[0] *= t[1];
  f& ]4 V- i" n7 M    default: return t[0] /= t[1];//case '/':2 v& f3 D. f& T* r  z
    }
* H, N- I5 K9 T. _/ x5 d}}+ ^. D2 S/ o9 h: q' h- K
template <class _T, class _Tstream>
1 M, g& S6 z2 F3 Q% M8 }1 |/* _Tstream: inputstream, _T: get return value; Q, n) `$ J, j* t$ C* \
* Return nonzero if get value successfully */
- R5 c7 \& C# ^5 y/ Qint GetExpValue(_Tstream& istrin, _T& nReturn){. t$ }0 `. E: W! v
    _T t[3] = {0}; //雨中飞燕之作
# ?* o; q& e+ b% ~' X0 J0 |7 q2 K    char csym[3] = "++";/ k5 L$ |0 l( ^' \8 l6 e
    int nLevel = 1, nERR = 0;
; P( _! o) m2 M/ S    if(!(istrin>>t[1]))istrin.clear();
9 r9 E2 c/ _* j    for(;;){
1 J3 T( n! o% \) n4 f5 h+ Z        if(istrin>>csym[2]){
6 c, T' A, y* e2 ]/ G            switch(csym[2]){
- O% {+ e" ^0 \) Z; o            case '(':
) r6 p1 W2 K/ U3 j; l8 b8 M                if(!csym[1]){nLevel=0x100; nERR=1;}else
8 x: [) V; S; D0 M: j                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
1 q7 M6 C. g8 f" R                else{nLevel=0x100; nERR=1;}
! n( @' X: i; A                break;
2 ^/ b, s# b) F, P            case ')':) y. H: j5 b9 c& _3 W. @* T" ^* m% @
                {nLevel = 0x100;}break;* |" g9 M7 `7 X6 G
            case '+':case '-':case '*':case '/':
' O1 ]  i( h5 D& F% P) a                {csym[nLevel++] = csym[2];}break;
' @2 z7 S. C' g. B            case ' ':case '\r':case '\n':case '\t':continue;
) j1 F3 V% g' ?8 f& {            default:
% S4 q- X; i# w$ g                {nLevel=0x100; nERR=1;}  C) a5 y: ?5 f9 o/ f  `6 A
            }# ^+ i- o5 V& F) P1 u! N! x4 t, \
            if(nLevel==0x100)break;% ^  }6 A  z" P! K' Z+ e
            if(nLevel&0x10 || istrin>>t[2]){
5 Z2 p3 z; V. s                nLevel &= 0xF;! k9 t( B6 V* S9 [
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
7 I; F- h2 `: G: ^- J/ n+ d" n% a                if(csym[1]=='*'||csym[1]=='/'){/ ~. b* v+ R6 H1 j
                    GetExpValue(t+1, csym[1]);
  w( A* X5 k# i4 V. I                }
) R/ G, d5 g2 i1 l3 J/ g' d* C3 z                else{# C4 F$ D/ h& x& V; }& ]7 \
                    GetExpValue(t, csym[0]);% q4 D( Y/ ]0 o
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
; j; b- @9 u, E- x                }
. J7 l# e. |9 E' x( E+ v1 a                nLevel = 1;( O% f, I$ P& W! ?' U4 l
            }
3 u% Q8 W6 R+ i5 }9 Q            else istrin.clear();
3 D3 g6 q( b% g6 f9 G2 J' P        }
" }% @$ J2 _7 M# O& {3 E, V        else{nERR = -1; break;}$ s9 n$ B$ Y$ F$ M0 w6 p
    }' w" ^- R( F+ Y& Y4 |, y' S
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; `1 {+ Y! R  y$ `3 b; v/ T3 R$ g, Y
    else nReturn=GetExpValue(t, csym[0]);
5 ^) [, m( v; E( l( g9 z7 F& |. A    return nERR==-1?1:0;: Y, h& d+ Y: ], v
}}
7 y0 F% Q6 V0 K) w5 i  f
; z8 ^+ q) `( j+ |8 b+ P' z9 s% O. s: |* S7 G- x& B5 ^

, {6 O. M% g7 d/ _6 u函数模板使用示例:
  ?( O/ _$ m/ f& w1 b在以上那段代码的后面加上以下代码:
6 P1 ?5 x$ \5 ]/ p" e. I8 v8 d; j& `3 i4 v0 I3 D6 y
& F& j, B1 f; Y$ J

/ G+ @3 T3 y5 F" s0 T2 V  \程序代码: / N; N/ X0 W  Y+ T2 R: V& e

# N  n% K) ^+ u  ~#include<strstream># Y! i9 z( w! X
#include<iostream>
* j" a( l4 D- f/ W7 A#include<string>" C" o5 d5 Q5 o. l- T* b
using namespace std;
0 z8 e( ^0 s; s% n& pint main(void)+ z1 L" @# Q2 p  R" Q0 M9 a" i
{
1 N: X& }7 h  b) k* P% ^0 H# a7 ~! X    string s1;1 j0 c, T% M! c) a
    while(cin>>s1)6 ?" J; Y: f: S' k) [* H$ h
    {/ ^7 F. D8 l9 _6 w' ~! C- h% r+ y
        istrstream isin(s1.data());
5 K1 {" U$ C8 l" @2 q& S" U        double d;: j6 s& M+ l6 c6 B$ R9 ]
        if(fy_Exp::GetExpValue(isin, d))' A& D! Z0 E- k# j# S( u3 d+ \6 I
        {
9 |; u& B5 |2 t: m2 D+ }            cout<<d<<endl;; n' C& g* c% Q
        }  Z2 X+ S3 I& G* I6 R  P
        else
* U8 o) g7 l+ I$ k        {: i& Q- ^* X; i! O( a
            cout<<"ERROR"<<endl;
8 j# G/ l( T# i        }3 H( |, `- q( n3 |# n: D; ^
    }( n! s) m0 u8 g  r4 D
    return 0;" W  z/ T8 G( b& }1 n# V
}
( z! H  D% V1 H0 d4 g# n. G7 \" p2 T! ~: I) b9 g
$ Q- R& Y* W0 C
然后编译执行就可以了(*^_^*)
1 b" B, s. c' w# s5 [! [其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: a  @9 h8 j+ b! ^; Y* N      建议使用VC7或VC更高版本,或者使用GNU C++编译

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