返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,. v  K- s, X8 H( {' O' q. L% j) B9 b
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
* L5 g% o! B+ v7 u6 j( J只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 m% K8 Z, z. W5 \  l. x
参数解释:' A& E, a+ ]. K# d/ f. i% P4 r3 e" u
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ ?2 k6 s! h6 F- B, j! y5 bnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
1 _9 V; M4 m; C+ v+ c. X返回值:
5 M: H7 |: @1 h7 i  c" {返回非0表示计算成功,0表示计算失败有错误" m/ P* h$ _. A) Z9 o. I

9 x: T  \" {) m, ~ 8 C1 |. X# Q: O- y
) h' C1 P* m+ r( O% l2 a% R7 f
程序代码:
# f0 |% d$ w2 W! V' k
& ~( B$ F* M) q5 Q2 I# @9 U# d; Hnamespace fy_Exp{) |9 {. F) m. G  c% [# ?/ h
namespace {template <class _T>0 W* e8 c( `* c! T+ M
inline _T GetExpValue(_T t[], char& csym){( V, N7 ?" f9 e) i: \+ c/ ^9 N
    char c=csym; csym=0;
- F( ~4 J5 U5 ~) z" M, u6 u6 S    switch(c){
* I* V5 r4 X5 U: [$ N/ `    case '+':return t[0] += t[1];/ o" O  I3 M" j2 b+ l, {
    case '-':return t[0] -= t[1];. c; ]- r7 X6 k  N- e
    case '*':return t[0] *= t[1];/ n  Y6 i' k% ^/ _# t* I
    default: return t[0] /= t[1];//case '/':
  r* q# r, d% n% ]1 E- q/ z    }
, G& r" N& i) E4 J2 M$ R, Y: Z}}6 F2 [, G% S( q
template <class _T, class _Tstream>
6 [7 R& z0 G9 ^2 _9 O/* _Tstream: inputstream, _T: get return value
) k0 M' u' D6 d* Return nonzero if get value successfully */5 \3 o) C. ?' C1 _
int GetExpValue(_Tstream& istrin, _T& nReturn){
0 q( a# K6 b  j$ J  y. X; D    _T t[3] = {0}; //雨中飞燕之作( b# y7 Q7 Q7 O5 J( }
    char csym[3] = "++";
* C: J  e5 k2 O  V; Q; p9 X* R    int nLevel = 1, nERR = 0;8 |0 x/ ~+ N" ^8 `+ r. d# |. r% F
    if(!(istrin>>t[1]))istrin.clear();
* w$ V6 K9 R6 A! m: V2 |. n1 G    for(;;){# b( [: h) H! z% H* a' |
        if(istrin>>csym[2]){/ e% I* g' i  w1 K$ q& L) N: e1 e8 C
            switch(csym[2]){
' p& ~: n# s$ b6 [3 n# i1 e6 l            case '(':9 j, w+ M! Q) `5 O. r: c3 x
                if(!csym[1]){nLevel=0x100; nERR=1;}else
" F7 l$ A) e9 {( ^1 {+ Q2 I; v, Q% l                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' l& [: v% w0 |9 c2 l% ?$ O& f
                else{nLevel=0x100; nERR=1;}
! x) {/ i7 {, @- u                break;! b* p1 @2 ^; A
            case ')':
; ?7 ~* {6 O; y! I( h9 R# z$ S                {nLevel = 0x100;}break;
3 t2 E# q* d3 G$ T            case '+':case '-':case '*':case '/':$ z+ V4 k1 K. Y6 L' ?( O2 w
                {csym[nLevel++] = csym[2];}break;
8 U7 _- o/ p1 `: s! `+ g            case ' ':case '\r':case '\n':case '\t':continue;
$ f: e7 @$ g. O+ I5 L            default:* x0 _! A; U; X! B
                {nLevel=0x100; nERR=1;}' i6 Z. `) Z7 |; k+ u. {# f
            }& b. L$ j7 |& @$ U
            if(nLevel==0x100)break;% b% \/ v) @2 D/ l6 z% ^
            if(nLevel&0x10 || istrin>>t[2]){
: a/ D) {2 s8 M: `3 a                nLevel &= 0xF;
& U# P. z. c/ N3 H7 v                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. H: p* @0 u- a; Y- H# `4 t
                if(csym[1]=='*'||csym[1]=='/'){
' G! A4 [7 Z7 A: ^. `                    GetExpValue(t+1, csym[1]);
7 |& i0 N- S& N8 O3 C  U                }
/ b# n  o6 f( c) ?4 R/ s* ]                else{
! D: i) z# z) P3 A                    GetExpValue(t, csym[0]);
0 x2 x& q+ [6 X/ R                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 h5 H5 _6 ?0 s$ w( `% f
                }
7 `: [4 L2 E  p7 R/ W/ u; p7 l                nLevel = 1;# f3 c: y5 o4 J: \8 D+ R  _
            }! v- y* @+ S7 G, O) F  f
            else istrin.clear();7 k5 ]! T& f& h
        }
; c2 U1 T6 N' a2 E' }# m0 \        else{nERR = -1; break;}: F( q& `3 [, C
    }. l; {0 x5 o: Q
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 J/ Y# p) E, I
    else nReturn=GetExpValue(t, csym[0]);6 C1 U4 W) }: c6 q" R  r
    return nERR==-1?1:0;
: Y1 `, O6 H- m) a5 N" Q6 Y" @6 L}}
+ p3 v$ ^1 @1 p! v% l+ i
$ u" l: X  I6 o1 F3 }" \* S; w
  p9 f. }. R5 K6 w! W, d
函数模板使用示例:9 K0 z! D2 f: w2 k' U, ?
在以上那段代码的后面加上以下代码:: Q- v* O+ s3 q  w3 D2 e

0 a; W% w, t9 h
3 a- j& i; Q/ J) r0 m& S! r1 Q* ^) d* \& O2 C% i; O
程序代码:
. L5 C9 R) J; |# O/ S
: _/ J- u8 Z! F4 W2 g$ g. N#include<strstream>6 L0 E' S1 [6 a% k0 k
#include<iostream>
0 Z# ~3 e. l& b0 d3 b7 {/ A8 ~#include<string>: g% p+ k' ^% a# B
using namespace std;; ?6 f; ]- O4 z) y6 R: u
int main(void)
  e' s$ Z* b6 X{
5 Z* q; P) G3 D    string s1;+ b5 y, v+ ?# S  ]
    while(cin>>s1)
, m" s9 k: \* ^' D  |5 s0 O& S    {& l8 a  `& M* o6 z4 x
        istrstream isin(s1.data());" ~6 G" T/ o7 T
        double d;
  k5 b  C+ T1 }) q( |" v        if(fy_Exp::GetExpValue(isin, d))7 A0 w9 h: S; t+ |, [) Y9 O
        {8 c) N/ ?' J3 A6 v
            cout<<d<<endl;5 n- i5 @7 l/ l' |  `
        }
3 ]* K2 Y) Z4 V7 x2 S        else+ N1 W. }0 j' r( O
        {* J+ g& M$ S  W8 s+ B
            cout<<"ERROR"<<endl;: \# ~. ?- k. q2 G+ x8 T' e- r
        }
2 j- o- B+ l* O$ p    }+ `0 ^7 I; _& |
    return 0;
3 S& k: R) W2 X. N( j}+ w8 D4 \! {. i% K$ N1 [, g( u

7 Z: ~! C' J/ V4 i5 v
1 T) r; y" s& o8 Z. F; U1 N然后编译执行就可以了(*^_^*)
: V* a$ j) _' N其它:TC++上一定编译错误,不保证在VC6上也能通过编译/ a4 z/ B! m+ {: i
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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