Board logo

标题: 一个计算四则表达式的模板 [打印本页]

作者: zw2004    时间: 2008-1-21 20:17     标题: 一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的," w/ e6 I4 c; b- a: N1 \2 e
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式$ e5 W( {( S& y$ l/ @2 g9 w! m
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% o. {- d2 M* b# F参数解释:
) P: t% Q# `& h, Pistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 @4 [) n" ^; |8 W6 x  K9 x5 X2 i
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 G  R; L9 }7 l" Y) z
返回值:
/ w: u7 O; p' S返回非0表示计算成功,0表示计算失败有错误2 o. y0 G- J& a: W7 Z8 z
% U# `5 w3 |7 }% J4 J, r
$ K0 V2 c. k/ m" I) h# _$ y1 n

$ _* |1 q: I: P; e+ e( k" K程序代码:
1 D3 U4 L. y, X( }& d: N, P, n2 n& l$ N9 V( L
namespace fy_Exp{1 U7 Q& O/ ^( i) Y
namespace {template <class _T>
- Z: l9 L5 V0 j* s* d, `' V' t2 iinline _T GetExpValue(_T t[], char& csym){
4 L& w1 [# @/ A: ^. N: w% a    char c=csym; csym=0;) J! D% B( m  b7 q
    switch(c){
  Q+ x' l7 J+ @+ O6 e5 E6 m    case '+':return t[0] += t[1];7 R1 `+ F' z" h' q- c( S
    case '-':return t[0] -= t[1];
: u, O* w# e6 S    case '*':return t[0] *= t[1];" z3 n; c( j4 p
    default: return t[0] /= t[1];//case '/':
7 K+ X1 A7 w. y! x, K# V    }2 _0 f6 A: w2 o4 O; g, ~
}}
5 j' k4 c1 m7 x) L6 ftemplate <class _T, class _Tstream>! b1 h9 @4 R: Z
/* _Tstream: inputstream, _T: get return value7 d  E' c( y! U4 U; x7 M
* Return nonzero if get value successfully */
0 Y( T$ x+ u) \int GetExpValue(_Tstream& istrin, _T& nReturn){
7 [  s+ r# [, o0 s. I    _T t[3] = {0}; //雨中飞燕之作
5 a; m( x; Z2 [& d    char csym[3] = "++";
3 @2 x% t& Z" G9 v# I, L    int nLevel = 1, nERR = 0;# V: x  w; q2 S# q
    if(!(istrin>>t[1]))istrin.clear();% K' s4 V6 g4 ]+ j! F" p
    for(;;){) G3 b0 H" }9 C( W* e
        if(istrin>>csym[2]){4 Q8 Y  N8 v3 L8 O% \
            switch(csym[2]){! a8 M; v5 C+ ^; j; r: w
            case '(':! Q; B5 o  D" ~6 F
                if(!csym[1]){nLevel=0x100; nERR=1;}else
! ?5 l/ L/ f+ h1 p2 z/ M                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' N0 x2 u# a4 [$ R- P
                else{nLevel=0x100; nERR=1;}
, F4 z8 E7 B$ ]3 \; E3 i                break;
' @3 U1 x& U- @4 T2 ~9 u            case ')':
! I* e. h- l: ]% J' O% I* N3 y                {nLevel = 0x100;}break;7 q3 X3 \, K; D1 I' D3 S! T1 n
            case '+':case '-':case '*':case '/':
0 O% x4 l# s2 p6 P                {csym[nLevel++] = csym[2];}break;4 p9 k% x* \0 R/ ^7 z  ^8 W
            case ' ':case '\r':case '\n':case '\t':continue;3 |: V; e. U9 j) l: }9 d) c$ r
            default:6 O4 X, Y% m, T& L+ }1 x
                {nLevel=0x100; nERR=1;}
! l( ]& @$ _- g* I! `/ ?0 Y5 L# }: R            }
( Q% |2 U% n; Z2 N4 n0 n            if(nLevel==0x100)break;& E$ ]. |: P" l) Q6 o
            if(nLevel&0x10 || istrin>>t[2]){% H- n. G- `7 G' m
                nLevel &= 0xF;
0 ]% X$ \$ i; [- @+ ~# J                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}6 C1 c+ u) O' m: ~1 K" T, X3 I
                if(csym[1]=='*'||csym[1]=='/'){
1 f* w1 ]! E9 M6 w" w                    GetExpValue(t+1, csym[1]);, U" A* }( O4 p/ f
                }7 [% j7 B/ }- V) \4 k. p
                else{( E$ g3 D' c8 ]- [1 e8 B
                    GetExpValue(t, csym[0]);, p8 d! E, ?9 S
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
. F4 }' i  f1 d; V% l+ [                }
4 R) t+ E3 \9 K                nLevel = 1;
( f) L6 b1 H/ }3 _7 p% v            }
" H2 f# t/ i' v1 t7 X/ I, s6 |: v            else istrin.clear();. \# c; A' L) M) h
        }3 Z' M1 g3 e& @& A5 f
        else{nERR = -1; break;}! Z* n' `  `! @+ y# f5 F7 G% Z0 t
    }
