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

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

在9月8日那天我特意编写的,给大家分享的,
' x* q" z) k# K: H1 C0 P一个很方便的函数模板,可以并且只可以计算含括号的四则表达式: D  s- c" N7 W1 `" Z
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" B( `) \6 _3 [, `, o6 T" J参数解释:
5 m) z: J2 @2 Q% {4 K5 ]istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: w! p+ D0 i" p2 C4 n' VnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 K' {1 h+ H( q: O返回值:; D! ^- j7 i/ w. s% a
返回非0表示计算成功,0表示计算失败有错误' k; e& a$ f; C7 j' M2 x

7 @3 Q8 ?6 a8 d. v2 e1 n7 c
) n  D- L% Q( b+ U; X
# }0 w, ?8 X; q! B6 c: m7 ^程序代码: - T. X1 s$ m2 Q
( x8 f+ e; H; q- e' P) m. F* q# c, O
namespace fy_Exp{$ Z  P7 M0 v: N' a  D8 H9 e
namespace {template <class _T>
) M1 y5 E$ _: n  ~/ Jinline _T GetExpValue(_T t[], char& csym){
* z5 a; r2 Z) p- k6 @) w    char c=csym; csym=0;& ^8 `; L0 B+ P( x4 f0 c: W+ G( H
    switch(c){& M2 B/ d: w, J8 m1 g/ o" L
    case '+':return t[0] += t[1];: E+ Y: D! b/ A% Q! E2 [/ N
    case '-':return t[0] -= t[1];$ ]0 q1 i# ?+ E9 t( q8 G* V& g/ [
    case '*':return t[0] *= t[1];0 v& [, M1 j2 k4 }0 N
    default: return t[0] /= t[1];//case '/':
6 s$ t" ]! l0 C* r1 M2 p* q  l, D    }
' s3 E: X: g9 A- |" D}}- k; [  B. W$ r- V9 X
template <class _T, class _Tstream>
* j% ?) `; P% ?4 F- j( }3 u/* _Tstream: inputstream, _T: get return value8 o6 ?& C9 S3 E4 z) H
* Return nonzero if get value successfully */8 `' L4 i) N; d. t
int GetExpValue(_Tstream& istrin, _T& nReturn){3 f9 A. R0 t! O, P
    _T t[3] = {0}; //雨中飞燕之作
! [  V* }2 x- d' ]# S# r  B7 }    char csym[3] = "++";
5 X/ k: p$ @. T2 o: h% [    int nLevel = 1, nERR = 0;/ u. m5 M2 N7 L! f" x4 |/ q4 D
    if(!(istrin>>t[1]))istrin.clear();
2 B0 P" ?! P& D7 B1 X; k    for(;;){( g' k0 f% m4 S7 ^7 A4 L6 G
        if(istrin>>csym[2]){( X5 o4 A4 e& G) J' v' K3 [
            switch(csym[2]){5 A+ W" B1 D& f& U
            case '(':
5 V3 Q, O% ?. L& H                if(!csym[1]){nLevel=0x100; nERR=1;}else
! h$ \7 i- H$ L  T6 N                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 n5 D) E+ c6 L: a; l5 I; ^
                else{nLevel=0x100; nERR=1;}
& o: H2 ^9 I! d; \  |                break;7 \5 d9 R3 p7 A; b
            case ')':: b7 ?' d; v+ a2 `/ ?* n! B0 \
                {nLevel = 0x100;}break;5 G9 }1 Q, N  {6 m$ q
            case '+':case '-':case '*':case '/':
; K2 F: q6 b4 Y) l! u% X$ Z( Q, S                {csym[nLevel++] = csym[2];}break;; \& ~  r/ a7 j0 C, S+ Q  H  }( W8 g
            case ' ':case '\r':case '\n':case '\t':continue;
/ f1 S6 ~8 e. z            default:
9 O9 B1 g# a3 I, }9 D8 Y2 u! x                {nLevel=0x100; nERR=1;}  L- R. P! t! s6 k  C$ _& Z
            }
% ?$ ]7 b4 V) R! o' F            if(nLevel==0x100)break;; E- B6 Y' `& g) A3 {, R1 P- b
            if(nLevel&0x10 || istrin>>t[2]){
" D$ {5 m- P- J, @) I) c7 u. f7 [                nLevel &= 0xF;' g# ?7 a( ^- l$ Z7 \3 U* m& \
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 W) m' w2 L. V4 L1 p  R( d- R                if(csym[1]=='*'||csym[1]=='/'){5 S2 p! w! `1 s3 s: C/ F4 t
                    GetExpValue(t+1, csym[1]);
