返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,: M8 C+ q' U( V5 x$ [5 ?# @+ n
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, p2 d& U# F) v2 U7 m/ G只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2 @- O; r& ]: w* t! E
参数解释:
1 B. M- c# F7 U; Y  W. ?6 {! cistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. R$ m8 L  r4 H4 T9 O, m  N( K, x5 UnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: J; R% |1 j3 N# M$ _
返回值:  m4 l/ o. A% q, }; B7 }6 P
返回非0表示计算成功,0表示计算失败有错误
8 ~) [% f+ V$ W: e) F; C; ~' n$ [  m- ~

: z. |& ~8 a4 F4 k3 ?: O
! O! Z: V( s' @  d( w9 Q程序代码:
7 L3 J- c; [1 D! F( R. ?
) A' j: y* r0 T9 C( ]namespace fy_Exp{" k7 a9 g; I; b% z7 [
namespace {template <class _T>" V6 c' A9 T/ f7 o0 z' t
inline _T GetExpValue(_T t[], char& csym){
/ R  ]6 V- m2 V; \9 e# g    char c=csym; csym=0;6 q& o- o' M; t  `( f6 r: R
    switch(c){
" v+ h- k( ?# @4 X- k+ P5 W    case '+':return t[0] += t[1];% M, z) ?5 n. h' P; ?- T
    case '-':return t[0] -= t[1];5 }2 W+ U+ X% T3 h2 z4 H
    case '*':return t[0] *= t[1];
, b2 w  P: H* N1 |    default: return t[0] /= t[1];//case '/':
  n1 u) p2 h; N# i7 m9 C    }. v. M5 v7 U2 c) c2 J  K1 P/ k5 |
}}
' ^" z+ i5 F  V/ b: Mtemplate <class _T, class _Tstream>
. E( D5 Z, o& {5 Q$ L4 g/* _Tstream: inputstream, _T: get return value
5 e6 _0 N2 w4 m, u6 C4 g9 ?5 b* Return nonzero if get value successfully */
+ [6 K: i4 U# h3 Lint GetExpValue(_Tstream& istrin, _T& nReturn){! A7 L- q4 [. P% |* U5 ]
    _T t[3] = {0}; //雨中飞燕之作
5 k; N+ d0 C; H# F4 C6 n) G; y    char csym[3] = "++";
# `, `0 T1 b4 R- E6 A    int nLevel = 1, nERR = 0;
( w- `6 [0 W  I7 K& t4 O    if(!(istrin>>t[1]))istrin.clear();
. L" P" ^5 N1 N7 s    for(;;){$ z/ ^5 Y& O& R* i
        if(istrin>>csym[2]){0 ~- X  O2 Q- |: H
            switch(csym[2]){9 c1 g. p+ ]3 ~# l/ E1 k3 J, {
            case '(':
3 c* x. @7 }& r5 c3 p; `$ ]4 h                if(!csym[1]){nLevel=0x100; nERR=1;}else
% ~: m/ J3 M, Z0 t- D/ b/ C                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 f3 X( X" K  [3 k/ j
                else{nLevel=0x100; nERR=1;}/ @0 L. @; Y! }8 v* {
                break;
  x# X' Q2 e+ ?9 @            case ')':5 s9 N7 {2 ]+ x! U' I
                {nLevel = 0x100;}break;
! }( X9 c0 F4 W1 U6 P( m' D            case '+':case '-':case '*':case '/':  Y7 B* B: y- P' @5 |6 e
                {csym[nLevel++] = csym[2];}break;
) N& b. s* p# ~, ^; i% K            case ' ':case '\r':case '\n':case '\t':continue;, b( Z2 K  q% H7 B" S; V
            default:5 Y% N, v9 A& G1 g7 ]
                {nLevel=0x100; nERR=1;}6 F/ `" X) K/ i+ z
            }
9 H5 H7 e1 J8 l8 W            if(nLevel==0x100)break;
! W% F' u% z- c6 x( E            if(nLevel&0x10 || istrin>>t[2]){) Y) y- ]3 B- c( R4 n
                nLevel &= 0xF;9 O) X5 x7 `* H9 K9 J7 ]
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- Z% g1 v3 q. N4 i# B                if(csym[1]=='*'||csym[1]=='/'){! }4 p- }# g8 K# J$ D
                    GetExpValue(t+1, csym[1]);$ A" O) r0 T: k; n$ U$ `0 b
                }" |1 N% u0 e3 G; z. k
                else{
8 A' }2 T+ f7 ]% d9 A                    GetExpValue(t, csym[0]);
: u/ f& _8 Y1 k% B, `                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
2 t8 Z9 `* M9 S3 D, X+ b                }! h; n' \1 S( }6 @* H) A4 l: j( D
                nLevel = 1;& g0 J9 s+ G8 `3 \. `) _) F
            }/ r" g' j/ M. [
            else istrin.clear();
