返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,- A$ m. r* K5 R$ Z' q( M
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式2 c' X! ~* k5 C5 f- T1 B9 E" E+ Y
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)8 s, S* O1 L+ m2 l
参数解释:6 d1 }: t+ C) J0 y: |7 o. H2 K
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流9 H0 L4 g( B8 m4 k' i6 ]
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 P4 p% Z; l3 i  y  d
返回值:/ v0 y: _4 K) }! g9 k6 w
返回非0表示计算成功,0表示计算失败有错误7 \3 X; n: K7 W

3 U4 J* [5 E5 S7 F; v6 b
. f# x0 J5 |( d
0 S% ?& @; P) a* }程序代码: + b/ s! u2 K; M  \: T0 C
  }) n$ u6 I! Y* ]+ a
namespace fy_Exp{
+ w2 ]1 y/ x: m% bnamespace {template <class _T>
; W9 K) x$ @- }inline _T GetExpValue(_T t[], char& csym){
" `, D9 J/ `; p6 ?8 ?$ J    char c=csym; csym=0;
" D8 g" L- w" M  y& G( Y2 `6 f0 Z' j: o    switch(c){
$ Y( V# b. @+ f* @2 E% y    case '+':return t[0] += t[1];2 Q3 n, F: m: m- i  y# q
    case '-':return t[0] -= t[1];% k* ]! a( [$ d8 q1 @  s
    case '*':return t[0] *= t[1];
& E4 K7 J: s/ U6 e( E& g/ c% e    default: return t[0] /= t[1];//case '/':
/ d4 S; P9 z5 o* c% W! r4 D3 k    }
& t1 l2 I. Y. T+ \/ O. `. p8 L: `0 X}}
3 r' M/ R6 r) P. S+ Ntemplate <class _T, class _Tstream>
- |$ H7 f' x& H2 m/* _Tstream: inputstream, _T: get return value
! @; A% W; \! E* Return nonzero if get value successfully */
7 N/ I+ J- |) vint GetExpValue(_Tstream& istrin, _T& nReturn){; o5 b# g, I; y% m) h, y: e. {# z" [
    _T t[3] = {0}; //雨中飞燕之作
/ w2 R+ K8 i9 e, y    char csym[3] = "++";
7 k- E& o! O7 a# }+ C    int nLevel = 1, nERR = 0;
7 g: [* R3 _3 V) h/ h5 R    if(!(istrin>>t[1]))istrin.clear();
+ u6 D6 Y: w5 M9 s, c" h0 Q    for(;;){
7 g1 s1 ^& k+ r) a        if(istrin>>csym[2]){
9 c, D% R' `- T: }7 g            switch(csym[2]){! u, V% i' m. |: y+ l
            case '(':
! ^# G/ ]; b0 ?2 B* t                if(!csym[1]){nLevel=0x100; nERR=1;}else
7 }4 }' i3 b: P3 x                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 w9 B, |8 V) G' @4 `' G2 x
                else{nLevel=0x100; nERR=1;}
  q; p8 @& [6 }2 k( M' t* X$ A+ W                break;6 ~# v1 T$ E$ a7 m8 d( p0 P4 W2 V
            case ')':
# G0 p1 A/ l! Z# `; w$ q* t/ p% m                {nLevel = 0x100;}break;6 I3 Q( p9 S4 X' }/ ^
            case '+':case '-':case '*':case '/':
* X/ X5 y) b) d1 s                {csym[nLevel++] = csym[2];}break;
0 C; B- K# y+ V& r2 ^4 y; \0 I            case ' ':case '\r':case '\n':case '\t':continue;
4 ^( i" E/ Y4 S" ]6 p/ \- a5 n            default:
; r( G$ `6 u6 C+ U0 y! X                {nLevel=0x100; nERR=1;}' {3 }2 F( [% X0 [5 }* d% d$ F
            }
5 y, {  m6 n2 c: m0 `" c            if(nLevel==0x100)break;. {: V# j2 C  a& R1 d
            if(nLevel&0x10 || istrin>>t[2]){2 l* G6 z% Q, ?/ @, l7 {" K
                nLevel &= 0xF;5 G' A: {% T: Z6 H& W$ U, u
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 Y% }& W) T% B- h: g" U                if(csym[1]=='*'||csym[1]=='/'){
+ M# |1 k7 M( E3 J6 ^+ O7 P% O$ F* R. i                    GetExpValue(t+1, csym[1]);0 I' {( s0 J: o1 r9 J% ?
                }2 A+ w( E" v0 k% ~- g7 l
                else{& y5 q, c: E& m4 ?6 R, r* c( I, Q* N
                    GetExpValue(t, csym[0]);
  R; p$ n1 w: B1 u* x4 ~; V                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;9 J9 z5 V1 \4 m
                }
( c" W& _/ [, ?( n0 L/ J" J" v                nLevel = 1;9 s4 z3 y# M5 d/ O( d5 J
            }
2 T* M& e" l! P4 l            else istrin.clear();
, V4 Q9 r: P) @: h7 V        }' e9 q+ ]' ?/ c& p2 B; F
        else{nERR = -1; break;}
