返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,( ]9 E  ^0 `# d+ C1 y5 e' g
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
; x6 q) W& o& J4 U3 q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2 e' W; P0 E+ E# \3 v! b7 |8 y
参数解释:
9 [2 f8 S9 t; y8 T/ iistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& `; H- z$ V3 u5 h) }+ W9 }5 m  {: CnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定6 M1 e  P0 L" d( u3 ?
返回值:
) {% O& ~. g5 A; M8 k返回非0表示计算成功,0表示计算失败有错误. @. `/ Y4 m- I5 s1 G
: \7 z  P. ~, Z* F8 c  }$ T- ^

; M$ d- M, E* F9 h
! ^3 v0 w& o- m3 s程序代码:
5 [- W( }( R4 C: G" j4 C, b6 R7 e7 M! Q
namespace fy_Exp{" v: Q5 ~; ]8 I3 ~% h
namespace {template <class _T>
  y3 _# T1 j, s; G3 v8 v6 ginline _T GetExpValue(_T t[], char& csym){2 F: i3 p! F& Z" i( i( O
    char c=csym; csym=0;
6 d4 }( I% U' M' Q    switch(c){
6 y% `$ e) M8 r. e3 ]    case '+':return t[0] += t[1];
/ \3 |8 i4 Q+ ]    case '-':return t[0] -= t[1];/ b0 m: Q- o  B# N3 b
    case '*':return t[0] *= t[1];
