返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
& M% ]& E* e1 m9 j! Z  v9 T一个很方便的函数模板,可以并且只可以计算含括号的四则表达式* P! F/ e! ?3 B! f* a
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): @9 `! c: [3 O$ J. q
参数解释:- @/ W$ @$ X/ X% a
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流$ ?! Y' d1 M/ c# N, j% e
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定  G6 t1 N& H5 v2 V& _
返回值:
. y  i( ]  H( i# I) d, F2 r返回非0表示计算成功,0表示计算失败有错误" R# c* u0 x. {8 D+ k9 h8 P

5 C* Y! d7 S& r% \1 u! |  i% R 8 z* f8 E  p5 x* H) I8 J0 I* F7 h

! K( [' ^3 ]+ @: F7 j程序代码:
+ h7 b' A7 y  x" D% X; E# R3 \6 n) Q" c( }' A" o
namespace fy_Exp{) a6 A8 |$ h- d) V3 y. g8 l
namespace {template <class _T>
& Q" r# V3 j0 I4 C" P& f1 I6 g6 winline _T GetExpValue(_T t[], char& csym){
* D! D9 s* B+ V    char c=csym; csym=0;; B$ A& T) N+ h5 w! w# `" p% O
    switch(c){6 A$ E) `5 _0 V7 e+ ?  @
    case '+':return t[0] += t[1];
( u; G' n. ~& S# A2 n    case '-':return t[0] -= t[1];& g& ?8 X+ U* w, D
    case '*':return t[0] *= t[1];  h& ]8 ~( i; U4 S" ?
    default: return t[0] /= t[1];//case '/':
% G7 l4 E' j! N! k    }5 t3 w; t# b- R/ R" {( I
}}$ b4 i$ @2 U' t; o7 H
template <class _T, class _Tstream>' r( Q. h. }7 }, g6 }- {% e3 d$ a
/* _Tstream: inputstream, _T: get return value, X. H3 ]- L' b; x6 f7 C1 q
* Return nonzero if get value successfully */
8 s5 z/ ]& ~6 g0 Lint GetExpValue(_Tstream& istrin, _T& nReturn){; e5 l" J) ^. n# D/ ?& w# G! K* n  {
    _T t[3] = {0}; //雨中飞燕之作. R, c  X) O' ?" g. C# ^! f! a; _
    char csym[3] = "++";
& _2 v7 q8 g! I    int nLevel = 1, nERR = 0;
3 v$ T& L: w. v+ z9 M. s    if(!(istrin>>t[1]))istrin.clear();
, ], y& C8 f7 T! a    for(;;){
8 A2 v* |- I7 C" E        if(istrin>>csym[2]){
; V( z" K) T: V1 S9 B            switch(csym[2]){
. Y- I/ l$ [; j/ }# x1 o. ^8 R            case '(':
% H8 B! Q* o5 z9 i; h' J                if(!csym[1]){nLevel=0x100; nERR=1;}else
! ]) {$ x% o  s; O/ N# ]. `+ Y                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# K! n9 S9 h9 K1 o8 e) N9 z
                else{nLevel=0x100; nERR=1;}
