返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
, B; y) Y! t1 `+ a一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) \; M) n6 _* O; t+ A( l" G3 l只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( y: k7 ^1 @, ~" T* Q
参数解释:
2 e! v) j; U" h4 Y2 wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" ]: O6 v+ ~* o- ]  D' q
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. J" G& T2 Y$ _1 T% w, B, Y
返回值:- r% G5 p- M+ A) U
返回非0表示计算成功,0表示计算失败有错误' X3 d8 Q, ?! y  ?% c# Q4 ~. G
+ l8 z# y0 F& G* p, U6 Q* X7 p2 @4 a1 R
6 q) p8 H& d8 h

- A% V8 L, Y$ M7 n4 L程序代码:
$ t: l( R0 `5 f1 M6 z3 C5 K) z! S; s% i; X6 ?" c* v+ x
namespace fy_Exp{. a  P" N; ]- w! M, c1 d$ q- a
namespace {template <class _T>
. n  B% l2 f9 ?3 E1 h4 }7 @% e' {inline _T GetExpValue(_T t[], char& csym){/ V/ F' u8 ~9 v* M
    char c=csym; csym=0;
  A9 M' Q) ]- Z$ J2 x    switch(c){
) t" N$ j/ j" b    case '+':return t[0] += t[1];4 b0 I# x- h1 x" P" g- e
    case '-':return t[0] -= t[1];
