获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
; `* y8 v( k5 E' d# p$ ^一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' A' x6 ?" [, N9 Y! t+ _只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
0 E0 u3 B( t+ Z" Z' T" W参数解释:
! D7 x' R% z" {4 mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 H! c* t' J- r% \0 S+ Q
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定, E, q1 m2 a( m' [7 D: B$ l
返回值:
1 @8 Y8 C* h: K- u返回非0表示计算成功,0表示计算失败有错误1 f# I8 C* H0 ~8 ?$ j2 u( @/ j

# P' v. A4 a' u- |
# V: x0 C! ~$ W3 e8 x2 ~& _  R6 x6 f
程序代码:
1 I& C4 ?; e, r3 V) Y/ r# J* Y6 x# _
namespace fy_Exp{/ I- h! [! ]1 }  p( k1 W; h
namespace {template <class _T>
% @  e4 ]$ V, b, uinline _T GetExpValue(_T t[], char& csym){* h) g& u$ J. |  I
    char c=csym; csym=0;
/ R7 d2 P9 U# Z- D    switch(c){* g( d8 u. C& T: d9 X( n1 d
    case '+':return t[0] += t[1];
+ _- \. _2 I0 B" v! z    case '-':return t[0] -= t[1];
, F9 F3 l5 M- K6 ?9 l1 y8 u& N    case '*':return t[0] *= t[1];
  Q- L% B% Y6 f5 S% Q* h/ M    default: return t[0] /= t[1];//case '/':( \/ T# l" }7 o# v9 q$ d
    }
! c3 T6 W& O) M5 H, s) c7 G}}: x6 D( r7 X; a4 D
template <class _T, class _Tstream>% a: i2 O, G, F' \" k! t, I: i
/* _Tstream: inputstream, _T: get return value/ }- W- m% p3 e6 I/ W  @
* Return nonzero if get value successfully */1 ]7 V& [( _( W/ D4 Z- ~# O
int GetExpValue(_Tstream& istrin, _T& nReturn){8 ^. S; Y1 R4 P/ j
    _T t[3] = {0}; //雨中飞燕之作
3 @5 D- C( O( `3 c6 S    char csym[3] = "++";9 j: K; F. F0 H
    int nLevel = 1, nERR = 0;/ t7 u! b0 C' m) n
    if(!(istrin>>t[1]))istrin.clear();
$ [# G& q. m' U5 I# Z. h    for(;;){
# i# Q) I1 A) m6 H        if(istrin>>csym[2]){
* N9 r4 @& w- |5 p5 X7 G4 a3 L            switch(csym[2]){
" k" x- A- |0 @- G3 T+ |! U7 Z$ b, p            case '(':! u8 C/ B- h& t, d
                if(!csym[1]){nLevel=0x100; nERR=1;}else
3 ~+ n* |1 _% R" a( `2 P7 X                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 r% S# x' S9 j7 R% ^0 F6 L  I
                else{nLevel=0x100; nERR=1;}! j5 L7 @' ^' a: Z
                break;
: D/ d& |3 N+ f' [$ k! p; Q            case ')':5 d' }: C  h* D% w- x7 `
                {nLevel = 0x100;}break;
! x* W% R2 S2 b3 ]9 q8 D# V3 t            case '+':case '-':case '*':case '/':
# o! u& W) |5 U( s# H                {csym[nLevel++] = csym[2];}break;
9 C2 z5 }2 s' v: `! H            case ' ':case '\r':case '\n':case '\t':continue;, `( g. [7 u! ^" c# L  o+ w: S
            default:: `) t) D- ~' ]+ r) A" e1 ?/ n
                {nLevel=0x100; nERR=1;}, ^; ^" o: r  x/ Z9 h7 ?) w
            }
+ D5 z3 X* W* p' c3 N            if(nLevel==0x100)break;
! Y; q3 B5 w9 j8 V            if(nLevel&0x10 || istrin>>t[2]){2 }- \! K* W7 A' J* G
                nLevel &= 0xF;
