返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
9 R5 P9 w0 C9 R, L" N. s一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
0 P  G0 J. \5 w# \2 u! ?0 ]只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) ]9 k& v( ~& w% k, C( Z2 c参数解释:
) Q* V% o; A$ p  aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' n) y0 E8 o) X" B4 J. q: Q8 ?$ z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
& ?% e9 B. c" F返回值:" P# r# b- Y+ r7 N1 R2 P
返回非0表示计算成功,0表示计算失败有错误& a$ B# s# N3 `
0 V4 A$ r, Z, M; V. s* Z
& J2 X  v$ c0 f- G7 x" p

# H( C) L& a9 t/ T, _% ]程序代码:
+ O; G# ~- C( Y& V& V' s$ Z7 ~5 X
/ N2 I* x5 i* s, R$ a" L  Unamespace fy_Exp{* u0 d! \0 _$ a/ U2 L1 @
namespace {template <class _T>: s6 ~6 X. m# W& K; q# S% P
inline _T GetExpValue(_T t[], char& csym){2 D% Y+ @7 w8 w1 v  D" R+ K' V0 b1 m
    char c=csym; csym=0;, A* H% N& Q3 l; E, K# J  e
    switch(c){; G# t) u' z% y! Y7 r7 ^* }
    case '+':return t[0] += t[1];
, U& A2 J, T+ g3 m    case '-':return t[0] -= t[1];; w* y; m& T2 b' i' Q1 t
    case '*':return t[0] *= t[1];6 _- Y. Z: r: t
    default: return t[0] /= t[1];//case '/':2 U% v4 }7 r) P! n8 |7 R) O
    }
/ h* i' F3 I6 f- {1 Y( R+ V}}0 b2 x8 V6 r  F$ X; B
template <class _T, class _Tstream>- v0 s) E% ^! N- ~/ v  m2 m, f
/* _Tstream: inputstream, _T: get return value
3 J! T0 M& H5 @; U( A* Q* Return nonzero if get value successfully */
1 B1 d7 ?+ _( E& ?5 oint GetExpValue(_Tstream& istrin, _T& nReturn){
" }- t( Q# t/ X& S    _T t[3] = {0}; //雨中飞燕之作, x% P1 j2 j  Y  h$ ?+ M, }
    char csym[3] = "++";
5 [5 G: N+ k  H0 @5 z+ q- ?; M    int nLevel = 1, nERR = 0;
$ v! g' U# e! L! W7 C/ Q    if(!(istrin>>t[1]))istrin.clear();
' e5 x1 j2 K5 p- N4 n    for(;;){4 L( F$ Z7 M2 _# S( [
        if(istrin>>csym[2]){
  `9 z. X; Q' f9 n            switch(csym[2]){
5 R& j( I, l$ d8 l, t            case '(':
( c. l, z3 _/ g- ?/ f! C4 }* K                if(!csym[1]){nLevel=0x100; nERR=1;}else
" x$ F+ I  N- u                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, Z/ P! z) W; A7 ?2 s                else{nLevel=0x100; nERR=1;}1 Y  s& w. ]2 r& O- w# C; I! k
                break;
3 F$ w" e6 t1 c5 S& c            case ')':
- ]- G- E9 Z- u5 }                {nLevel = 0x100;}break;
/ l0 i: s2 b0 N            case '+':case '-':case '*':case '/':
9 [' Y, w/ z1 A9 r* s                {csym[nLevel++] = csym[2];}break;" Y5 N% m: l1 v9 q1 H. D5 C
            case ' ':case '\r':case '\n':case '\t':continue;
; w! W' h, ~" D5 b            default:
$ Z. m" J! s# C3 p2 e4 g' h) p3 k                {nLevel=0x100; nERR=1;}
5 ~# o7 k7 K( o! Z  h            }! I: |$ `: n0 |
            if(nLevel==0x100)break;
0 n9 o- i0 Z/ P& l! _            if(nLevel&0x10 || istrin>>t[2]){5 l* r* o9 s9 |  `- e. c" e* o
                nLevel &= 0xF;, W( c7 [; F! Z3 R' n3 Z
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
) B/ t* J. c5 J) I% y* u                if(csym[1]=='*'||csym[1]=='/'){
# }5 ], ?* v& o) O                    GetExpValue(t+1, csym[1]);
8 }3 Q+ e$ m3 S2 V, G8 z                }
* r% C: }1 z0 s$ D                else{
3 s! l" V' i- z                    GetExpValue(t, csym[0]);
# L8 m5 l% f" R# W: {                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# a, g+ x4 d+ z  Z, I8 e                }
0 L% f: ^% z9 f4 W1 k                nLevel = 1;
( e; B9 p4 [$ }# G/ ^5 x$ N3 e& \$ {            }4 T) c3 C5 f; p6 h: V" ~
            else istrin.clear();
& x, i. l5 J5 O( a        }: T: v7 w- J" w
        else{nERR = -1; break;}
% f! V& Y4 _4 O8 l5 G. R8 h' _    }
8 N5 I8 |2 n, u' i7 M    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 s/ _4 R8 L+ R5 `  w
    else nReturn=GetExpValue(t, csym[0]);
; z9 E$ c, Z1 }6 g' K, v/ F( U2 O    return nERR==-1?1:0;" H# m" q% d3 j# _, {
}}
; ~* y$ e9 W' \1 \; j7 w6 {1 H0 f9 S

3 [. g9 i$ F0 S0 M4 b) _& D& c( L4 S. K! @1 g$ B
函数模板使用示例:
& s  c5 ]3 N. C在以上那段代码的后面加上以下代码:- i; Z/ v! Z* p3 _) _
8 Q) V! ?' {/ x: Q4 A" Q
: [% f. a- M5 m
2 X: o1 D3 f* Z, D7 Z7 u
程序代码: ' z- q2 |8 d+ [  _/ U7 d8 s

" F5 K$ ?- T  R" ?* u1 n7 e+ p#include<strstream>
8 `8 R) _+ L& o. K# X#include<iostream>
, E/ f0 ]$ z9 b" R) g#include<string>8 C" k& N$ U0 _1 E3 M
using namespace std;" [9 @3 _/ i/ m( Y& D/ k
int main(void)# I3 ?2 f/ n. L& {
{( E( v6 }& v* B  ?+ \1 a2 W
    string s1;7 ^/ W( A- g1 l# C- D+ |
    while(cin>>s1)
/ ~9 t3 i7 l8 M3 b) z9 o/ Q    {# f, \2 L3 C4 j8 ^, B3 Y0 ]
        istrstream isin(s1.data());
5 Z4 r8 z% H4 W- o" j8 j; N4 K        double d;
! j$ R7 ?2 c/ k5 p        if(fy_Exp::GetExpValue(isin, d))6 s6 q' O5 [4 E% e
        {
; _% ^+ a" o1 \2 ^( n# ~8 V            cout<<d<<endl;
+ ], V" _, O( d$ x9 _        }0 X* s# t: ~) |! b% V+ G
        else
. l6 O. T) P  V. |( K        {
% N- A1 r4 P1 D& g3 G! z            cout<<"ERROR"<<endl;/ G5 l) O, d( ?2 ~3 {
        }
" k# _5 S# B. @/ }4 R1 Z    }
% c6 `- k/ y% i( A& w  @    return 0;
4 K/ S& x9 ^  ~6 W" ?}* W& d: E  i8 L8 x. v
8 ^0 h- T! k9 ]2 l- M" y$ h5 O/ N

: t+ n  w- U0 ^0 b; l+ S1 W0 x然后编译执行就可以了(*^_^*)# X% C+ P- e! `
其它:TC++上一定编译错误,不保证在VC6上也能通过编译/ ^, z1 [6 K3 M8 k
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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