( G& v9 ~. S8 d# m+ p1 u% N+ Z    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 d2 g' E, H- g7 @    else nReturn=GetExpValue(t, csym[0]);
$ O1 k+ E( g" ^" v# F5 G/ X, F) O    return nERR==-1?1:0;* ^6 |) u, h5 A4 S
}}
5 N3 ~# y7 v; M5 b4 [  N5 P* t9 K6 `0 J4 ~4 ^; V. L

+ i) j! J; x( R3 {- r8 f9 `/ i/ C% _) d% f
函数模板使用示例:6 ^0 Q$ ~' c; V5 c
在以上那段代码的后面加上以下代码:; t- y8 l& a2 Q  C4 Y, P" A

% {" x  r; N* f$ I* q / h7 @3 ~7 |0 c# @! Y( u  |

+ R% }; K" K8 m4 \4 @程序代码:
, c, i2 _1 N8 }/ b" o$ ^
# _, [/ T- c' w7 K0 e1 S& ?/ }* Z2 y. }#include<strstream>$ G5 i9 x2 E, `
#include<iostream>
5 H/ W. w$ l/ V( C- q7 ?+ A#include<string>6 }0 {% U; m" a0 B' e1 G1 b
using namespace std;
0 }5 m0 y6 K/ f3 c- kint main(void)# }9 n% H& U1 U' i5 S6 Q
{, q& g# w: s8 a
    string s1;
! }0 Q$ z+ g2 d4 G1 W1 L( ?+ G; o    while(cin>>s1)
( R1 _( ^* l& D, c; n3 G5 }    {8 T# {8 ?( B; |) w5 [; J5 J( o
        istrstream isin(s1.data());8 r7 q( A' M8 K2 J' @
        double d;0 N9 W* i; X+ s# b# A
        if(fy_Exp::GetExpValue(isin, d))
7 e7 E1 G9 M! Q/ M! T0 u        {" h; i9 E) H6 t, p* D
            cout<<d<<endl;
' s  T  y9 P8 m/ V  b/ L        }
& J( \# \9 B- N& K        else( A  W5 x8 T6 A  v6 C
        {1 O( o- q: t3 j( S
            cout<<"ERROR"<<endl;
% d3 S* Y; c; o0 g% E. I        }) V( N* j: t5 P1 K
    }
+ i( r3 n4 s) i* \0 _: R! |% {/ J    return 0;6 E& Z/ R: E& J& m; ]
}5 p6 U& G0 M) i8 c0 o7 n; l

4 D9 j/ g6 |6 {6 q3 \% P; Q: u- U/ I3 ~0 p( v0 K
然后编译执行就可以了(*^_^*)
0 t5 N/ y! _0 y# X' T0 _其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* B# b4 g% Q7 w* k) s9 ?      建议使用VC7或VC更高版本,或者使用GNU C++编译




欢迎光临 捌玖网络工作室 (http://www.89w.org/) Powered by Discuz! 7.2