4 F0 T  O3 B6 Q7 V* |' A- v9 a        }
# L+ U: |) Z( m7 C9 C        else{nERR = -1; break;}& ]) T2 L1 K8 `
    }7 N! g- y+ e, w3 V6 D
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);2 {0 P2 `2 G* `3 l- m
    else nReturn=GetExpValue(t, csym[0]);2 H: O1 Z7 h: x
    return nERR==-1?1:0;* B; f( _8 \7 t, {
}}. _: T  S& ~% ^  }

' }( k1 ^: W$ x' y: L' n# m% Y7 ^/ m; T

4 w7 {' e' R7 Q! e+ z函数模板使用示例:3 r* q5 l0 ~8 |$ g
在以上那段代码的后面加上以下代码:
  ?" u  w' C8 C6 E# O7 ]. h: `
% ?6 e" T4 G( v 7 I9 O9 }2 u7 c8 P! O% \

. Q/ j5 Y; K0 h0 i1 `+ o+ c; ?: u程序代码:
) G7 W1 j1 \/ [, R7 Q8 k" z1 D. U3 L  w& T
#include<strstream>8 W7 t& }( s1 z1 u& B0 U
#include<iostream>
+ D! Y1 |3 E1 {. y' _+ }# O#include<string>
" p0 B- ]0 s6 a4 Q8 Busing namespace std;9 @) c1 _. N" N/ ]
int main(void)
7 Q" j0 Y- S2 w7 R1 ~/ v{$ o8 s* ~/ U" e2 V9 L$ D
    string s1;* }7 C! k3 F1 g9 i0 c) G1 C
    while(cin>>s1)4 Y5 z) `4 i, R  x" W
    {
8 Q) j1 N* h, \' _, S7 W4 _        istrstream isin(s1.data());; {0 A3 K: O; c( A5 |8 s$ }
        double d;0 ]) _8 {" x+ L
        if(fy_Exp::GetExpValue(isin, d))6 @3 a- `8 A/ @) m) i) T
        {4 [  r3 d4 O9 ^  F4 s
            cout<<d<<endl;
# t- n2 p! w; R5 u, f1 R        }
% H/ T# K3 w7 ?* }# Q& [0 C- z4 v        else
/ V% x: Z0 m5 g  M+ p        {* P1 V* g& s4 j$ d& i3 G# z
            cout<<"ERROR"<<endl;
8 H. u9 b) q* ^. ~% S9 ^! ]6 j5 K        }8 n9 G* l% ]& B+ i( b& {/ a
    }$ ^" x. m9 E! F& |' _; J
    return 0;
$ u3 N6 m" V' |8 a}
( V+ R7 j) u: w" l+ H
' m* N* [+ ?, t/ C
$ t+ O# Z! m/ k- X' d2 h然后编译执行就可以了(*^_^*)
6 X# j6 j' H1 `; A6 _4 e其它:TC++上一定编译错误,不保证在VC6上也能通过编译3 a* i. I, w6 _8 s( ~! _* M" H
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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