Board logo

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

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

在9月8日那天我特意编写的,给大家分享的,
$ M$ P6 I0 O0 M" N2 ]% _一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ M3 o: ^* u- g* ^只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ J' S( D& h0 b$ s! M& \% F
参数解释:
. K/ Q, ?- s/ J' H! i( Y8 ?# e' histrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
% q0 W+ }( o4 mnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 x5 O, b. ]" c' v8 F4 y2 p4 m4 o
返回值:- e) |) w) M; g9 o+ q7 ]
返回非0表示计算成功,0表示计算失败有错误* r+ g, n& `# w+ o5 e

- E, B& X& p& {6 y6 E 8 d6 \% }" f, U9 Y& d9 Q% u& h
* v- K: u5 r8 Y% N0 E4 d0 A
程序代码:
6 \+ V6 X. m- D: @8 I
+ Z" L7 f0 D! X2 B5 Tnamespace fy_Exp{+ s4 Y8 C  V. f7 d
namespace {template <class _T>
4 f9 X5 P9 t  U# P! y- N7 [inline _T GetExpValue(_T t[], char& csym){
$ E$ B4 `& x/ ?2 x: Y: R    char c=csym; csym=0;
4 h; @9 `4 E& }& V    switch(c){
4 G4 j: o; k  S( b  e9 g( C    case '+':return t[0] += t[1];
' H/ S% f/ K( [6 ]    case '-':return t[0] -= t[1];' w; R: O9 \  j% g3 c
    case '*':return t[0] *= t[1];4 P, d" N! P* n- F0 S) f8 Y' K
    default: return t[0] /= t[1];//case '/':
6 c' H- F. I" x4 D) i. `5 M    }
& C- ~/ `4 T4 n5 G' R$ y& I. [}}
/ \5 x" I. q5 z0 W7 x8 ^template <class _T, class _Tstream>
+ U  c0 l& l6 h) W- L7 f: U. h/* _Tstream: inputstream, _T: get return value
$ `! c) y$ i& D6 @( x* Return nonzero if get value successfully */
% H, Y7 ^+ g# s  C4 E3 Fint GetExpValue(_Tstream& istrin, _T& nReturn){
3 O6 O  F! ]1 N0 r. b/ \    _T t[3] = {0}; //雨中飞燕之作8 o/ w7 X$ W% Z/ }
    char csym[3] = "++";
1 S0 U8 L# x+ }8 u    int nLevel = 1, nERR = 0;- _( v( j% H/ H; E
    if(!(istrin>>t[1]))istrin.clear();
% H# @) g9 t9 U9 b% k    for(;;){
# r4 y" }9 ?& C        if(istrin>>csym[2]){
& d4 k$ I5 s$ W$ B6 t" w8 |            switch(csym[2]){
0 a2 F( s& L  ?4 \            case '(':) j4 Y! V) f" a" D
                if(!csym[1]){nLevel=0x100; nERR=1;}else
4 [8 g, N. r* f, `/ P                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;. z% l' q# x; H" b
                else{nLevel=0x100; nERR=1;}! }3 }$ Z; }7 P. I1 Z
                break;
1 m% s1 z0 @: p) v" V! y. ?8 B' F            case ')':% j5 g& i* ]. Y$ G  W" U
                {nLevel = 0x100;}break;0 o* I6 Q2 v) o; N7 r
            case '+':case '-':case '*':case '/':" o3 j7 k* R9 J) K% g# H: e4 {
                {csym[nLevel++] = csym[2];}break;* a: e8 ?  Q0 ~8 K; l, }) J
            case ' ':case '\r':case '\n':case '\t':continue;: V4 W  t2 @! O/ R7 j
            default:- [+ Q: w, W% `' ?! [* Z
                {nLevel=0x100; nERR=1;}; l! g; G. L% @5 X2 Z
            }
