返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,* v% b% b# x: y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 {; x* T4 z! a# A' _只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( d% {" r7 i' f' R, l参数解释:# e) @8 R# ^7 R; W! }( j0 S1 O3 v
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) \9 ~& W4 v8 G4 h
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 ~1 u3 E4 R, h+ M
返回值:
6 c- @  d0 C$ t+ @" S0 J( U+ r返回非0表示计算成功,0表示计算失败有错误3 ]$ X" A8 `. N8 i5 d
* o0 Y: M4 D  m  j! ]; _8 H

! R( {' D/ A* V
, T' R2 Y( N& `程序代码: % W2 |4 j$ }& ?  ^2 b* d( W
0 G! u: w& I6 V9 Z* h
namespace fy_Exp{% O" v& V* a, R% K, @$ t* o/ O
namespace {template <class _T>6 S% X, N9 r# K4 V2 m
inline _T GetExpValue(_T t[], char& csym){, q  `' \" y" ^6 N9 y, M% N
    char c=csym; csym=0;
% {2 M. ]+ s$ w4 C- |5 m$ Y    switch(c){
# k5 G" x  t2 M4 m  L$ r    case '+':return t[0] += t[1];
+ a( F* g) H& Y. \    case '-':return t[0] -= t[1];- b, ~2 O7 R' h7 w
    case '*':return t[0] *= t[1];% H; T9 I; Q% E$ D4 B( y
    default: return t[0] /= t[1];//case '/':" t- J, p. N) [2 ?: r% `1 g$ b
    }
  ~! ^# X2 v, _}}
7 }8 w; F; c! A$ b& Ctemplate <class _T, class _Tstream>& D  Y( V/ q* y) m, N* d' r
/* _Tstream: inputstream, _T: get return value$ P2 R" S5 N) [7 k, H1 |- V3 c) d2 F
* Return nonzero if get value successfully */8 b9 i) p; c. I6 E( J( D* @/ |
int GetExpValue(_Tstream& istrin, _T& nReturn){! J. s$ P; W3 _$ q0 L$ o
    _T t[3] = {0}; //雨中飞燕之作% T. o# g: ^6 @) C5 h0 T% C
    char csym[3] = "++";' F" |* \/ T, j" |! b9 R1 J8 C
    int nLevel = 1, nERR = 0;% ^) t; a$ K  [# I6 v/ E2 z
    if(!(istrin>>t[1]))istrin.clear();+ o; [" a! w+ Q6 O+ d! m( ~
    for(;;){& b' C! p+ A, `' x
        if(istrin>>csym[2]){
7 a) K; x$ n4 e. G, i            switch(csym[2]){3 }6 u2 I, l8 c" O
            case '(':5 ]6 V6 `5 v/ h1 t! `6 A
                if(!csym[1]){nLevel=0x100; nERR=1;}else5 a8 W8 x; ?; j: R/ A% B" L
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! v) s. F* g, B: p
                else{nLevel=0x100; nERR=1;}
9 x  m0 Q, @4 ]- T& E" E- r7 Z                break;/ z6 S9 l! Q' S+ D7 B* I
            case ')':: t* S8 ^, S  e1 ]
                {nLevel = 0x100;}break;& O$ d2 {* `% R' _* p
            case '+':case '-':case '*':case '/':/ N( a; J( R* m2 ~
                {csym[nLevel++] = csym[2];}break;
! F' t- u/ j, h: e0 K3 W" [, a            case ' ':case '\r':case '\n':case '\t':continue;. ~/ O2 k* F2 }  ?' z. `
            default:/ n8 b: y4 q0 U$ E5 R8 k
                {nLevel=0x100; nERR=1;}
; a9 V, J+ w5 e$ @            }+ ]4 s- P3 {2 P! c) K. ?) D
            if(nLevel==0x100)break;
