返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
+ n  P/ k7 S' h' {" A! S" w# {一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. X8 r; C, h/ G; Z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" O4 ~, |8 a0 @: V2 C0 F参数解释:1 D7 s+ [: @3 c9 y* k5 Q6 b
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 ]; S! B, X" e2 B' {0 [& ?nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
/ m. x7 P& O, L; r返回值:* z- n8 f9 N  P4 x
返回非0表示计算成功,0表示计算失败有错误4 U' Z5 s% ]! w) h
+ M& f, G! R+ I
: ]) O; g2 e' i1 z
+ i) A  b" w4 b- }$ ?$ h
程序代码: , N5 ]2 ]8 n) E, J
" F# d; ~. E# E* G
namespace fy_Exp{2 }1 n% _8 {, z
namespace {template <class _T>$ s! ?/ F& ]# m) P: C# x
inline _T GetExpValue(_T t[], char& csym){/ @1 v5 f4 B* W1 ~; z( s' X
    char c=csym; csym=0;, F% A0 `5 _. F& y8 z* c; s
    switch(c){
8 H2 n& N7 J8 X. `9 Y+ Q( \    case '+':return t[0] += t[1];$ l# j3 _6 e& G' ]" R
    case '-':return t[0] -= t[1];9 e4 u4 \' H+ C% P5 x8 a8 K' I
    case '*':return t[0] *= t[1];9 B8 y" h3 a3 W: `6 c
    default: return t[0] /= t[1];//case '/':
, P# ]5 F+ ]  h9 S, f2 j3 J7 Y  [    }
0 t( W. P5 B' o}}' k- O% W3 l+ u, v) O
template <class _T, class _Tstream>' ]  V5 ]$ T- K/ [6 A
/* _Tstream: inputstream, _T: get return value5 |' W' M5 `# Y" R- x
* Return nonzero if get value successfully */
9 K! B: l: m0 B4 iint GetExpValue(_Tstream& istrin, _T& nReturn){# ?2 j6 ?! y0 E) U' J4 ~
    _T t[3] = {0}; //雨中飞燕之作
+ ^. a- p$ d2 \7 a    char csym[3] = "++";
9 F! z$ Q5 \1 V) u    int nLevel = 1, nERR = 0;
1 j2 v! Q! s, g2 }    if(!(istrin>>t[1]))istrin.clear();; r+ P  K2 ^+ V, ?* C* h, \
    for(;;){7 U1 `0 e; s# u' G
        if(istrin>>csym[2]){
; b1 b/ @, n- i& o( Y. t            switch(csym[2]){, Z1 f( i0 n# b
            case '(':
. q# s) k. E: c                if(!csym[1]){nLevel=0x100; nERR=1;}else
9 L( z- h( h$ G* h/ I2 W1 Z                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; U6 b' s: M" R6 e% e* V3 N
                else{nLevel=0x100; nERR=1;}
3 [8 c5 R1 E9 F                break;7 t! O- D# i& W; c+ P+ J6 _
            case ')':
! Z9 }7 L% G3 C+ f; g' c, D4 P0 m8 P+ _                {nLevel = 0x100;}break;
, {8 y* W1 d2 i5 S6 x/ v( W) b* _" F: _! v            case '+':case '-':case '*':case '/':
) g7 F' G" v, y. q# P                {csym[nLevel++] = csym[2];}break;
( k0 g7 p3 p" n- B6 I8 D4 K$ k* R! V9 g            case ' ':case '\r':case '\n':case '\t':continue;
0 D: {* O/ i7 \) D+ g! A            default:
) u+ ~5 v, b1 d9 e% R9 s8 H                {nLevel=0x100; nERR=1;}7 b) z4 x! U& F0 _7 c2 r/ a4 m, l
            }
% n! s( o9 m$ h0 ]4 J& `8 Y            if(nLevel==0x100)break;" x0 x/ W" k& G$ G9 s# @% p
            if(nLevel&0x10 || istrin>>t[2]){
- u9 [( K0 c$ c) E                nLevel &= 0xF;
  G. l% ^9 I9 i' _  y                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}( W1 u1 L# s. X. z& c9 m
                if(csym[1]=='*'||csym[1]=='/'){
' e' ^; f" _0 o$ M                    GetExpValue(t+1, csym[1]);
1 \! b! Q* p  @  |5 v& l                }
$ U7 \5 O/ I4 s6 Y  B# @4 U                else{) A  b2 l3 ^- y
                    GetExpValue(t, csym[0]);
# S7 ?; T3 U# X( J( T                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;. F3 ^- g/ Y: I) b. p& ^" {9 a) ?
                }5 j  B7 N9 y3 E: C4 b& c
                nLevel = 1;
$ c8 o1 ~6 H, y; z            }
* w6 u: O0 T* @( i/ U, s' @            else istrin.clear();
& F" ~  A. D5 Y1 ^! [4 g7 c: C$ ?0 ?        }  {/ C0 f! g; }+ N
        else{nERR = -1; break;}- L2 @5 K, e6 j/ z1 t4 m
    }
9 M# a! S2 A) J0 Y    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; G3 ]* c8 O. q7 [3 E2 r; c    else nReturn=GetExpValue(t, csym[0]);/ P6 g9 ]- s: r. _& O2 M
    return nERR==-1?1:0;0 |3 m0 D" D/ H6 b: `9 P  W
}}# q5 u) b' w3 U% F9 c7 v
# B1 M1 J4 [' t0 F3 g
7 Y6 I( w; V9 r( ?( n* N" }4 j

; J2 j8 `9 ]! R4 D6 Q函数模板使用示例:
3 d, b$ C. d" `在以上那段代码的后面加上以下代码:
8 k  K/ z) C- a! z, a
% p. q' Y2 o9 N% P7 I
; ^- L) U. I4 B' o# t9 Y' T5 d) X0 c! [2 H1 _$ u1 `
程序代码: ! `& [2 o  W+ @5 ^4 }
1 U# p, w4 r& P; T! @
#include<strstream>3 Z# O4 t+ H3 n: J
#include<iostream>, u/ C( c9 D/ Z' W9 y- R2 R
#include<string>8 h# r) C4 \, p: ]- d, f
using namespace std;
: o* n2 _( T  N1 fint main(void). X( j4 k% S* o/ R+ c4 ~& P! Z& ]
{
# ]( g8 \1 R1 \7 K" y& a# O6 Y    string s1;
' c9 i0 d/ y( k    while(cin>>s1)+ R, G1 P, D1 L& d2 v8 p
    {
7 ]: E8 ]5 r1 j7 R6 w. N/ z0 V        istrstream isin(s1.data());
1 w4 ?- Z" A3 N" X5 j, u# Z        double d;
4 D. z1 ~; Z$ D7 I" D        if(fy_Exp::GetExpValue(isin, d))6 I+ h& a- C9 Y4 W$ n
        {
& c- X6 b& S% Y6 B5 @            cout<<d<<endl;
1 L6 Z# e/ S! E3 D        }
) m, K7 l6 U7 Y: P        else/ o! A+ w) [! a( s
        {1 Q' f! C4 T) r, ~# p" T
            cout<<"ERROR"<<endl;1 _$ x* o. Y! S9 V0 |/ K
        }' F" [5 y! p" X4 j
    }
7 v: J2 h  J) Q, L# @    return 0;
; o8 U* ?. _4 c3 I0 Q8 b3 a}4 k# K/ a- b; z3 W4 f; o

( ~2 t( y+ s" k; m
. N8 ^% D& `" p6 l7 ~* M然后编译执行就可以了(*^_^*). I" w. @" u# `1 z* [
其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 a8 S7 q1 s* T3 v% C
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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