返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
! U( g+ s: j1 Q$ D1 G! K一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" ^4 T# J, O3 Q2 r& q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
+ U; T; x' y2 U$ v参数解释:2 T! F, s2 S/ C$ z9 d
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 S# g  k# b8 M# s0 C) B8 y6 S8 dnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 b+ ?) U. O, `( K$ q返回值:
2 e4 n2 n& S+ {/ t) u& m返回非0表示计算成功,0表示计算失败有错误" |5 A  B$ E- i! K3 g
) T1 Z& ^+ k- p' W: j9 l+ q) o

" L" M  b! Y; p' B/ Z0 l8 V- _! T' s
程序代码:
6 |6 _  h9 |! G. P4 p+ e: y& z5 |  U/ ]1 A
namespace fy_Exp{0 @% ?7 n2 ~7 v- Y: m) x
namespace {template <class _T>
$ o* T* p2 h6 [! ^( t" G* _inline _T GetExpValue(_T t[], char& csym){
# E$ z: ]+ K' d; U6 J/ _    char c=csym; csym=0;
  k! X& q1 R: h2 F$ n7 c    switch(c){
: @  H) n. ?. ?3 I    case '+':return t[0] += t[1];
" k" b. ^  v& S    case '-':return t[0] -= t[1];! r8 @" m/ r, e
    case '*':return t[0] *= t[1];1 ?0 }0 Z' u- ?4 y. ]1 E; x! v
    default: return t[0] /= t[1];//case '/':$ K" Z/ H' V3 M' H# U' _
    }0 ^! J3 W/ ]/ a& A( v! g
}}
3 \: ?4 g* A1 b" etemplate <class _T, class _Tstream>, g; N( q" M( O
/* _Tstream: inputstream, _T: get return value
. l, R$ O/ i3 |  J# a* x* Return nonzero if get value successfully */' U( {3 G" U+ A& v0 M
int GetExpValue(_Tstream& istrin, _T& nReturn){, d& L4 j0 b+ J5 B6 t- }5 g2 P& f7 c
    _T t[3] = {0}; //雨中飞燕之作
! G6 D& C1 m1 @8 b2 [    char csym[3] = "++";
6 ^9 ?( i$ b# e* c7 S9 c' a& g- D. _    int nLevel = 1, nERR = 0;
* n6 y4 [& @! t. x# N2 R+ w  B    if(!(istrin>>t[1]))istrin.clear();- L: k3 \' Z+ S- r' ]3 l; b7 x) q
    for(;;){
8 C& o% o) ?4 n        if(istrin>>csym[2]){9 Z2 C% X& ~1 x. C8 H5 K( U
            switch(csym[2]){
; n5 r6 x$ y& c; G! M' `            case '(':
8 \( P$ q; a7 {4 V                if(!csym[1]){nLevel=0x100; nERR=1;}else: w& S1 F* e: v' l4 x
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, a8 W2 `$ I) l
                else{nLevel=0x100; nERR=1;}
8 U. R. f. X7 U% {: h, Z* p2 ?                break;
8 `9 M2 m* [, ?: K, Q            case ')':' M# X1 s( p& s' T* b7 F. q5 P( r: M
                {nLevel = 0x100;}break;
8 h$ _5 e. A; M: U, I            case '+':case '-':case '*':case '/':! B: |7 ^+ L. ]- }9 d
                {csym[nLevel++] = csym[2];}break;3 T  \+ l6 v, _
            case ' ':case '\r':case '\n':case '\t':continue;
  Q$ @# G  Z6 U4 g2 {+ M- w2 R            default:6 r) t- z5 m+ d! F6 d" c6 ?) N
                {nLevel=0x100; nERR=1;}/ ?7 S" F0 H2 k/ `2 t
            }
* }2 E; R% f. W  [. g/ ?7 E  h2 s            if(nLevel==0x100)break;
' I7 h( H3 }8 y6 U            if(nLevel&0x10 || istrin>>t[2]){6 g8 P6 T7 N. n" g
                nLevel &= 0xF;
% O: O# c6 A4 J* z% c% M                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}1 l' N1 X" g" q" f, W
                if(csym[1]=='*'||csym[1]=='/'){
$ n7 u7 _; H7 @, |8 G# i6 G9 {9 ]                    GetExpValue(t+1, csym[1]);
2 {7 O+ _: R8 ]/ r% C                }- C/ v. O7 \5 _5 l! J3 z
                else{( q9 M2 _: [+ |1 ^
                    GetExpValue(t, csym[0]);% p4 h8 C7 o+ D
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;# x( L( d5 ?' V. Q4 e8 n
                }
% ~+ ?. H7 J* k                nLevel = 1;
. W% U6 Y/ _1 j% N            }. E! u4 d, v; a9 l+ r% `; v
            else istrin.clear();- [. X) R9 l$ ]( z6 j, U
        }% V# o6 C- i. t
        else{nERR = -1; break;}. J  Y( r! j: V( Q! I0 i
    }
; M/ m2 o4 R% `* Y4 v1 L% b% {, [, m    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& L* e2 L# e& s    else nReturn=GetExpValue(t, csym[0]);3 l3 R1 B$ c& d% d3 }( a
    return nERR==-1?1:0;+ T. J6 c; M4 ]; [! o9 n) S' U, d
}}
- t4 b' M% K3 F( _
% M1 {. i5 j) S8 U- Q
2 K/ o& @: o9 a, V" _9 b6 [' s* O$ E9 L" r7 n
函数模板使用示例:
1 c% B+ Z' r% M6 D在以上那段代码的后面加上以下代码:1 t& v& S( \9 M& `6 v: q

( |/ A" d! K7 J' f 9 r! J& C, q: X1 S) ?9 n+ Y

; K! S5 ^9 O% J- G7 i9 R: r% m2 w* D程序代码: 8 d7 P. F6 x9 h
$ n4 [6 O9 m3 g, O! n
#include<strstream>: F2 c) Y" E9 y1 B% m* k+ D8 A
#include<iostream>3 R* L* {1 X. Q/ i- F+ M
#include<string>
" v$ l- H4 Z. v9 musing namespace std;
1 `+ _/ l$ ~: iint main(void)
) j& _( @7 }; @- ]# K{
4 a( {& J/ F2 I* D    string s1;9 X" N. @$ w3 D) a+ {
    while(cin>>s1)
* b3 H; V: ?" x' Y8 e5 e) n    {1 f& r. s% L  B: S, Y+ I
        istrstream isin(s1.data());: c* t+ N+ @( h  B( V5 F' q7 A3 k
        double d;
6 A- @$ W# x  V" [5 R        if(fy_Exp::GetExpValue(isin, d))
: ]2 K4 |. g2 n( s8 H        {
0 o9 w0 z# |7 k5 b& d& y# `            cout<<d<<endl;
1 G: O8 @- S4 t, a) b5 o        }
3 X+ Y# h3 D5 u2 }$ S        else
- U: g& Y* ?; b; ^2 T        {
( P/ ]+ e" G6 b: F            cout<<"ERROR"<<endl;6 f3 D% a( y) G& d
        }
0 @+ p4 ]. R, Y4 ?9 l; Z+ d; t    }* q& X6 x6 @. s' G; |$ B
    return 0;6 f6 _7 W4 h: Q
}
" P7 o$ q: @3 M- _8 \& p/ E* F  J) j4 }

4 r2 _. v0 r# V2 Z* j& v然后编译执行就可以了(*^_^*)
- u" x" D) J9 T! s3 i" N3 O" \其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! h; }/ ^4 ?* Z! l. \# M* O      建议使用VC7或VC更高版本,或者使用GNU C++编译

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