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

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

在9月8日那天我特意编写的,给大家分享的,
$ Z) Q& w2 c! N9 F一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& B* a! }+ E5 i3 R只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); y0 f% E% B9 M2 O7 G
参数解释:7 x5 ]  l/ G2 J  U9 I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 U4 W8 a) C6 P( c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
! V/ R; _3 S7 D返回值:
" E9 M  H- \; p8 i4 \返回非0表示计算成功,0表示计算失败有错误
) v  E2 v* t3 g8 \* ~% i! x2 a  c( j; m2 }
  M: s2 W/ k& {4 v& q9 S4 n' |" B
- q: U  E3 l# ?: K- e4 z1 ?: ]+ S
程序代码:
" C7 l4 i! r8 \8 {7 G9 ^' S  t5 M* }0 K& x8 ^$ n; w5 z* R
namespace fy_Exp{: U% q; Z2 w  i, F% b
namespace {template <class _T>
  ]8 m5 w/ F! U0 M0 |; \6 a' s! A$ z8 iinline _T GetExpValue(_T t[], char& csym){3 s2 T- g6 ~4 C7 Z3 _- a# s2 m+ F
    char c=csym; csym=0;: ~6 [& h) n# i) {2 C
    switch(c){. P# S/ P! h# X* U" H9 b% Q
    case '+':return t[0] += t[1];
# Q# k/ G  w* p6 d    case '-':return t[0] -= t[1];1 W! i0 E9 |- h! L; }  b
    case '*':return t[0] *= t[1];: l& y7 m+ `( K" i
    default: return t[0] /= t[1];//case '/':  _3 T' Q0 Q) J: u) M
    }
, F# Q% d6 m% B$ {}}
7 C! p# \- B; Q3 ^( S' ntemplate <class _T, class _Tstream>
. C& N* X3 M4 e; l1 `- q2 z/* _Tstream: inputstream, _T: get return value0 c* \' t0 F" R5 t5 @' z; S
* Return nonzero if get value successfully */! M+ P  r3 ^3 N' }
int GetExpValue(_Tstream& istrin, _T& nReturn){$ k  C2 |9 M" H
    _T t[3] = {0}; //雨中飞燕之作
% ?+ W0 B0 O7 l3 C7 V    char csym[3] = "++";
1 |: {9 m1 a. r    int nLevel = 1, nERR = 0;1 M6 K7 D  ]8 V) ]3 P7 ]
    if(!(istrin>>t[1]))istrin.clear();8 m6 s) x6 N5 Y& [, C* t2 q9 t
    for(;;){
$ O; E/ s/ `8 G/ q        if(istrin>>csym[2]){
2 M% s+ c; N& n2 j            switch(csym[2]){' Y/ N+ _- p  j' X7 b2 j
            case '(':
- j0 M  M  f# v" h0 q6 a& t                if(!csym[1]){nLevel=0x100; nERR=1;}else, ^# @3 {( E& f6 D7 D
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
1 C" E$ I$ T0 M: z                else{nLevel=0x100; nERR=1;}
5 ]* G2 {9 D; Z& s* t' h# a, c3 n% G                break;
* F, o% }$ }# q& d; R- H5 x            case ')':, C; Q8 _' U( Q2 V8 v% Q
                {nLevel = 0x100;}break;
" ^4 \2 c* y4 R- M            case '+':case '-':case '*':case '/':
! n+ a. {6 X' e5 D                {csym[nLevel++] = csym[2];}break;- p; q5 d+ j0 p& S# y4 S
            case ' ':case '\r':case '\n':case '\t':continue;( d8 \& A. [. ]" F$ _' `- M) W" _
            default:
7 I6 v& [2 P* C                {nLevel=0x100; nERR=1;}% ~& h6 j5 b5 S+ p
            }
- d. C/ ]0 ~3 Q) G            if(nLevel==0x100)break;
2 @* L0 x8 v5 |( R1 f6 b            if(nLevel&0x10 || istrin>>t[2]){- b0 t6 H+ n0 j+ Y6 C: P7 a; F
                nLevel &= 0xF;
5 v1 m0 a4 G2 r- n* c                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}2 ^* L$ t( b, B2 K$ m  H' O/ d$ W
                if(csym[1]=='*'||csym[1]=='/'){
3 c% q; T9 w2 J2 V2 @; C                    GetExpValue(t+1, csym[1]);# b$ a" A" O, S8 q
                }
0 P+ f" k. g  M& v2 H, P                else{9 y( u- ]+ g! [1 t. k
                    GetExpValue(t, csym[0]);
" }% e( U9 p* k                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
9 ^- }3 @% {- ]  h. q4 O                }
7 [, e( g& u) ^2 ~                nLevel = 1;- Q+ s$ @' F4 u. ^
            }