: |! {8 [& X* T/ H0 N    case '*':return t[0] *= t[1];
; u& B  [. j& {9 E# v    default: return t[0] /= t[1];//case '/':; K6 g' ?/ w3 s: ?
    }& [* I3 N$ j! O, F7 V
}}2 k6 r/ u' [% _- ~
template <class _T, class _Tstream>6 h2 V6 F, L6 e6 m8 G
/* _Tstream: inputstream, _T: get return value4 Y, V. p8 ~. n8 T4 ?4 {% c' |) [
* Return nonzero if get value successfully */
) q+ y: d  U  ~5 C9 \7 ]! Gint GetExpValue(_Tstream& istrin, _T& nReturn){  g6 A7 Y1 q4 U$ \
    _T t[3] = {0}; //雨中飞燕之作
/ p6 z0 G& ?' d# ~" e8 [; O    char csym[3] = "++";8 M( f" k3 h$ j/ f7 `( ]1 d/ |
    int nLevel = 1, nERR = 0;1 b4 Q4 q6 {# ~) |6 B- y/ ~
    if(!(istrin>>t[1]))istrin.clear();
# Z% Z7 J3 c4 f* r: ?/ w$ |    for(;;){$ D% z- z3 }( d3 F4 m0 Z" N1 d/ ^& d
        if(istrin>>csym[2]){
$ {" q7 u- k" k            switch(csym[2]){. w& D& s4 _+ d$ ?7 z5 c
            case '(':4 s; Y+ E- X8 K8 d7 q
                if(!csym[1]){nLevel=0x100; nERR=1;}else/ d- o, m, e+ K6 K% a% P4 g
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;+ e" D5 O$ v3 z( X- K
                else{nLevel=0x100; nERR=1;}8 O/ z' i) Q1 F' U
                break;7 T2 x; Q0 O5 n% F' m, x2 K) `, G7 x5 T
            case ')':8 P, e6 z. s  S
                {nLevel = 0x100;}break;6 |  ~1 y9 I& d9 u, N% n  j6 ^
            case '+':case '-':case '*':case '/':# r1 S* U/ V* O6 G- f* b
                {csym[nLevel++] = csym[2];}break;
( [/ E6 U/ k. \9 u3 m: B            case ' ':case '\r':case '\n':case '\t':continue;
% c- }. w. H3 @            default:
4 o4 q9 V3 E& \7 M" m" \* r                {nLevel=0x100; nERR=1;}( a' t4 a1 m) ^1 s! \, r& P+ N
            }6 {3 r- g4 K" y& g
            if(nLevel==0x100)break;9 b3 ~' S3 T" q* x
            if(nLevel&0x10 || istrin>>t[2]){# c: W# y. n; {# F  ?
                nLevel &= 0xF;
8 Y) |0 c! T* d# I* `5 J& I                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}/ ?4 a' d0 v: z& K2 Y) a, {5 a* k
                if(csym[1]=='*'||csym[1]=='/'){
" \; K0 m! s. k& ]% s                    GetExpValue(t+1, csym[1]);
/ i5 k. E- V8 W, C" W- u8 j6 u8 E                }' {: @& D- ^  q% ~3 H5 F$ j( B% Z
                else{
: `' E* B1 Y: ^, z& \( O                    GetExpValue(t, csym[0]);  Q3 X6 Z0 r( n2 `, G
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
4 p: \; ]/ c5 m4 i- A( j. B- x                }
2 r. O2 N( O" D3 k1 j                nLevel = 1;
& m( B/ d0 f; h  n! [' H/ }4 ^4 }4 q            }; e0 ]# s+ ~% B* R
            else istrin.clear();
& {. ?" \! j# q, F        }  l- f* s/ ^  j# I* J6 s! f& T, q
        else{nERR = -1; break;}
4 M! G" L& O9 a( }+ w% r    }- T( V7 R" v# E2 H& ^
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);' Q. C9 T( Z8 \& a) G8 T8 K
    else nReturn=GetExpValue(t, csym[0]);. f: x3 P2 a' f3 F
    return nERR==-1?1:0;6 R/ z; c$ Z* ~" c& V3 ~
}}5 \2 N; B, }2 Q+ I# L
; x6 A4 ^9 A* \; d4 U' Q' i
/ j0 X8 r2 k+ X3 u4 C. O
# K$ `$ J" n. i" E" h  }6 P
函数模板使用示例:7 f( a1 C: o3 A' Z8 i3 o! c9 {
在以上那段代码的后面加上以下代码:
) y3 ^+ z, K, `& f" i: b* N( O+ z" P  y. P" V' Q+ n
. g9 l% m; Q' G1 y

4 B/ w8 {6 t* n% t* l, a$ W程序代码:
! u1 R) O& U9 i$ R" \3 o% z% z  F
& n* O/ o+ T$ e2 ?#include<strstream>, o) m# E, F2 U0 W( y8 e
#include<iostream>
$ J9 d; j9 B" _. m! C$ `#include<string>4 H; J8 `. Q$ J, U7 b
using namespace std;
4 }9 m( U# G% x# P6 w6 b1 Q$ xint main(void)0 h5 r1 s, c! m, k/ G  `2 c8 k5 {: S
{0 x6 Y6 k, ]6 d8 g/ ~( @
    string s1;
4 X* N3 v6 }) _3 M, A    while(cin>>s1)" [3 g. V# W' P; Z9 A" t
    {
" `. J1 C6 L5 G/ q. n        istrstream isin(s1.data());
1 i0 Z7 A. |; M$ S5 ?4 D        double d;
* z; {8 g! N7 v+ ~5 ~        if(fy_Exp::GetExpValue(isin, d))6 i( w* k3 {. c' y% B' h% t
        {
  I, j( E; Z: }: G8 }" T            cout<<d<<endl;
' f5 A: u0 b2 W% k( }' S! }        }0 e3 P% l& ~1 q# L' u
        else  R2 ?. U5 c8 A
        {
! w/ A' b% E5 t& H" p. S. K5 d  o            cout<<"ERROR"<<endl;& n; n% M5 [! O1 |
        }9 H4 ^2 C; C: Q: u5 g
    }$ ~/ ]; p+ t+ j# Y
    return 0;
  E+ z3 K0 O% q}
0 y" G. A  g( x3 q, D( @% a- L5 i5 W# `  [/ G% u
. {2 Z% J6 Y1 r3 G( R
然后编译执行就可以了(*^_^*)% y( Z6 Y. s" B: G
其它:TC++上一定编译错误,不保证在VC6上也能通过编译* K  N& J( I$ d/ W9 o1 ?
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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