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

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

在9月8日那天我特意编写的,给大家分享的,
; f0 i# y& x; G; |( N% K一个很方便的函数模板,可以并且只可以计算含括号的四则表达式# \% \% I4 G" f* e' G+ k' K# B$ \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ Z6 r: {/ N7 V, {9 L6 O
参数解释:* ^4 B# N1 [: N( i6 [4 f
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# z. j  ?: M- s9 q* J$ R9 P  g( vnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定6 N/ _4 |* X4 p5 q( {
返回值:
  j: Y: m, ]# T/ L* X0 e返回非0表示计算成功,0表示计算失败有错误8 t5 W' S3 n) B5 L2 s9 y% X- u
* X" _2 f8 p2 ~3 a6 C% U

6 q4 r8 j/ Y$ q
, S9 P0 ?$ G7 v1 x* B2 C" e1 y程序代码:
4 T: `5 A) i, w- C9 g& H
' i" W+ y; k8 |) \* Knamespace fy_Exp{
% @/ f1 F7 h# k8 wnamespace {template <class _T>
* n0 V* Q: N+ y; d2 E4 V" winline _T GetExpValue(_T t[], char& csym){
4 \! Z) _4 e9 f2 R0 x2 w    char c=csym; csym=0;
9 g; U7 t1 R7 A  K; h    switch(c){
8 S9 {" _* p! ^. E  S    case '+':return t[0] += t[1];8 H1 a1 c* x1 b# k
    case '-':return t[0] -= t[1];/ \: o$ b" b' j! m2 Y" T8 E
    case '*':return t[0] *= t[1];
, u8 ^+ p& v3 Z8 k5 T/ l: a/ s1 {4 y    default: return t[0] /= t[1];//case '/':8 p) p# k$ _& h& A  O
    }" Y2 x( Z+ E* |( ?+ S  g! M
}}# s6 H& X' ~% q3 \
template <class _T, class _Tstream>0 D, C) U! U  p" q$ u2 T6 u0 p
/* _Tstream: inputstream, _T: get return value& l% N3 @9 a; T+ ]8 ~( P% c% _
* Return nonzero if get value successfully */
  }% q4 `( J7 F/ L4 k' H5 |int GetExpValue(_Tstream& istrin, _T& nReturn){
- p/ @5 c% Y" o    _T t[3] = {0}; //雨中飞燕之作3 P3 x: b. ^6 C" M2 Y2 b; c/ ~
    char csym[3] = "++";
2 g5 n# i5 A2 g. r& r9 ~  Q    int nLevel = 1, nERR = 0;
7 ?1 i, j( J$ N! @: W, S    if(!(istrin>>t[1]))istrin.clear();
5 C1 t9 l$ ^8 m# o! c) S! ~    for(;;){9 C) r9 Z0 H" V
        if(istrin>>csym[2]){! i; a9 v/ K- i
            switch(csym[2]){
7 c' z7 w( U7 K            case '(':
8 p$ c7 c' h" M% i7 x                if(!csym[1]){nLevel=0x100; nERR=1;}else
+ C( d& d. e# Y' J: n7 a                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 N  p+ X% `7 b, Z8 b                else{nLevel=0x100; nERR=1;}: S! M! n0 I3 b  g  ^6 x6 w
                break;
* t' _8 l9 _& S5 h+ ~* B. l            case ')':
" d  F; ^+ C3 S2 k$ X9 K                {nLevel = 0x100;}break;
2 c+ \. j3 J5 k9 B# l4 u7 f5 x            case '+':case '-':case '*':case '/':+ ?* n. x0 q4 Z- R/ K
                {csym[nLevel++] = csym[2];}break;
; q, c  t$ `* y( V. U5 }. h6 ~) R4 ?            case ' ':case '\r':case '\n':case '\t':continue;* }+ J: S4 l9 d: {1 j& s
            default:2 J9 N5 Z- H' \$ I1 n% ^
                {nLevel=0x100; nERR=1;}
/ N& ?# E; E& F, V- ]5 ?) ~, d0 C            }
& Z  K' h$ n. @( t! m9 H, H( ?            if(nLevel==0x100)break;) b, b( c8 X" R* ?$ T0 W0 U% b
            if(nLevel&0x10 || istrin>>t[2]){0 |& \3 i, @' X2 ^' }& |
                nLevel &= 0xF;  @* }5 M* d7 S% S) f1 c
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, o% @* d( u, m                if(csym[1]=='*'||csym[1]=='/'){( ^' x4 v- A5 k& ]8 J; o
                    GetExpValue(t+1, csym[1]);
& J  ]' o* E6 n8 \% k5 i, j                }4 u" P! Y2 }/ E# Q7 E" C: E
                else{
" ], U/ ]# K; e& E9 U5 U( z5 U                    GetExpValue(t, csym[0]);
5 C, b  \% J0 C" d; y                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
) e- k9 l) ~" r8 e7 c3 a+ q# N. O                }
9 z" B: c& F& b                nLevel = 1;
  j" R1 {+ S: c: |            }0 L9 k3 [: I: c9 ~8 ~, C/ U  s2 v$ H
            else istrin.clear();; \$ I5 p0 o: j- x" T9 s
        }
& I' @: D/ g0 ]: K6 O        else{nERR = -1; break;}3 M4 \8 w* g7 M2 f# s
    }
; s# q) S0 L! Q9 o9 y" L    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; k4 T( S) l# Q* C& Y    else nReturn=GetExpValue(t, csym[0]);( c; Q$ L  e: r$ S
    return nERR==-1?1:0;
8 L6 K6 N; _4 ]# W9 ?  O' `9 t# l}}
3 r" d& [$ c1 f# ?; |
  a4 D2 Q+ n! l9 ?* y& P/ ^# y; T, z% p' ]( |

+ L3 S5 ^8 A& o$ ]  o函数模板使用示例:
+ Y2 C3 C9 c8 o- I, h" s/ z/ N在以上那段代码的后面加上以下代码:
$ J9 ]  d3 P$ x3 a, L; j4 I) e  D3 v& O2 d( z

* v( O7 T& Y& w" m0 h) V! `
; }' J3 }0 N( j! |8 M% P" W程序代码:
! Q- X( Q  r7 A3 x: {6 u
. |/ O; J: D' M  {% F#include<strstream>
, D* K6 J( t: {) d, v9 e( G( }4 \#include<iostream>4 J3 [" f1 i: {6 G  T& \  J
#include<string>
9 a& Q7 X' E' m5 a3 @using namespace std;% H7 o( Q6 h/ ]
int main(void)
) X6 s' r, \, O) `1 B7 ]+ W{
( }; h: j! e- u  k    string s1;
' Q5 o& `+ r) G9 O    while(cin>>s1)2 L  k- f2 M$ Z6 }
    {9 R' k  }# g* Q! @4 q
        istrstream isin(s1.data());/ s9 _# d1 Z1 s" X# \+ Q  s" E, [6 d
        double d;
4 ?! `! a& S( @# R        if(fy_Exp::GetExpValue(isin, d))+ f, _3 s9 U1 Q4 |- r
        {9 s" u! p& H1 R6 d9 z$ `
            cout<<d<<endl;
3 \0 V: y2 p7 V9 _- L0 @) Y% d        }
! k# t7 z) w8 e) a        else
* o  x6 R; N& O, @! b        {
0 I1 z+ b) i1 R, a$ A            cout<<"ERROR"<<endl;% k: J9 e( u2 o' _6 K+ j
        }0 G" P5 s# N% ^
    }
( i: g) x1 w4 v  `: z4 X" l7 q    return 0;  s$ d0 W" v$ r4 w
}2 U+ _" H5 v6 ^0 |1 w9 w, M

$ M, F8 ?; j: K; s
7 ^$ L4 f4 |6 N9 e4 Z: {然后编译执行就可以了(*^_^*)* p1 ?/ q" u' D: n
其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 V; M" |- ]& \0 |; z. V
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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