返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,0 J( u, K5 ], s0 V5 y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- g9 c( ~/ L0 P: p0 v2 J. ^6 H
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 Q2 Q% j' b, A. S/ q. F4 O参数解释:4 D" n0 l, q7 k8 k" e9 G& ?& h$ u
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- P1 e6 y8 ~, c2 _& L% fnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
  i! Y' W  H- C# H5 h4 }返回值:* D1 `! \2 f* M  @+ U; p" ]6 m4 ~0 i
返回非0表示计算成功,0表示计算失败有错误
- s! n8 p3 u, p% h$ F! s" H7 k' V% a, I& A' Y: v
; A* V& e5 K/ |1 ]" j( U
7 N2 f4 j" H# x
程序代码: % H$ ]/ j: `2 f, Y. t# l/ G0 L" h0 ]

8 y8 ]$ O: [- i  A3 b' bnamespace fy_Exp{- d* S) L" d) W
namespace {template <class _T>! f7 ?* X+ O/ T" U
inline _T GetExpValue(_T t[], char& csym){  u1 U! ~% o2 x5 u
    char c=csym; csym=0;
$ I) W- o2 e7 Z, W  P! E, `/ _    switch(c){2 Y* N# b9 }3 c: B2 L% b
    case '+':return t[0] += t[1];
" v8 S0 W+ W* j: V. Y7 |! y* C    case '-':return t[0] -= t[1];2 t/ T# T6 b* l3 q
    case '*':return t[0] *= t[1];
) J3 J# Y3 d3 y( b$ |2 Q    default: return t[0] /= t[1];//case '/':1 a( z# i# L% Z) @% x! v; b) N
    }( W2 I" w7 Y' t; R
}}; k! Z2 R* n# V/ n" n6 _2 |" i
template <class _T, class _Tstream>  }- C  W4 f! ]/ k" D
/* _Tstream: inputstream, _T: get return value
( M3 a  G+ n0 N- _* Return nonzero if get value successfully */
, f% {: s4 m, F4 `. Dint GetExpValue(_Tstream& istrin, _T& nReturn){
0 x$ A5 i* C  A$ O    _T t[3] = {0}; //雨中飞燕之作1 @& T+ z, x! y
    char csym[3] = "++";
8 I5 r* o9 {& y/ Y1 M$ L    int nLevel = 1, nERR = 0;4 b6 z7 g+ M; v5 z* j+ K9 d
    if(!(istrin>>t[1]))istrin.clear();
  y! B8 f7 S: _& Q    for(;;){
2 |/ @' C) d9 {& K4 v$ e        if(istrin>>csym[2]){
1 g/ M5 W; b9 d8 Y9 W            switch(csym[2]){
& e) Q5 u! T! `" i. |  l5 M            case '(':
3 o! b8 [9 \- [6 R                if(!csym[1]){nLevel=0x100; nERR=1;}else8 J6 a1 s- O4 ~9 E4 q: I, Q* {
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) B1 \* o) v- j7 m% B  w                else{nLevel=0x100; nERR=1;}% }9 ?3 x/ M8 X; d6 u. P
                break;* d3 \' j# P, S( J
            case ')':( R8 p/ h2 Q% M
                {nLevel = 0x100;}break;
6 P6 o7 Y' v, K            case '+':case '-':case '*':case '/':4 \4 y$ p3 N" s  Z1 o$ Z
                {csym[nLevel++] = csym[2];}break;$ r2 h) R1 @/ J+ x9 [+ M
            case ' ':case '\r':case '\n':case '\t':continue;9 n! b1 G8 {* K6 ^7 R# i
            default:
/ \9 N2 F  D( |* W                {nLevel=0x100; nERR=1;}/ \# e: ?3 |/ [, V4 W! E/ w' Q
            }& B: |2 m8 P" X# i- s$ S
            if(nLevel==0x100)break;
5 ^: v. _9 u& v* e, J$ l6 T/ o            if(nLevel&0x10 || istrin>>t[2]){
) N' U/ h* ^! L- M! i% [                nLevel &= 0xF;/ h9 q) ?9 u% V, N3 w# s2 s( U
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, H9 w0 C( ]" `                if(csym[1]=='*'||csym[1]=='/'){
: q" F" V3 |* G, k                    GetExpValue(t+1, csym[1]);1 u9 p' [, g( Y! U5 r6 d
                }% P( W& d" Q8 |* Y5 e8 d7 l
                else{
$ h  h# y% \9 O: ?# r6 q& D* u4 |                    GetExpValue(t, csym[0]);3 ]8 T3 Y8 W9 _, l6 x
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ d9 X, \( w% T) ~6 |
                }$ n' b+ b6 f$ e% k0 @& a; |
                nLevel = 1;
- F" }, j! i; @9 U            }
1 P5 S& t: h6 M, i            else istrin.clear();
9 M/ v" G9 Y  s! z        }& O0 h* [. ~9 r! o0 B7 q5 C
        else{nERR = -1; break;}
; N* o# S) F6 i1 q8 t, d* V5 t    }
, ^) u* z+ o- g$ D/ ^    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; G# P. H: R# w; S7 z  k
    else nReturn=GetExpValue(t, csym[0]);
7 K: B: ~. }/ W2 u$ Q    return nERR==-1?1:0;
: Z+ i1 ~" D7 K! w6 H}}
8 d: {) U, |, ]
( H- \: q4 ~4 f9 ?  f
, w" @# a' ]& p% q( R* J7 [  H9 r! q& C6 _) I" S
函数模板使用示例:0 v2 c7 O. e1 a, y8 r- C1 Z
在以上那段代码的后面加上以下代码:+ h: v+ q* B7 M& d
) ?6 q* m# w# B' I; l