& g. ~, [5 M* `                break;
, p: X$ V, _, d( c            case ')':. m+ h, o' o6 |: q$ C7 ~0 P
                {nLevel = 0x100;}break;
8 ?4 j! i) H5 j( N            case '+':case '-':case '*':case '/':6 r7 l" v. @( B; m5 x7 n
                {csym[nLevel++] = csym[2];}break;: ^7 O- Y# d7 o7 o7 L5 _
            case ' ':case '\r':case '\n':case '\t':continue;! ^. B! {5 q5 ?* q& B/ C  r, c* H( |
            default:
' i  t0 h6 D: R, o* F0 B( H# f7 E5 |                {nLevel=0x100; nERR=1;}
. |! I/ _/ V  B! L            }
: u7 W- D& d0 R: I            if(nLevel==0x100)break;* p6 w* ?- g- Z
            if(nLevel&0x10 || istrin>>t[2]){8 W. V* u. w( R# x. F% f
                nLevel &= 0xF;& I, V9 [5 p. t& P1 L1 q, q5 w
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 |3 L9 x# C2 i( A8 b7 y# l
                if(csym[1]=='*'||csym[1]=='/'){0 O3 ^( Q5 B. `2 d
                    GetExpValue(t+1, csym[1]);
7 K7 C  _8 q7 P8 f7 R: w) b. s8 {                }
  s" }* K% I* E. {2 `$ N                else{! R# X3 N( Z$ _' t' a5 q8 P! x
                    GetExpValue(t, csym[0]);
) x( g5 y2 O+ \; a" C                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
  l2 c$ L; O% n$ H/ B                }4 K. D% {; n$ ~8 W* w: C, @
                nLevel = 1;
8 [5 g8 M; ~' q2 `# M) T            }
% c- g6 W, e9 O& D" t; [            else istrin.clear();3 D* t- e4 d8 W  _! ~, g
        }
" l! h" S- ]/ s( Y* ?0 a        else{nERR = -1; break;}
* [3 l& ~! ^) \! Z) V    }0 H: j8 D  Z& X0 N& K* Q& Y  H2 N
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);. u0 Q0 G7 w3 l9 W0 n
    else nReturn=GetExpValue(t, csym[0]);* R5 {8 r" |9 c$ J* v6 w
    return nERR==-1?1:0;. g. r. L: N* e' X+ b# L
}}
  s  E' r- a2 _; R0 L  C% c, E& h* T2 }1 R' K
2 e4 }! `8 g7 O
4 U& I( N- A4 W. c3 N3 r  d# h
函数模板使用示例:
" Z) I2 u* n4 P; I在以上那段代码的后面加上以下代码:
3 ^9 i) d- t3 u, g6 t$ @% X8 `; X" f6 o
% l  i3 m+ a6 u8 T: L- t$ l

/ w2 K! O; o5 Q5 e( Y4 Q程序代码: 3 O7 k3 G. n- s- ]& G" @& C  [& Y

* s& W! a" \7 N8 @6 A+ U9 [" C5 n#include<strstream>
5 ]) N  m9 k4 I#include<iostream>2 c3 t! h2 v7 b' j$ k5 ^7 Y3 |# C+ `" A
#include<string>! k9 Q5 B; k8 H4 O! p9 W/ F) P
using namespace std;: d3 j0 n- K: m0 Y& {) q, d& p
int main(void)0 m" c7 v8 b9 v1 E& i! p( b
{4 k; f" v% f' W; A! c" P
    string s1;
4 j; N' e  X3 J) h* g1 ^- K    while(cin>>s1)5 h! [+ h2 X5 k1 m* L
    {
. K2 _3 Y1 G7 O2 t' V6 H8 b& B' l        istrstream isin(s1.data());
& y* n/ \4 V0 S8 F5 W; V        double d;
0 O3 N8 k2 S* t5 D        if(fy_Exp::GetExpValue(isin, d))
4 @. w3 _+ ^' q& `        {: o1 b% e0 u1 R, {, v5 S2 Y
            cout<<d<<endl;
7 h- ~' m! r3 n8 `        }
2 X4 l* w$ t2 k* m) Y        else; W" K/ `4 S2 a: Z* e0 |9 c- @
        {4 h) ]/ z# n& \) p8 B; x
            cout<<"ERROR"<<endl;  y& P8 x7 F( \& Y4 b
        }
3 c( R8 Z; L: ?+ L  A2 j6 [    }, J' C" v, L, l5 s6 d+ B; {
    return 0;; X( k1 q# k% c
}9 y% i' q$ V. |6 @

9 ?2 {6 X' ~* o/ t) B5 s9 A3 _9 F) B9 X# {# X
然后编译执行就可以了(*^_^*)
8 H+ w2 ^' I6 s, ]6 X- n其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! `6 R% b& b/ I, u1 P      建议使用VC7或VC更高版本,或者使用GNU C++编译

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