Board logo

标题: 一个计算四则表达式的模板 [打印本页]

作者: zw2004    时间: 2008-1-21 20:17     标题: 一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,
4 X+ q) z; x3 F一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
: H; P$ |+ j, @6 L+ b: R) p只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)& z( x' N; W2 Y5 D
参数解释:
/ \* E7 q/ a8 x, F* T& d+ A( I) histrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. M: P. F9 R3 g, X) jnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* F  J) S  d' M" |8 @
返回值:
8 `2 W8 w' O" \$ n返回非0表示计算成功,0表示计算失败有错误$ i- E% p) [9 M) a; v; K' S

( B3 F8 U7 D. K0 b' Y
) g9 s! Z* \1 g) _; `+ V! b- C7 {8 T# A) d
程序代码: & O" w" `9 z8 Y* ]" V

. `$ H! c5 F  i: y2 {+ R) }& q. |namespace fy_Exp{
4 h# T3 D9 H8 f6 I; [# snamespace {template <class _T>
# i2 i6 e- e; h+ _* g& M: D+ Zinline _T GetExpValue(_T t[], char& csym){2 F, l7 s) ^5 E, g* v
    char c=csym; csym=0;1 y8 v0 M3 s( N  H! k; B  s
    switch(c){2 A1 [9 g1 d+ V7 @- b- a
    case '+':return t[0] += t[1];
( t% `8 d6 ~7 Q( U3 m# O+ ]. V    case '-':return t[0] -= t[1];2 h: G( h, T9 K: G' s. K( g% @: q/ L
    case '*':return t[0] *= t[1];
& t! t7 H1 k, D0 U) l  }8 G; o    default: return t[0] /= t[1];//case '/':% H# d( i) B8 u. R
    }
6 }4 ?8 b: l7 i& u3 J9 `8 e}}
4 F" \# H* n) t: @9 b$ }+ qtemplate <class _T, class _Tstream>; |3 S2 t1 L5 h. t& J) T
/* _Tstream: inputstream, _T: get return value2 z' Q6 W- R+ n; r$ Z* V- g- i3 J( I
* Return nonzero if get value successfully */
2 @; l, u5 N  k3 x- R  @int GetExpValue(_Tstream& istrin, _T& nReturn){
# [* Z; x# c( O: r  d; K2 j    _T t[3] = {0}; //雨中飞燕之作1 B7 w6 S1 \/ P$ Y9 M
    char csym[3] = "++";
" R; l: b* U; P# o; p8 E& Y! U    int nLevel = 1, nERR = 0;
# Z: Q' e0 \" Q6 ?& M5 m3 l$ f    if(!(istrin>>t[1]))istrin.clear();5 W& [1 O/ m; h; s" m% t8 I$ O
    for(;;){
6 o# |6 G6 K3 i/ ~, n' X        if(istrin>>csym[2]){
  t% ?1 V/ L9 Y# W7 i. ~6 X# A& n  P            switch(csym[2]){& g6 l3 C, v3 F" y5 C
            case '(':* s% F& t3 O2 ]9 G% t
                if(!csym[1]){nLevel=0x100; nERR=1;}else
3 b. P/ G' k0 H% H; g                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ p- l. v! U, p9 O; ]9 _                else{nLevel=0x100; nERR=1;}
7 \0 I1 ~" o) q( p' M8 A8 P1 {1 J                break;
! B( J9 e  k  L& G            case ')':( b! `9 _: M6 z! S
                {nLevel = 0x100;}break;  J, c1 T% U' ]- X' _# g
            case '+':case '-':case '*':case '/':
* o% U: k/ \. X                {csym[nLevel++] = csym[2];}break;
. W$ b8 Z9 q& U/ q, j            case ' ':case '\r':case '\n':case '\t':continue;" L/ [. Q% b9 @2 z* E1 T) g
            default:
- F- \3 t% a, J8 O  J: B5 f; v                {nLevel=0x100; nERR=1;}
4 k! j. X3 y# N! t; I            }8 S  m$ f$ d/ H" y
            if(nLevel==0x100)break;
# u" z! h( ~, \: G0 w            if(nLevel&0x10 || istrin>>t[2]){
+ f2 a9 V* Y1 H, K" h/ D9 _2 Z                nLevel &= 0xF;
! c$ t, K" D7 }% Z- w) @: _% A                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 C. }; k; ?# b! t                if(csym[1]=='*'||csym[1]=='/'){
8 M7 W7 c( e* j                    GetExpValue(t+1, csym[1]);0 X% _& b/ i6 ?  I7 p9 v# J6 S
                }9 A8 A" C  c/ n, L- V# M1 x9 |
                else{; R" u* B) b* `2 d0 O: c
                    GetExpValue(t, csym[0]);
6 P7 R# T8 q+ c9 A$ Q/ U; E                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ O1 g# j# u' P) g. |0 a  V; [                }
6 ?+ I2 `+ i8 Z! i( {7 M# j2 j                nLevel = 1;
8 Y$ u) Y$ x+ ^            }
9 s+ v9 [  P( P6 W5 H- s& ~            else istrin.clear();
9 V/ G8 v9 B4 F( h) a  I6 Y1 r        }, s9 n4 }; N$ W
        else{nERR = -1; break;}! m- h. ]8 \8 a8 u) W" p% u
    }# @9 o+ N$ y0 V0 b
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 l% h& y9 F( {$ F9 I8 g3 w( L    else nReturn=GetExpValue(t, csym[0]);
( J/ Q+ \$ U) ^: ~  p- ~8 U    return nERR==-1?1:0;
7 A4 \, s8 ^# y}}) G9 R0 N2 a' \& i
2 t* z4 n$ N$ t. [

! e. T3 U. k: P3 I6 u, N2 R0 ^' b! m
5 z) V9 C4 c( F, w' t+ k# r函数模板使用示例:
1 ]8 z+ E% C9 P+ l3 h7 Z在以上那段代码的后面加上以下代码:* o/ u: t8 H+ ?) {

: P) \: g. y0 [7 W6 C  n- A 3 x4 f; {7 G7 B( @% K" x

' J% j' Y0 W$ x程序代码: $ K7 r% `. k5 ?' I
5 `% @# s; Y: R1 a4 r/ W6 W" x
#include<strstream>) C5 t* Y* {4 B' f/ z% p% M
#include<iostream>
/ ]) X; U/ l& i! @" U% y#include<string>
* f. N# |5 @8 I6 T7 V9 `( M; i2 busing namespace std;
3 o0 l* i4 B" ^/ A) y* k) Dint main(void)& H2 P4 i/ v3 |% y" V  M
{7 _& ]# G3 B% U% b6 z/ p
    string s1;' k4 U! x: t3 F$ ], X# n2 z
    while(cin>>s1)
+ [7 K$ K. g1 d3 b. m    {8 a" |) i- c3 U- T3 s5 ^( O
        istrstream isin(s1.data());7 K- L. R( F& }9 V# F
        double d;* p% v- Z# u9 `, o7 S6 v
        if(fy_Exp::GetExpValue(isin, d))
* s9 t1 W- Y' E' J9 [$ ^, R9 L, b9 ^        {
1 s- n1 D, J2 L  a" ~2 N2 X            cout<<d<<endl;
- {4 k1 }% e. t# o  ^0 L3 H        }
0 v2 B+ I! S# R5 E        else
% K# k/ ?% F- {" G$ H* [  D9 L' c        {
- m2 x3 h, ^% O  l            cout<<"ERROR"<<endl;5 |# T: \* t$ @: N+ w
        }
, U3 Q% \6 ^/ e( l2 ^7 D    }& c" h9 d9 j' E( _2 ?
    return 0;; M3 }+ e' x3 S! k- k
}
  o+ }+ Q/ v8 d; I
% y3 @/ i6 T4 L6 P8 F* y3 D. m
% w( q0 Y+ o' {# |! ]然后编译执行就可以了(*^_^*)' N/ s% _% D4 i
其它:TC++上一定编译错误,不保证在VC6上也能通过编译5 Q+ A) c, D/ V" o( T$ z
      建议使用VC7或VC更高版本,或者使用GNU C++编译




欢迎光临 捌玖网络工作室 (http://89w.org/) Powered by Discuz! 7.2