返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
' I6 z; o7 ?  I, ^: s7 O一个很方便的函数模板,可以并且只可以计算含括号的四则表达式% _; P9 y, R9 K+ g' }
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! l2 }, W1 ~8 N( c7 z3 V' |' e* l
参数解释:
9 F# s" J3 c  q7 ~  \, yistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 i& }1 {+ E7 @2 AnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 ?0 v. K' J) s; |( I7 n
返回值:
/ ^! ?# _! S' f. p返回非0表示计算成功,0表示计算失败有错误' j; F1 A* v3 f. ]! s; T; O

5 i4 I# Z7 g5 p) L8 E, W ' z3 E0 f' X3 S8 `& w- M

+ \. b$ K. ~" l/ j程序代码: ( ]8 E7 H8 |  }5 D! H, E6 V

. e6 G  s. |0 x- e1 @8 b! cnamespace fy_Exp{. y! B/ F+ I& l  R. w
namespace {template <class _T>
: l3 |# g, c: w) N* M) S  S% pinline _T GetExpValue(_T t[], char& csym){
7 e6 O, v$ `- B    char c=csym; csym=0;
* M9 q; C( }1 u  X; U    switch(c){
! o0 b6 e( ^, K$ o" O. D9 S1 A9 H    case '+':return t[0] += t[1];0 p  _5 a0 A+ d: p+ g7 E: O6 X
    case '-':return t[0] -= t[1];
* b+ {$ B- U) t    case '*':return t[0] *= t[1];  o: l& F2 K; u  Y1 _* `- R
    default: return t[0] /= t[1];//case '/':
, I, y+ P& P  a# i    }. T" {' w% c2 ~% A4 [) P1 s4 M
}}
! ]. a3 H4 ^: K6 otemplate <class _T, class _Tstream>
4 P) q% E+ \+ A5 b/ v* g/ b/* _Tstream: inputstream, _T: get return value
, y1 x7 {, u8 {! F. x* Return nonzero if get value successfully */
5 Q: V, T8 T$ v0 A6 f3 z: Uint GetExpValue(_Tstream& istrin, _T& nReturn){; w; e. J4 f2 j' U3 d+ ~2 K" M
    _T t[3] = {0}; //雨中飞燕之作) F+ f" b! s) N( g
    char csym[3] = "++";
. R/ e: H  B( l3 e* s. m* C    int nLevel = 1, nERR = 0;
3 M0 S  O- g# l9 Y3 H4 t    if(!(istrin>>t[1]))istrin.clear();( s$ m. j0 ^3 }
    for(;;){
8 X5 x% m( `; y7 i        if(istrin>>csym[2]){( m8 O! _' q! \5 r3 A
            switch(csym[2]){- P  n+ b; J' N3 `* I0 b( c
            case '(':
! o2 K: [+ I% Z. i) N; N                if(!csym[1]){nLevel=0x100; nERR=1;}else9 V6 E0 U8 L) J; k- ?1 |) n
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;" y6 l" e' y) n; Q" r% `
                else{nLevel=0x100; nERR=1;}
6 p+ l+ t' b7 v$ r/ |& r+ h! ^                break;! {. F% x# R' o) {. ^9 |0 O
            case ')':4 r& e: w. a( p) @: f  B
                {nLevel = 0x100;}break;
9 J0 f- g* F8 l- U5 U. |& a0 L            case '+':case '-':case '*':case '/':
! a7 _. B0 u* i( c% x                {csym[nLevel++] = csym[2];}break;
3 J4 c! l' I3 }8 @/ l8 c9 f            case ' ':case '\r':case '\n':case '\t':continue;( M& a$ T6 M6 o$ @7 l( _
            default:
0 Z" m4 I" u5 n, X1 r4 W6 l                {nLevel=0x100; nERR=1;}
- ?" D& z6 n3 q' g            }) H4 l8 `6 D" N2 q5 w8 y6 S
            if(nLevel==0x100)break;
4 z4 S% n( e0 U9 j* g0 U! U% F            if(nLevel&0x10 || istrin>>t[2]){: o2 C/ V( R! S' j5 e" {
                nLevel &= 0xF;; n" E5 p. M+ n, ~# S5 Q% P
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}  }& m! A' U( W5 k4 ~
                if(csym[1]=='*'||csym[1]=='/'){3 D' T( z( m" M
                    GetExpValue(t+1, csym[1]);  W; Y1 h' T9 g) e8 o# q2 \
                }
3 ^5 Y8 c& _% r. a; h) m                else{' d$ e0 A2 `; g
                    GetExpValue(t, csym[0]);
% d, |$ Y$ C+ f% x, _                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
( v% h, {% S6 o" M1 o4 G                }
! {# }6 ?6 h6 d1 H                nLevel = 1;
+ `" E: I& m9 A- C            }
2 h' @) G$ h9 G/ K- @& t8 @            else istrin.clear();
1 W4 P& I1 a+ I) N  ?; p& M* u        }$ p" H/ s/ s3 u) o1 Y7 n' y
        else{nERR = -1; break;}
; |  o9 T0 m& q! i! k) Z    }
; S5 N. D- g' r, @& x9 C' N9 ]    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 z7 r' M2 [1 k  v* n
    else nReturn=GetExpValue(t, csym[0]);
/ {3 f9 I' K6 n    return nERR==-1?1:0;) l) c1 `& \1 \
}}9 }" T( t! @/ ^

  f1 S) i) z6 T8 F9 z% {8 y9 }+ l' H3 ^
- e, O- H- b+ {+ z: X5 V7 i
函数模板使用示例:
3 D1 c! w# J- S/ u) L在以上那段代码的后面加上以下代码:
3 `# P8 [8 b" A0 K# ]1 ]& M8 o0 u5 }( o) r9 d$ n0 j7 D7 z

0 B( b" @- k) d, E8 x2 {! n
4 S7 [" L5 U# }7 w2 ?程序代码: * S6 d% ~3 z7 u$ R, u% t- F

5 n% W5 f+ Y% F/ S8 W, D, ?* N; _#include<strstream>
/ X. ]. l1 @- B2 M2 g0 K+ s- s; G#include<iostream>9 e7 a: }. ^) W7 ^
#include<string>2 h3 s- n1 F, g, A4 Y' a
using namespace std;0 Z- ]0 C1 \$ t) x( y9 s6 {! r
int main(void)5 J6 n. A' I4 h- b9 e0 }% D
{
" }) F3 k4 e: I8 g" _) Q    string s1;: ?# f% P) O. y5 j
    while(cin>>s1). `( @3 P4 G2 o- j) \8 d' K2 W; o
    {
8 D6 d! p" O: \  G        istrstream isin(s1.data());
" t3 _9 ?% p3 G1 Z- H        double d;
& [7 Q7 Y6 G3 g3 e4 m5 D, ^        if(fy_Exp::GetExpValue(isin, d))% U0 z3 r# e0 T1 c; [
        {% j% G: C! n& v6 @
            cout<<d<<endl;
% k: V6 C  H/ v5 A5 `/ l2 E: B        }
& }6 J& \( Z/ h) \0 z# ^% D        else
; Z, y3 r0 K5 U) Y! f5 b        {
6 s: R9 C7 f9 f) H! Z% ?            cout<<"ERROR"<<endl;! w+ i+ X( F$ t4 g6 {: M
        }
! D) x+ V, ~/ u# `    }) {, ]" n1 Q7 _! N, ~' i3 m# F
    return 0;" E, a# ?+ {) `& q1 d* C" Z% u
}
" l" u( ?, k* [: `* @* R
$ G+ @5 M" a( K. i3 U1 X7 h, y  O; b/ Z. B: T  L* Q9 L1 Q/ @7 a
然后编译执行就可以了(*^_^*)1 p- s* l4 a- s7 r6 s
其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 R% w( Z5 Q% k& I
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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