( v; ~0 W/ T: w
2 L9 j# A: Y6 N: X# _4 p程序代码:
9 Z, _& R7 k. F. j6 O1 i
8 ?+ u  B3 U$ d- N* b#include<strstream>
$ T1 G6 D/ R* x, `( _9 v#include<iostream>
2 ?/ W2 c2 @# R$ O" t#include<string>" z% ]  I: [+ _6 w2 i8 B
using namespace std;
5 |6 Z$ e! w; r" e3 p! v  sint main(void). I5 M2 {7 j- o7 _3 s
{8 w, \/ v) |/ P+ D( P/ b7 ~
    string s1;
. S' _- y: s% y( f0 n. \    while(cin>>s1)
/ C1 k* Q3 M' z4 H$ q) j8 V    {. [' V( G; f4 S3 H1 M
        istrstream isin(s1.data());
4 S6 x! G$ f  P8 Y9 \        double d;: R4 @0 N4 H7 R% y" W2 H
        if(fy_Exp::GetExpValue(isin, d))
2 X1 ]# d) }; d% q( Y) J( E; A        {9 t% K- I4 r) W8 T' `6 m. j& y
            cout<<d<<endl;$ i6 X* q3 B# Q  l9 @
        }
" p8 W' `. L6 h8 I. t        else
/ g4 Z4 p1 l, k$ F( R, \+ W        {& n, U' v  _2 J6 x
            cout<<"ERROR"<<endl;
+ s% a. y: m9 v" M3 j        }& B3 u0 ]! v- o+ p6 @8 R4 ~$ u6 U
    }
: v/ y# r9 D$ y3 O) y+ }: G% v" ?    return 0;( T! b- k) q* r5 |- ^. j# U
}
6 ~5 N/ E% B/ ?. c# m# v
! l9 H/ T' `4 `' W  [2 X1 X, L  a3 \
然后编译执行就可以了(*^_^*)' }: R9 N5 o( M# o3 t  c* h
其它:TC++上一定编译错误,不保证在VC6上也能通过编译2 N$ x/ B$ ~1 n" j: s# @4 t
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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