Board logo

标题: 一个计算四则表达式的模板 [打印本页]

作者: zw2004    时间: 2008-1-21 20:17     标题: 一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,
6 g! ]! t8 m% z* R# k, m一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" Y% v. g, z9 I# g0 I! c只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)& B! z4 m  {4 p) Q8 [. S
参数解释:
1 F( |5 O- x* l- Jistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) `3 m, o3 `5 z- D3 l) R
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ o. @8 y' A/ L& V返回值:& ~" A8 P' J: N# ~2 P6 m
返回非0表示计算成功,0表示计算失败有错误
  }$ X4 H& Q5 u( {- V9 |5 X2 ]0 J9 ^
2 M; L4 k* ^% R* K! {+ E4 t

# ]! u$ r' x) u/ k$ R& q程序代码:
6 F' k7 J$ ?6 V1 K. }* Q5 u; u
" D) A% O8 J6 ]) _namespace fy_Exp{5 ~* d* z( W% _  J7 E$ U  W7 h
namespace {template <class _T>+ ?, s' Q! @. r# c
inline _T GetExpValue(_T t[], char& csym){
- z& _" L8 l! \* F: L+ G" f: w    char c=csym; csym=0;" |5 o; `3 |$ K3 `- c
    switch(c){
& O' b. U( G! O$ M% L    case '+':return t[0] += t[1];
$ r8 |' c4 k' w  M+ r    case '-':return t[0] -= t[1];: t" s) {: k; J, j: }
    case '*':return t[0] *= t[1];
. [4 M" d2 |( m& P5 V% n) H) q5 u    default: return t[0] /= t[1];//case '/':
( ^3 J* h  |; g5 O* o    }
. C7 N4 D6 D5 n* p7 d5 u+ L5 A}}
# l- Z% w8 b8 o: l2 htemplate <class _T, class _Tstream>4 V$ d8 y/ P; v& y" ^5 F) L
/* _Tstream: inputstream, _T: get return value( O) D( P3 n5 ?4 T  r/ A0 [
* Return nonzero if get value successfully *// S: @+ L! Q9 {3 N
int GetExpValue(_Tstream& istrin, _T& nReturn){
6 {' f# n, Y4 r4 r$ }. m1 O  }    _T t[3] = {0}; //雨中飞燕之作$ [* P& ?! G5 f- L; k
    char csym[3] = "++";
( n% s1 P; V% p$ d1 m    int nLevel = 1, nERR = 0;
. X1 S) y, x; o/ e+ p& ~. E0 H# W$ d    if(!(istrin>>t[1]))istrin.clear();
) T: Y$ K/ v1 g0 y    for(;;){* i0 S* @* u, q! o
        if(istrin>>csym[2]){
$ w9 B. J1 k. o% \: ?6 c: d            switch(csym[2]){+ z2 R; R* S# Z
            case '(':
% w4 \/ u$ A! F0 k+ j- E                if(!csym[1]){nLevel=0x100; nERR=1;}else
, v  k* H6 g) s" x                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
" ^/ f6 E0 z2 o# T/ h, [                else{nLevel=0x100; nERR=1;}
8 _+ n3 P( _- I! k                break;6 ^" ]3 a" S! ?& C1 U( {7 c
            case ')':  j4 _, X" R. R4 q) Q' ?
                {nLevel = 0x100;}break;% V( x# n4 E6 j. t: k. z
            case '+':case '-':case '*':case '/':! l2 |, i+ X# V% K/ H3 b
                {csym[nLevel++] = csym[2];}break;2 w% L/ k% B7 r! K
            case ' ':case '\r':case '\n':case '\t':continue;( f# T: I- k& m2 W( i
            default:
; P! M7 P# A6 s8 x                {nLevel=0x100; nERR=1;}
! q; W, b  R2 a1 m/ t            }8 s  i7 _+ g" K" A# G2 G5 v) }2 i
            if(nLevel==0x100)break;4 r3 F/ T$ Q" |" U7 x- m
            if(nLevel&0x10 || istrin>>t[2]){. @' u+ U+ U4 v+ j5 p: y" a6 s# m
                nLevel &= 0xF;5 K2 q, F- U1 x+ F1 v/ V
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
* I9 e8 ^  r7 x/ p  s0 L" T- T                if(csym[1]=='*'||csym[1]=='/'){5 Z) ]5 k7 @/ ?) o( |" ?5 D
                    GetExpValue(t+1, csym[1]);: z) _  N, y' Z" ~
                }4 }# G+ F+ e) {2 O
                else{6 J7 t# B( c  f, a: V
                    GetExpValue(t, csym[0]);5 w# a" i' p' S' v2 s6 }
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
( m- a2 H& V0 X0 y; o                }
- L0 {; A- @' D5 n, N0 W2 h                nLevel = 1;
0 ^: b- a. J/ S0 c. ]            }
+ h" i  R* W* \  w, Y. ~% b9 J; U            else istrin.clear();% G! {/ d3 Z4 M0 ~* ~
        }
2 s" C. y6 E# Q4 M  J8 g9 g0 \8 D        else{nERR = -1; break;}* ^/ C- f$ ?! U# W* y
    }
/ x+ s- m& o0 p# R% R: ^5 M    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);, h( P; Y& [5 N9 S
    else nReturn=GetExpValue(t, csym[0]);$ p8 W  P* D- Q& P8 a
    return nERR==-1?1:0;' x$ y4 ^0 [6 V3 {1 G' j2 C
}}
& {! c: P) `) G$ _* D
, E+ v, a) X" Q; `
4 `) k' p0 Q1 f: _6 w
% \0 n  A: k) I! J' H0 @函数模板使用示例:  L' S3 ?  g% b8 g9 c" b
在以上那段代码的后面加上以下代码:
6 Y, ^' g+ j- i9 U# N4 n/ _" e/ d9 \( z0 y7 K- k' B0 U! \
  q6 f& N  C, E! E3 d7 ~

" l* {. T# b) c6 r* R程序代码:
2 D, n: p. a9 y6 H4 \, V4 @
6 F' c/ H3 h& ~#include<strstream>
! a) y* O! c7 ?4 y6 m, v#include<iostream>
  ]2 g8 T8 F7 T4 Z+ a5 o# Y#include<string>* F2 z& _5 K4 Y6 S$ a! B4 J
using namespace std;  J5 g- C7 t" `+ |! }$ d( C
int main(void)" d$ s; {0 p0 L: D+ P4 j' C" j: K9 u
{
. E$ l4 e# T5 B1 C4 |, \- V/ o    string s1;
: Z, I7 X. B5 S8 U- G    while(cin>>s1)
) \8 c. S/ s3 g7 K5 E0 e    {
1 ^+ f- t3 d+ M( P6 t# v) n. e" E        istrstream isin(s1.data());- j9 O1 u1 d" m* j  g
        double d;
& z  w7 A; d4 t5 ?* ~* z4 ~        if(fy_Exp::GetExpValue(isin, d))) H7 u' P: a7 M4 u
        {
, K# @: o/ I. p- K+ _            cout<<d<<endl;: g# V* A! }3 C# A, P" o+ P* |' N4 z5 H
        }
5 G( w: D! o& b, u) q        else" U) H3 d  [3 R' q5 N
        {
) |, R% J1 b, d" D9 e. X            cout<<"ERROR"<<endl;& ?% v: H/ _4 k
        }, s; ^; C; h- ?! @/ l5 |* T. H
    }3 t0 Y% i: T3 o4 I$ i1 M) T
    return 0;% o5 G5 Q4 U7 R$ ~3 ?
}
7 }  ?' t, a2 P8 i. N( a( b9 A4 a5 t5 m4 I; s8 q2 N
/ f6 F2 U; B3 M& q) A4 L
然后编译执行就可以了(*^_^*)
6 V3 S+ i/ H9 o7 z其它:TC++上一定编译错误,不保证在VC6上也能通过编译" y5 v9 M; R4 w1 s
      建议使用VC7或VC更高版本,或者使用GNU C++编译




欢迎光临 捌玖网络工作室 (http://89w.org/) Powered by Discuz! 7.2