: u6 R8 J" s6 D! F) e            else istrin.clear();
! Y% ~- W4 F, l$ o* ^        }. K# S7 L2 ]: V7 Y% t
        else{nERR = -1; break;}* G6 Y6 a  d8 q& |3 `; W" K! _
    }
' T4 a% u8 x+ c" |9 u* ]    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& S1 P" k$ T3 R( Y, S& r    else nReturn=GetExpValue(t, csym[0]);
, q$ {) m& p, F/ E0 |7 h    return nERR==-1?1:0;3 k+ E0 x% ~; o3 _' B/ Y
}}
! h- S! Z: a8 d5 `6 V; m9 g$ K2 K$ |/ f% L
  T, j" l/ P/ G2 A- B

/ U; C! ~7 [$ x5 {9 D函数模板使用示例:
0 k9 t4 R% y; p8 _: ~在以上那段代码的后面加上以下代码:, q8 ^& {0 V* I  A& h

; S; V6 T* [  z+ g$ t: ?% [% O 4 f) q9 a( _0 G. X' I5 c

, U' z4 B0 R0 q3 S: v- o) T程序代码:
! |0 O( U# d0 Y  o. D, j: Y5 e' a2 k" i$ u
#include<strstream>+ B( }6 w' Y) ?/ Q
#include<iostream>' F: Y/ q# |( d0 P8 z% ^
#include<string>
9 s' o3 c, Z# U& u9 Kusing namespace std;
( I0 j& V' o9 c: M1 l- l( `int main(void)+ t, v* Z. D. B  d
{
% v2 O$ x8 z3 a' H. T: i0 m; a    string s1;; Y& s  ?8 V. j9 l; u, E
    while(cin>>s1)) R# @* E4 S% Q5 F0 a, S, M
    {
* Q9 ~. H4 K" q) ^: p2 E2 J9 O& V        istrstream isin(s1.data());
" w" G$ L" ~7 v% K# x; h" g$ Z4 J        double d;# v/ c/ l! ~4 o- X4 w" Z' Y
        if(fy_Exp::GetExpValue(isin, d))
5 ]0 {. L+ [0 W" g" H( |/ q! s; w' y        {) e% ~0 J: Q7 ~9 Y  V+ R* K
            cout<<d<<endl;
1 p* f6 G* \' u) P2 x        }
7 ~" L6 j. g9 E7 s% z7 r& B        else
1 [, R; e9 y! r4 a7 K        {
" O" L% O7 Y3 q( |* S! R            cout<<"ERROR"<<endl;" H# ^9 A# T+ x! g
        }
6 P7 n5 c+ m4 {    }$ r) ^' ~3 }/ `9 D
    return 0;3 d( R4 T8 p" \5 ^) q
}
9 [% H  Z! |/ D1 b, G. ]3 r9 F. j5 [/ w$ `) k

" j* r, C! m4 Y# W/ x0 n0 G然后编译执行就可以了(*^_^*)/ `% X  b) u! ^* |, a" p
其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 H' s3 p( u! Q  h
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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