* |% O4 u& T% U: a3 P6 t  o9 s            if(nLevel&0x10 || istrin>>t[2]){
. K. E6 r. ]  l0 m0 _0 q                nLevel &= 0xF;5 [, i# r" a9 m; X, \
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" q  c5 `: b2 g: p3 J                if(csym[1]=='*'||csym[1]=='/'){9 @* k3 j) T% X+ U# t
                    GetExpValue(t+1, csym[1]);9 X: i, ]2 |# ~4 D
                }
* |+ T# `) k% ^1 L. L/ C( s                else{9 r6 e2 Y2 ]% v
                    GetExpValue(t, csym[0]);  Q) @' e+ D* R/ \6 O# }
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;- V  S' R. ?: C9 l0 T; [
                }
  E4 l$ A9 o, F                nLevel = 1;$ c* o/ I/ Y1 [# S
            }
: x7 N& Z. n. k            else istrin.clear();
. s% I1 ?5 }+ W' w- R        }
+ X3 T7 G( X/ l7 H. I6 ^9 |  n3 [        else{nERR = -1; break;}: b' C* Y- E5 e5 ]9 L! Z! [/ k
    }
& F! x5 F! B' b0 @" u    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 i$ {6 i$ D4 d) |& d    else nReturn=GetExpValue(t, csym[0]);
9 D& W. z+ c, n    return nERR==-1?1:0;1 z( M8 I0 f5 o4 ~1 d
}}
6 s/ @! q% X7 o' x0 Y2 v) w7 G$ |
! w; a: o3 b8 ?/ o$ `: [3 {0 e- _. L4 m( F. m) v

/ |8 F% Q8 m- Z- s/ {5 C2 ~% O函数模板使用示例:
2 Z$ i, q0 Z. a3 F& k" f; N# z在以上那段代码的后面加上以下代码:1 O4 W: I% ?  ~
& ~& ~' n& I6 G( A2 b4 F9 B

3 _5 ~" E# C# J
  M: A, Q" \, s% h程序代码:
2 n) ^. F/ m; c
  m, ]0 D7 r3 l' U. h5 i8 W$ s#include<strstream>& b! r; K/ X4 q4 E; i  c
#include<iostream>
- w3 d4 o) r) U#include<string>: b$ f8 d& g/ v! K1 }5 f
using namespace std;1 E# b2 ]3 B1 ^) H& n7 R: H
int main(void)( K! m3 a# O' }. R5 t. p, C
{
% j/ u4 Q6 w& T    string s1;
; Q/ m9 v" k; I) c* ^    while(cin>>s1)
1 }: D& ?5 _# @7 `: F2 g5 X% |    {& H, ~. N; F: w' ^3 }
        istrstream isin(s1.data());
( `2 W2 |! v1 K        double d;
5 f; w+ {+ q, w# ?3 m        if(fy_Exp::GetExpValue(isin, d))
- T) c" s# Z# V& k. b: f/ L. Z        {7 i# f$ d3 c# w- A# s, P$ \
            cout<<d<<endl;+ O. I2 Y: G/ |+ I7 o
        }
) d/ @$ V6 S" I- {) l6 A        else8 k' K' M( N* p6 V& l+ H( g
        {8 X* D- m2 O8 Z5 k9 `
            cout<<"ERROR"<<endl;
; a, S4 |2 @/ w* i  E1 _        }- s% N/ b  I3 E" y
    }
3 T& w2 l1 A& B6 ?! H6 m    return 0;
6 H, U- ~5 {( b6 I7 |5 j/ x}( z9 i: ]% @  ?3 S+ \3 {
* @2 ?+ V7 L" L& g

2 T7 N, m' r, S4 v& s# o- [0 P然后编译执行就可以了(*^_^*). r% c3 k/ u6 n/ w1 F' Q; x. H
其它:TC++上一定编译错误,不保证在VC6上也能通过编译" L# Y' V. N/ ?- f8 m
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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