0 T# S; Y  [5 E6 U) U6 h/ d5 T                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. }/ Z* C9 ?6 F4 m1 {( J# V% ]                if(csym[1]=='*'||csym[1]=='/'){
# _/ Y. X0 I9 `1 P  f3 w, ?/ O                    GetExpValue(t+1, csym[1]);
2 w& X3 L: t: {8 G; l% [                }
3 n3 D4 G& U# F) I6 Y; c) b! ~! q: r- U                else{
& q* c* q" f, T, m1 O( }                    GetExpValue(t, csym[0]);' _4 ?5 f$ |" c3 l9 U
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
: a# ^3 ]( {1 u4 k                }
7 U; K5 t; t; b9 [0 F: a! s. D                nLevel = 1;
6 [6 d* p8 L- p            }
0 a, g; q, q7 T6 Y            else istrin.clear();
( e* F" v% R) H9 N4 N! B) e/ h$ A        }
- y4 F; T) |/ ~) `* j        else{nERR = -1; break;}
* F! }  \% N$ R% U: n/ }  @    }5 m% f; \) _9 Y
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);! @+ F' J$ x# L0 T
    else nReturn=GetExpValue(t, csym[0]);
. H) Q! O+ \" v) q$ y    return nERR==-1?1:0;
: c" R5 z  H( F" D0 w}}
6 o& g* v- F+ z1 T# ]' s6 J3 Q. g; w/ P: ?4 w5 ~  B

0 j; C3 J+ {% S5 @8 J7 a9 C/ S7 ?! k% n
函数模板使用示例:
2 ^& B3 r# Y' L6 P1 Q" S5 }在以上那段代码的后面加上以下代码:" ]/ h3 a% ~% R$ o0 P! ]1 A

8 `. J8 \4 \* G1 L- Y% k
7 R$ \7 H+ |# t! C3 Z/ y8 t  I( c! c2 q9 z
程序代码: + S9 k# |, U7 }. C+ G# b% V
2 A+ R, ?3 `! t  s9 o$ S, ]- x
#include<strstream>  a- ~, T; T/ ?0 w5 W
#include<iostream>
' ^2 ]) x  `9 e; I* o" l1 {#include<string>
  H; G3 H$ `5 G2 t2 musing namespace std;
% t( O9 P+ W5 }3 G# vint main(void)6 @8 a3 n' i) i. k
{
: d3 S1 }3 ^! u5 f; Y! f/ i. f" r; c    string s1;
8 ~3 h. J8 g; S    while(cin>>s1)* S& K2 r: C6 l$ }  J) c
    {
- O, k6 @& ]" h! r# l/ m        istrstream isin(s1.data());( C: z( E- i& R  R( B
        double d;& M/ B% U7 u4 f! M1 g- g4 o5 t
        if(fy_Exp::GetExpValue(isin, d))3 N# B( a0 m. I% `) F) J& B
        {9 l; c9 i( V+ x$ P: H! t
            cout<<d<<endl;
3 {# i$ O% O0 S6 \2 w6 ~' m9 i        }
8 e3 R* _# m8 ]- B1 L2 a        else$ z: }/ K$ A5 \& z& {2 W
        {
. \9 ?  M# P& s$ f6 n. n% I            cout<<"ERROR"<<endl;
1 E/ b  |2 j" U9 H: k* Y1 a        }
- f! g7 R2 i4 d  g+ q    }, @" K; ]" {- P, q6 s
    return 0;* P) z! W! e4 ?& l- B  O
}
. v# U$ b! }  }
+ j- f7 Q6 q( S8 F  }, Z2 ^% k' s
然后编译执行就可以了(*^_^*)4 a/ m- v" k4 s" q, ^/ u
其它:TC++上一定编译错误,不保证在VC6上也能通过编译3 l9 ?1 W$ X6 e: ?" a
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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