, a% Z- }6 L+ W! z0 ?    }5 \; b- z9 V8 U
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, H  ?/ p* g9 E    else nReturn=GetExpValue(t, csym[0]);4 K- n- `$ E5 P1 i4 R
    return nERR==-1?1:0;, C1 K' }* T/ E4 H
}}6 n; K9 D8 E+ M* m' a
# V" j. y" i, O  w2 f) `

6 h7 B$ K- G" y" a/ I4 F
' w; J/ a, P1 J" m$ h+ ^& w函数模板使用示例:/ ]& z/ f5 l8 x9 J; R
在以上那段代码的后面加上以下代码:
0 g1 {; F! @  F! E. H7 I, ^! h( W- y! _1 k( \! z6 `' o5 V

0 x2 ?6 f. V; E6 F9 H! h8 u
7 }: \3 b- j' X. ?- G6 q$ z. U! w% g0 m程序代码:
: J# j: q( `, V) f9 P+ g' W
+ ]4 N! f: }, M$ m6 c1 x8 |8 L. o& G#include<strstream>
8 Z: K1 `2 X. X0 R& ?4 t#include<iostream>- `  w& Q' a9 u4 v& n
#include<string>1 Z+ }! \- X4 S0 Z; {; Z( G  ~% z
using namespace std;
! m: r4 v8 t! s/ E' `' F  cint main(void)
. k; b+ o; h' [' E' ~* V{1 T, c# S5 X* R8 d3 [: G
    string s1;
. ?2 W# D  E5 j9 C, i    while(cin>>s1)' J% |9 @" E; @# O& b/ V" k2 c
    {
. |* ?0 X1 X& R        istrstream isin(s1.data());5 p) V- S( O6 R
        double d;
' l! X/ L% ]5 j+ h# {. B8 X        if(fy_Exp::GetExpValue(isin, d))
) ]4 c# y- i$ [. ]! g- x) M        {
1 h0 |0 f' }7 ?& l            cout<<d<<endl;
# J3 r% G9 E( C        }
% m- e/ E& \, H8 O) w6 I' n        else
: a, M: \3 H# E( n        {
9 C6 ^: i3 F7 R7 J- @" I            cout<<"ERROR"<<endl;8 N: {/ s( g1 @9 j  S" W0 u" }
        }4 |$ M& ~. G2 e5 B
    }
. _6 T* P: k9 o9 o: f* c& g/ x    return 0;
7 y  Y( N3 [1 |( W# o}
% `4 ^% d- \" f9 C" e; h# G
* W; }$ r" B8 e- A$ Q; E. X; i! t- z- L3 ?) r/ w! _$ J% |" O
然后编译执行就可以了(*^_^*)- j# Q9 O/ u" \, U# @
其它:TC++上一定编译错误,不保证在VC6上也能通过编译* ~; f" a7 E% t: ^. v
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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