返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,( U% k) A- S' t: T  {: Y# j
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式4 R* j! ]: n" k
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
* @8 R* \; }+ w: l" n$ H/ B参数解释:
/ D* f; O1 j# j1 Jistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 ?/ g1 F1 J6 I& G9 b$ w! lnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; y/ f; |7 a/ f) `  R
返回值:& V# p& l5 I# ^7 j& I" N
返回非0表示计算成功,0表示计算失败有错误2 q! ^$ t/ l8 \- q

5 M0 W8 x" i: a) ~; X0 s+ \3 \
6 b. `" {; G3 Q! S5 q7 R. o, x6 @. U# S  A- o* {1 V- S
程序代码:
( w# M' p1 i# s. @, x- ~. V0 K8 Z& @
namespace fy_Exp{
2 w- o# I; S9 M& Q4 \' lnamespace {template <class _T>
* Q1 @& k+ O! `0 m& vinline _T GetExpValue(_T t[], char& csym){9 _2 I% [' p5 Q' n+ y+ S
    char c=csym; csym=0;2 ?0 L! k- R8 p; B' m! U2 w
    switch(c){  M. l* h. a' W+ a( `7 I9 j5 G
    case '+':return t[0] += t[1];, P- J" n4 x: d2 W
    case '-':return t[0] -= t[1];
7 V: H" w( _2 p( M# ]! B    case '*':return t[0] *= t[1];4 t6 Z' {$ L8 M
    default: return t[0] /= t[1];//case '/':
, k  x  M5 R; T    }
& E5 m4 n5 R' H  @. g+ q}}% n/ [* i+ p. e/ q9 ~2 L
template <class _T, class _Tstream>
) E5 |" l) y; [- c' z/* _Tstream: inputstream, _T: get return value
1 H4 [" f) {" c4 A; C, k. v* Return nonzero if get value successfully */: P& s2 h! ]$ Q  n
int GetExpValue(_Tstream& istrin, _T& nReturn){- \" f; }# j# g, A- f) G2 h; g: z0 C
    _T t[3] = {0}; //雨中飞燕之作
0 p8 ^! J4 o) M% [% \" e# R# n    char csym[3] = "++";; j* f  B# Y7 O  z3 L% ]
    int nLevel = 1, nERR = 0;: c& B: X" V' J) d( U9 F
    if(!(istrin>>t[1]))istrin.clear();
& x* X8 h! U$ A/ e5 K# R: v6 @    for(;;){: t- ?$ S2 E& r, y+ t- S
        if(istrin>>csym[2]){
! v% D% Z2 B% U            switch(csym[2]){
/ _. \4 J3 L4 \* f3 a0 w            case '(':
( C0 K+ D; \9 y9 V9 p. x' h/ v                if(!csym[1]){nLevel=0x100; nERR=1;}else7 K. T( m' m8 r* q
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, _+ G, }# f* j7 L; a                else{nLevel=0x100; nERR=1;}
+ p" s; l3 f) e: c* d9 \0 K                break;* |. l$ Q2 _" `' o" t- l
            case ')':, Y' p. C4 p. [% l4 Y+ p# r9 G
                {nLevel = 0x100;}break;, M3 K% n: V& d+ l" _+ F
            case '+':case '-':case '*':case '/':& h9 D( Z5 x# i' A$ a
                {csym[nLevel++] = csym[2];}break;
$ x1 ^3 q4 f! ~7 p3 j! [+ y            case ' ':case '\r':case '\n':case '\t':continue;
. e1 b( A6 B5 k3 u! `; b            default:
9 c/ Q2 u8 l+ B7 E8 X5 K- Z3 N0 Y                {nLevel=0x100; nERR=1;}
) S- R; X' G! h2 \7 I            }
& q/ i2 D6 O7 h; O7 Y- S- V& _            if(nLevel==0x100)break;
# Y* `0 \6 n# b! M5 r7 l9 y            if(nLevel&0x10 || istrin>>t[2]){+ `! @# F0 l9 g  y& v) ^
                nLevel &= 0xF;
1 g7 X7 A9 L) P0 x7 ^/ z) x                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 n+ [6 m- L9 }& d: o  ^: p                if(csym[1]=='*'||csym[1]=='/'){
, A' q* P8 A4 Y# I3 `                    GetExpValue(t+1, csym[1]);, x/ [4 H/ q0 n. x& J) y' f
                }
" m+ i" i7 `: }+ o, z9 e& c                else{
' s* |$ W) e: \) o" F, |$ Q                    GetExpValue(t, csym[0]);
6 ~9 L& d7 s  m6 a# N. p7 b! r, W: s                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* ?3 D8 G; _4 \" p* J                }
; o6 F* D% @) Q- Y: u7 C1 s+ e                nLevel = 1;/ h9 p6 H# Y& Y5 X# b- ^
            }+ o" ]" x+ L( n# k6 e2 K  j2 @
            else istrin.clear();% P" n: h1 I( {, Y' A, _, x. P& q; e
        }. O1 ^3 \8 w. k
        else{nERR = -1; break;}
; F5 K* G. ]& c( A. L- T0 E! p6 Q    }
+ Y( u5 E0 b/ e6 f& m* n- m    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
! q# J. `- d, C/ B9 `    else nReturn=GetExpValue(t, csym[0]);7 y4 Q; {( w* R! t( C
    return nERR==-1?1:0;
% {8 e0 R' b+ q: p& q, S}}: A; s3 Z& C; i
& P3 ^6 M! C. V

+ _  u( O9 ?7 W. s1 ]5 Z( E; h) }4 @3 \. f/ Y, J
函数模板使用示例:  K+ O& L! ]' ~: O
在以上那段代码的后面加上以下代码:; \8 w1 a. o3 X3 }' f9 m" I
, z5 U# ?% g& S

& e: O1 b) f4 E8 ]: Z$ |! t
( |* D: {: p1 l# ?9 Q程序代码: . y. I8 i, a6 D* i

- m' O% e$ _: v; B: ~* D9 D  z( a#include<strstream>9 G9 L! Q6 E) L7 K( Z
#include<iostream>% T2 i3 S2 L( `/ s$ M0 ?( K
#include<string>3 q  e/ X4 q9 i
using namespace std;
: H5 x' m; C8 ]int main(void)
. m. k6 q9 q8 J$ N8 u+ i! n+ O{  j( b' p: T+ \! t9 F) m5 S- m
    string s1;
1 s" }0 c, A  r# I% b    while(cin>>s1)1 x# ?( E' P0 Q9 y8 P
    {
  F& u! m+ V- C' G        istrstream isin(s1.data());' A! E# ?) R7 O8 A
        double d;
5 w2 Y  j0 P: ^- c9 b* o        if(fy_Exp::GetExpValue(isin, d))3 h/ v8 h$ x+ }, g! ^: I# A
        {2 |8 x( M8 z. H1 Y$ ?& p7 g) l
            cout<<d<<endl;
. j) @# u, v5 Z' [+ U        }% u  P: V4 G( e. \# r9 r: {, j7 H
        else
# j8 v3 h" u& f* l. m7 M0 z        {
5 _+ H3 c, T8 t% e6 |            cout<<"ERROR"<<endl;
: O  c, o, f& Y5 [6 G& a/ `# n        }
" W6 k2 C& b/ ~1 s: B    }
1 U* d( P, c! D1 K9 A% P    return 0;" I8 I# }# k& b& R/ R- H
}
: u6 r; E9 O4 ?
3 _' o: W$ V* G  B
9 Y$ ]5 _' @. ~+ C然后编译执行就可以了(*^_^*)
& d( U, |6 I3 t% \/ b, Q4 o, k  P其它:TC++上一定编译错误,不保证在VC6上也能通过编译  c7 q1 ]1 B' k" O" B5 W3 C
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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