' h1 L! x. ?. Z( G8 u7 o    default: return t[0] /= t[1];//case '/':
+ w1 G* F. v  j    }
6 ]  p- K) f& M+ T2 a}}
4 I* J7 u1 n. U# h2 G: N* etemplate <class _T, class _Tstream>
0 h" k0 N+ Z8 e! M$ L9 b/* _Tstream: inputstream, _T: get return value( Y% O% v# n0 }' ^/ C
* Return nonzero if get value successfully */
: S( Z" }; P2 A) x# [2 o2 @4 `int GetExpValue(_Tstream& istrin, _T& nReturn){
$ {1 f' p+ q1 d, }; i7 C    _T t[3] = {0}; //雨中飞燕之作' Y4 F  e9 q- c* A* ?; P
    char csym[3] = "++";
' I4 R! E5 o, h" H9 G* f# y# z    int nLevel = 1, nERR = 0;
5 H6 k/ I. [- a+ X8 n7 P    if(!(istrin>>t[1]))istrin.clear();
+ s6 U: x! \1 D    for(;;){  u; G2 R5 G' C6 D. t  H
        if(istrin>>csym[2]){* f" k8 E3 \/ v, M6 S
            switch(csym[2]){
4 g: n# u4 X& }+ Q) ^( t            case '(':
( R9 e3 \% o2 K                if(!csym[1]){nLevel=0x100; nERR=1;}else- l) P( N. d, g0 J; v
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 N/ |! ~$ E. O; i
                else{nLevel=0x100; nERR=1;}, q. c4 V, g: p" G
                break;
+ {( q; N2 D2 i# M            case ')':1 S  y  }6 l! v! g1 }6 O
                {nLevel = 0x100;}break;9 j& |4 S$ y; F7 h8 L: w! D" K
            case '+':case '-':case '*':case '/':
, h; `. Z3 c) S+ F/ D5 I' R$ `! k                {csym[nLevel++] = csym[2];}break;
+ D& ?0 M: o% Z/ O4 J            case ' ':case '\r':case '\n':case '\t':continue;, `) |& M& w$ ^: K! A& J* ]0 I0 Y5 R
            default:
* e9 y& p. w. P1 N3 N7 ?$ X; v                {nLevel=0x100; nERR=1;}) t3 Y6 E+ r  a  s$ {) A% l4 r) m" Y
            }2 N) h0 {% |, u" [- s
            if(nLevel==0x100)break;( D1 `" }' Q- O( F# _
            if(nLevel&0x10 || istrin>>t[2]){
# O  i5 R/ i% W                nLevel &= 0xF;
3 U# S, |) V0 ^7 u9 x" d9 D4 m                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
% y/ V/ ?0 s1 f7 I                if(csym[1]=='*'||csym[1]=='/'){& x& [# a8 ^" N2 J4 m
                    GetExpValue(t+1, csym[1]);
, s! o0 u! G9 t0 w/ l                }) G# E3 z" y5 c. V# M
                else{- f( x: w' R* I) P' z
                    GetExpValue(t, csym[0]);
( @# q1 _) h2 z! @2 l3 R9 V+ z' W                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;0 o1 p3 i3 _+ ~- @9 C
                }
0 V1 N; M9 g6 R1 i                nLevel = 1;) e; Y8 Z* r; ?
            }0 ^. v9 ^! b2 O
            else istrin.clear();8 m4 \, ^% T8 C; i
        }9 ~/ b& q2 \2 |
        else{nERR = -1; break;}8 v* [& k8 M8 }0 d8 m9 ]
    }1 f; S% U, j# m3 o
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, x2 y2 c( J& O3 q6 ]$ P7 z$ ?    else nReturn=GetExpValue(t, csym[0]);
2 p  ?# x- R2 M/ z, X& r    return nERR==-1?1:0;# F# B4 f5 M1 Y7 Q6 \6 c. L& q
}}7 a, ^6 V" M4 T. p
$ E2 N: c  |& m) R" h( {3 y* G

! g* j( l2 T+ n
% J5 t7 L" \' `$ Q5 P函数模板使用示例:
6 d. e0 V( ?1 d# }. |在以上那段代码的后面加上以下代码:2 x3 S% f) C5 G( g' U

- n# x8 u  W/ p- w: L) Y, } % a8 E3 J3 M) y5 U  u& Z
+ m+ ^9 g: i3 b) J$ X
程序代码: 5 v5 h3 ~- y# h. N6 |5 C

' I4 c- }, R* v#include<strstream>: a* u* T: b' g/ A% D! y
#include<iostream>
- n# u  J, i# t/ u* U% I7 j' q#include<string>
, _. |8 n% i5 J6 R' J( jusing namespace std;
5 T9 @+ J# b3 W$ K& Hint main(void)
% b, ?- ]$ y6 x2 f! b8 D{
' a0 {5 r- d9 g4 l& }    string s1;/ |- k: `1 r% E: e5 R
    while(cin>>s1)
! c. D2 {" U) l6 e8 n3 |: o1 u    {5 v* ]5 a6 q9 a9 m* P4 V
        istrstream isin(s1.data());0 `5 f, d. H' o+ |
        double d;' x- z$ Q" n) S4 W6 x
        if(fy_Exp::GetExpValue(isin, d))
. a2 u8 ^* P* j$ X( K3 [& z        {
& G5 O  N* d6 F, W$ [$ v! y% I            cout<<d<<endl;/ W+ q" f# k$ ^9 m0 ~8 [
        }
! Q% W/ Y# t' b3 P        else7 y8 q' B' ^- _% [
        {
+ Q6 E, B: S$ I0 k5 k2 t            cout<<"ERROR"<<endl;
- K/ Z) D; C+ |2 k; Q! \5 B) N        }
' G& b+ o: ^4 @& q* @    }
! m5 o( h/ |$ H% g    return 0;
1 u+ g5 P5 n/ K9 x3 ^7 x- ?7 x}) t% t8 E) H% k0 r9 y

8 Z8 V, P6 _5 h3 e$ G# T
  [) ?. I6 ~! [- R" G2 J! H然后编译执行就可以了(*^_^*)4 _# W4 m# G3 T. t9 K$ ^' ^' ?
其它:TC++上一定编译错误,不保证在VC6上也能通过编译: d+ R6 @& V8 o& V
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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