: S) W6 V8 c- I, b) k            if(nLevel==0x100)break;
8 z: r6 w1 ]0 j0 v) A            if(nLevel&0x10 || istrin>>t[2]){7 x, d+ K: {6 j7 P
                nLevel &= 0xF;
2 p' c8 \% a# m* ]7 [* W5 A, Z& t3 V# {8 l                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 d* F& v4 U7 w" N4 c5 d6 H4 z                if(csym[1]=='*'||csym[1]=='/'){
, [  L! b, Z. Y3 [& V                    GetExpValue(t+1, csym[1]);
& t1 y# z4 O9 V5 E. @! u                }. o4 r8 |% U- z3 \9 P& K
                else{: l  m2 W! P4 I/ v' }
                    GetExpValue(t, csym[0]);
$ A4 J% X8 K$ [7 J* c# S                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;7 ~: _# W4 V& E
                }
0 G' z8 W" b* G: x                nLevel = 1;3 F. |. a% j7 a
            }
; l- E/ R1 R7 x% d- l            else istrin.clear();, r7 Q5 c7 x- \% `
        }
: O/ B0 X3 C( A/ `2 x! X        else{nERR = -1; break;}$ w* G" n+ y2 ^+ v: @( i% T9 O2 Q8 `
    }, k- i- K% J3 A- [% S3 F
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);2 {: x& F2 |  l! o4 r
    else nReturn=GetExpValue(t, csym[0]);
( O- D8 i7 S) o1 I    return nERR==-1?1:0;/ Y% _; F0 C& t# M5 j
}}
, k* N% m+ F7 @2 g% t8 t; {( t! G! t( H2 u: @/ r! e# e2 w
! v# e. R  L# C) V& X* I
7 m1 S2 a! y6 }/ f2 ^3 Q
函数模板使用示例:; f/ f+ Q/ b" a
在以上那段代码的后面加上以下代码:
( X( R/ e  s2 `4 w7 t; W1 s2 l. ]: A
6 I5 P' g% T' X0 p, L8 H
3 ^1 F9 D0 H/ G+ A% `
程序代码: + ^- v) \+ j  t$ x" Z
6 ^9 U* m1 ^( K* Z
#include<strstream>
& ~7 K% M+ j1 H# u, D& _2 C4 p#include<iostream>) R5 ?9 U* m2 i
#include<string>
& R) z* O( l" ^$ ]' f4 wusing namespace std;/ v$ t( U8 f/ `( A3 X( {
int main(void)2 N3 X1 G$ K* f, C, x1 a+ q! O
{
: R( W5 y4 r& B6 Q    string s1;
% E' M$ Y$ i! f( s! O    while(cin>>s1)
% _' A7 W0 }' V1 U$ n* P    {
) F6 c! n8 ~' N; L; D2 V        istrstream isin(s1.data());
" w, L1 H8 m* D% E( v        double d;1 {7 x, o  M0 W+ e( }3 c/ t# \8 o7 `
        if(fy_Exp::GetExpValue(isin, d)): s, L5 P: y2 t! k8 I7 t
        {# C- C1 X8 S# G/ W! L! P
            cout<<d<<endl;
  S7 s1 T& `8 G        }
( S- C, Z  [- G9 F  G0 {$ J        else0 L& x% W3 I/ y, ?6 q5 H9 U
        {
: \% \. s# Z, X' i4 B; W) P            cout<<"ERROR"<<endl;9 D; ^# {# _) y" A
        }
0 A2 d* X/ Q; D2 Q$ I! u    }
6 S, _' {, D$ [: z2 {: }    return 0;
% V- j4 ^4 \) B$ L+ X}
* O% E1 R" i+ q7 a: R  y
7 r  e+ M$ V2 }: A8 h3 Z# X9 a! m6 f" x. R" `
然后编译执行就可以了(*^_^*)8 b/ |. P: Y5 L; l) h7 E, i
其它:TC++上一定编译错误,不保证在VC6上也能通过编译. q- B; {" D% z7 @% q5 a( ?
      建议使用VC7或VC更高版本,或者使用GNU C++编译




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