4 M& N- i4 A0 g% _2 {; t% E                }& q1 t* }/ M5 b
                else{: M  s. E8 y% u$ {; g1 ~
                    GetExpValue(t, csym[0]);+ t9 Q' _* f6 l+ k
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ p4 l, {( e! J" w5 |/ }                }
/ ^' R9 o# n' k/ R4 U4 @                nLevel = 1;
4 _% V: P. T2 K$ V1 F* u0 y' b* j            }
. x% t$ G& j1 U# r            else istrin.clear();
6 B+ l5 V, x2 \! C        }
" L. _2 |+ [3 ?! }6 {4 x5 w: x4 O        else{nERR = -1; break;}
2 Y, v9 z. R6 y) l) {5 ^* M    }3 a* k9 A% N/ ]; p+ S& Z
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 u0 S$ F9 p( B- Z    else nReturn=GetExpValue(t, csym[0]);
! J, e  y* |' L/ l    return nERR==-1?1:0;1 [# d( j  Q5 M0 q2 R$ \% X* |
}}
! N  N+ O  J; X+ g" i2 Z
  y. d' c6 V7 I7 H- o: O8 n# i! D3 ]% W; `) H1 i! e( I- e) `

9 Q: c$ J" c; o" Z/ `5 D' n函数模板使用示例:
6 t1 v8 L/ Y! t$ l% m% E在以上那段代码的后面加上以下代码:
( w5 B& \: q! J- A) P( q) f+ K. S" J, _' z

# `) c. W! T1 W3 S
. j, o3 ^: S) N, h" W2 u0 C程序代码:
8 z. ]$ W0 F4 ]3 y0 I( o! B- ]9 b& p: l% y
#include<strstream>. W; I# M/ w% K- m
#include<iostream>3 \/ B1 v8 g  s% h- t1 l4 k, t7 e
#include<string>& l, A3 L7 B* R; ]' j
using namespace std;5 z, j8 u' W8 a* Y3 i, {  L+ t3 s; F
int main(void)
9 w0 U4 p+ v3 @* R. I{8 i9 C% P7 X+ |+ ~: w. M7 N: c
    string s1;) l) v0 s; c' i) B3 Y; b6 e
    while(cin>>s1)0 Y) B6 o/ q# L  s4 v+ L# U# ?( U2 Q* i
    {9 _/ e  r+ E0 t8 o" W0 N) ^
        istrstream isin(s1.data());
9 R% D5 l# t  f) I' O' ?) C: @        double d;9 X0 _  Q% W) J$ [
        if(fy_Exp::GetExpValue(isin, d))
; [0 v& G0 S, i+ o( U, I        {
0 `1 F( {  H* l, ]8 j( H  {2 ^            cout<<d<<endl;
' Q6 Y* y& v) z& K$ X9 e, f3 ^        }8 I/ w8 C% x$ t, j8 q
        else
) W" b3 x5 C4 E        {( O: c0 y2 h# [* ]
            cout<<"ERROR"<<endl;
4 i2 E& {$ C! \  \4 x        }
) k2 b  {: `$ i  k    }
: h) U$ j; v" H8 L% J    return 0;% V  l( ^9 N, S8 W- ~3 x
}
. \, h6 v; h. n! y8 `" k6 ]  T. G  d/ r8 t6 G2 |9 o

7 O! H4 {: h+ v3 \然后编译执行就可以了(*^_^*)
* _0 ^6 F2 D$ W6 ^+ A其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 q4 N! p# B2 b# [
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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