返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,, t! z, v# p: ]9 W* h3 H9 Q
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ K0 F3 a2 Y' [! D6 W7 `只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), n; L) e7 {9 W4 y, h
参数解释:! P/ @$ d9 \1 L% q% G- g, u
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! \- a0 B4 M. q& ]! \& g
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
6 w- ~. _: B) p2 L: a1 E- U" w返回值:+ k8 ~# |. f; c2 O; l% E1 k- g
返回非0表示计算成功,0表示计算失败有错误+ V6 _0 S1 j6 B6 G4 z' @

( L% b1 p- a0 o" d1 }0 [
1 w* r. m8 |# c; H6 n4 U
5 k' q! x. c8 w6 R- l程序代码: - n& h5 U: q- h- }2 J6 J- l

3 |- h' C2 O3 j6 \namespace fy_Exp{
, o5 S/ o4 [. g3 |0 F" ?% E' K7 q1 ynamespace {template <class _T>5 k" Z% K' ~1 k1 H# j* D& F6 J/ M0 A2 X& s
inline _T GetExpValue(_T t[], char& csym){
! Q' f  r! a% G4 N1 R9 z% V    char c=csym; csym=0;+ J* g6 t. y1 \9 P, I" F7 e
    switch(c){
1 G5 R7 A! L* i* a! s    case '+':return t[0] += t[1];
  d: y$ E% M4 f* V8 M& x    case '-':return t[0] -= t[1];% E% G* \/ d5 O% R6 W, k
    case '*':return t[0] *= t[1];( F0 {" \5 Z- L3 k  @9 X8 s, t
    default: return t[0] /= t[1];//case '/':8 U, T2 e+ U- ~5 m5 u5 g& A' ?  x
    }& v( I& t$ k5 O8 I3 }# J) L
}}
0 Y! }- c* ?6 ^( J, A8 v6 Dtemplate <class _T, class _Tstream>
; j, l  L4 Z+ I/ Q0 Z4 }/* _Tstream: inputstream, _T: get return value. x; N8 I% N" X* q  U
* Return nonzero if get value successfully */3 f/ \  Y4 G% P, S" c, e0 ~0 \; p
int GetExpValue(_Tstream& istrin, _T& nReturn){
6 L8 N' n' X$ f0 P6 U    _T t[3] = {0}; //雨中飞燕之作
' r* D7 {$ Y4 V2 y1 d5 K' p, s    char csym[3] = "++";- a: P6 r# @8 G& X0 T9 X- K( n
    int nLevel = 1, nERR = 0;  R: M' Z3 _: E% |+ ^) ^. c
    if(!(istrin>>t[1]))istrin.clear();5 F6 |! x. _1 k  @; R$ |% y
    for(;;){
6 @6 C( v9 g; H3 I1 o        if(istrin>>csym[2]){7 H9 C( z$ J* c: S$ Y8 r
            switch(csym[2]){- k2 v# y0 D. n* E
            case '(':
) U' F; H9 Q+ b4 d: @  e; V                if(!csym[1]){nLevel=0x100; nERR=1;}else
! N, [4 g5 l2 }- ^: O* D                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 U' i3 m) P/ ~# h$ A
                else{nLevel=0x100; nERR=1;}" s% _! ]! n2 N7 B$ n1 T1 w
                break;
" _9 z9 L3 C$ b* x            case ')':
+ B- X. _4 b$ a1 P                {nLevel = 0x100;}break;
) r# m) a/ h+ |( ?( b0 X            case '+':case '-':case '*':case '/':
5 A6 A6 H" Q  c4 s                {csym[nLevel++] = csym[2];}break;* g; B7 @/ N% {- l) B
            case ' ':case '\r':case '\n':case '\t':continue;* x% c$ }! A4 ]" G" @& ^1 C
            default:5 O- h1 Q; C( O+ i- c7 A+ f2 r
                {nLevel=0x100; nERR=1;}
- q. n) {! ?2 a9 h            }
! K" E" d* o' w            if(nLevel==0x100)break;& M( ?& d3 Q1 i3 V) I
            if(nLevel&0x10 || istrin>>t[2]){
( {/ `/ j1 m+ t, f  W' b8 y9 I                nLevel &= 0xF;# y0 i7 Z0 F! e  {6 Y6 Z; C
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
% k% L: l0 K# ~6 V8 J" h                if(csym[1]=='*'||csym[1]=='/'){
- f4 N( ~1 ^7 E6 e, p                    GetExpValue(t+1, csym[1]);
/ h2 f$ m$ p, a# ^% y                }
# N! C6 q2 g" ?9 I! R6 w                else{5 z8 U7 I6 V6 Y6 d8 ~
                    GetExpValue(t, csym[0]);$ d, T6 s; {1 Y2 Y. G1 q9 V" }
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;* F$ O! a" r. ^
                }
, w9 y5 d/ m8 |* R) V+ G# v& }                nLevel = 1;
: @( o2 W! d9 Z( Y& S1 T            }
2 C: a2 d. ~, X' I# y            else istrin.clear();8 a3 h3 y8 z: ^" z  k% Y4 L# R# x
        }' V8 N* {: \: c8 V5 S/ w
        else{nERR = -1; break;}& F$ A7 Y. Y, C
    }! h0 A3 m' x; l* ?, Q7 k0 M" I
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 \! a( F( G8 V; P5 y  w* T
    else nReturn=GetExpValue(t, csym[0]);
- K4 p2 s2 B! a( O    return nERR==-1?1:0;& j2 k+ F6 I: P* {
}}/ i( ^. @2 C, n" K( P+ _6 l4 c! R

3 T& i4 B; E. Z! n' u. A2 C! K  z. b' |3 Q: c) r! r* O+ L+ |- W
# Y+ a% ]( @6 O
函数模板使用示例:: L4 O( p" }: I, k  d
在以上那段代码的后面加上以下代码:* }6 O/ ~5 T4 N( t

7 P$ a3 M# c7 |5 i) w
- O3 Z6 k8 o/ B. C
- I' F; h1 n: x' O程序代码: 0 ]& V8 F$ Q; [7 d* q( I
9 I2 \/ n" v1 @9 V( `
#include<strstream>
. F5 y( j3 b& ^9 E#include<iostream>( {: C! ^! a) t5 Z# c4 W
#include<string>
: M% @' |# P2 |$ P3 d  Pusing namespace std;2 b4 B" r- l+ V' t  H* v6 s7 P% @
int main(void)
+ }0 g/ ?1 n. }0 m/ \{
9 y8 y6 G6 Q" X$ D- z) z, X    string s1;
+ R- r- }' o9 e; S    while(cin>>s1)8 ]' ?2 ?& c0 g( _6 F8 l: @: E
    {: j/ i+ N  Z( @7 e8 e
        istrstream isin(s1.data());3 I  z) n1 v4 g0 ]7 p$ j' C
        double d;
- c7 N+ e- Z# Q        if(fy_Exp::GetExpValue(isin, d))
' e5 _* K% g/ t8 f        {
& l  l; V: z9 d" s            cout<<d<<endl;
4 T, ?8 {  s3 O, ~        }) s" G) f# n& \+ \6 `% w$ H
        else
4 N1 r  Y# `$ m! A; I7 I        {6 M6 Y' {( R; h. O; F0 L7 A
            cout<<"ERROR"<<endl;
% U% M. }- ]( w. v        }
. k( T# M8 [/ R$ F" k8 _7 g    }0 _3 H, a& U" {, h# a
    return 0;: c" b1 N. o( t% S  }. l8 I% G4 R
}
3 H( V3 _' y6 W5 b$ F  C  Y1 {, t" j% E" V# _, y

- |. [& k7 C3 ?然后编译执行就可以了(*^_^*); L6 `' ]5 n  y  ~* p7 p+ Y$ p
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" @1 |3 e# V- r' O      建议使用VC7或VC更高版本,或者使用GNU C++编译

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