返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,) b9 r) A8 r+ T) V; s3 V' V, p
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" J) p- B9 E+ A. i9 a# s) {只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 }3 K& ^1 `  Y, Q9 o参数解释:
$ U4 V; B. N9 d' |5 X$ mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 M+ b0 A/ U2 }/ j% qnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" P/ h7 x8 P8 O& M3 J$ [返回值:0 F4 f6 ?- v/ E
返回非0表示计算成功,0表示计算失败有错误
$ c& u( f$ q* }
& Z) G, K& y( R
2 H4 ~0 A/ b) s* @, ?' f
; `. e2 b0 h. ]$ }( P程序代码: . ^% |% G$ a( _

# g5 q4 F) ?! j1 t- Znamespace fy_Exp{
5 l1 |; x- q* h% m- B5 Xnamespace {template <class _T>
. D( q1 K. ^  j! ?. `5 p( X( n! b$ \inline _T GetExpValue(_T t[], char& csym){5 o) M) f$ f2 J, G/ _2 u! W
    char c=csym; csym=0;
8 Z( R+ K1 ^' c' f6 k8 Q    switch(c){+ A# B; b, J) m6 H. |# O8 e
    case '+':return t[0] += t[1];4 ]2 |9 f# w- ?
    case '-':return t[0] -= t[1];
% s3 |8 g" B; k" U0 F/ R    case '*':return t[0] *= t[1];
2 k& U9 N. p* W$ S( _2 E    default: return t[0] /= t[1];//case '/':
4 D, h) _) M! M    }
- s. P! `: v% Y$ o* X}}" h6 ?8 ~( D. H- Q5 W: V
template <class _T, class _Tstream>
5 l, }% b) B7 G3 Z$ ~* w/* _Tstream: inputstream, _T: get return value
5 a$ Q. a& M* g0 e) T* Return nonzero if get value successfully */3 d- Y$ t& f2 B3 @
int GetExpValue(_Tstream& istrin, _T& nReturn){
4 x/ `- W9 ^9 t1 j; h! i% h    _T t[3] = {0}; //雨中飞燕之作7 k6 C7 R6 {- D
    char csym[3] = "++";( y9 G+ O6 p  Y% x! Z! ?  r  R
    int nLevel = 1, nERR = 0;( @; r, P8 u2 C* ^, t# _& P; W
    if(!(istrin>>t[1]))istrin.clear();
6 h3 Q# P: t9 m1 G- D! b5 ~9 Z    for(;;){
) r; q: |% c/ ^9 T; C1 N3 W& R        if(istrin>>csym[2]){
+ W" [" u1 c; B  u# h8 f$ K            switch(csym[2]){+ c2 F$ i2 K! d- g
            case '(':
9 `0 z) x4 ^4 s( f  b2 u2 `                if(!csym[1]){nLevel=0x100; nERR=1;}else0 }1 M, a5 r9 X. {5 u
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: f' e& X/ G, A
                else{nLevel=0x100; nERR=1;}
) G5 ~; Z& |, Q! e$ o1 t: |                break;
7 Z3 Y# `/ Y) e7 }# q            case ')':
- r2 z1 Q0 A( o; b5 }$ y                {nLevel = 0x100;}break;
& p+ P9 F% X' p3 _+ ~' S            case '+':case '-':case '*':case '/':
* ^' P# H# `7 W) y$ J6 u# o5 Y                {csym[nLevel++] = csym[2];}break;1 j+ ?1 l1 [7 m4 P/ o
            case ' ':case '\r':case '\n':case '\t':continue;1 v0 X; {( {' F# B7 Z& B) g# ~1 U
            default:
9 V, S! f  u0 |* `8 {( F                {nLevel=0x100; nERR=1;}
* y# n' J1 x( z, S. m) c, F6 U            }  Y) V# H7 I  _0 Q) J+ l
            if(nLevel==0x100)break;
1 _7 r) a4 ?0 V            if(nLevel&0x10 || istrin>>t[2]){
7 |, J6 h" I( `/ v& W                nLevel &= 0xF;  O: M8 N1 r3 G/ G- z" S
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! |" }. ]9 m% {( A$ i. t3 o                if(csym[1]=='*'||csym[1]=='/'){
# g8 q# p' N; J, T                    GetExpValue(t+1, csym[1]);
" r$ M9 e( i" D                }
- V( D4 @% X5 w$ k7 W5 A# L                else{# e7 v) y- p+ S4 K/ m
                    GetExpValue(t, csym[0]);
8 N9 ~/ P3 G' R. h7 F                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
; }6 H4 c* \4 Z% M2 x& T                }5 ]4 h6 f1 F% P5 I6 _
                nLevel = 1;
" V1 _. k% {4 l- D            }% `& K" F$ |" d/ V3 _
            else istrin.clear();! C5 t& W( m$ s( w, k6 i& L. O& v
        }+ r; x* ?7 e7 Z7 J1 Q! h
        else{nERR = -1; break;}3 b$ A, F# D) p& C+ K4 E
    }' w9 |3 R3 ]- F) I  B( b' P
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
  E% y$ }$ t/ u, ]% g# a    else nReturn=GetExpValue(t, csym[0]);
. b" J$ W6 K7 u& H! \3 F* a) l    return nERR==-1?1:0;
7 t" g  W3 @/ e# }5 t}}- y% m. F6 U1 ?) y( Z$ h
  X% a! R* r8 r3 l# t5 o& \8 `
# O9 v/ o% O9 o. [5 K+ t( z. ~

' r4 R/ I9 n# K& M函数模板使用示例:
* i) z4 A1 l5 D6 r/ V在以上那段代码的后面加上以下代码:
: o' A8 W1 A6 D3 p2 P1 P
4 n: N$ B* d0 w. }; f, I$ Q' g7 @ 8 l5 D' L+ e5 j
0 S# F+ A/ e( C9 g5 F: u& T/ I
程序代码: $ U) P9 j# k! X  g$ R& w
. ]' x7 B' ]" P% j: s/ I: U- L. }
#include<strstream>
- \- T! ~5 l- D8 l" F2 W#include<iostream>
+ S/ h9 B3 s% r6 e1 K- @7 u) _. _#include<string>6 W" ]5 s% Z  u9 C
using namespace std;
7 L( t8 G: p6 c4 z( I3 rint main(void)
1 B( ^( U; r3 T+ Y4 u{
% v" h+ ~7 K2 u$ I    string s1;
- E# }0 b0 q3 a    while(cin>>s1)
7 J) Q5 X9 u! A3 X0 W( x    {; _  _. C2 f; n" p, h$ q5 A3 U
        istrstream isin(s1.data());
4 C3 y, p* b6 n) N# `7 s        double d;
/ F; {4 @, Y- b9 S0 e5 V6 e: z        if(fy_Exp::GetExpValue(isin, d))2 m( c1 ]+ g7 b) P. @" N* g8 P! \# K
        {4 T3 f3 |% f$ O, m( Y: f9 E) C
            cout<<d<<endl;
$ h; |8 F( T" k( C, o        }0 v$ g( d* T9 i$ n% g8 ]6 k& J) L% q
        else4 {" @. C& O7 q4 u/ q
        {7 _: j( a9 w2 O1 f/ `! f  B" N# M
            cout<<"ERROR"<<endl;
) _7 T8 r& E3 ]. u! i        }! k% C. l- h- o" J+ a
    }
6 F/ ^9 j% Q' W/ b& ~6 m  C    return 0;( T! A0 S; e2 O3 n9 |) |, J
}  @) a# [( P7 u0 I7 K' T' \+ f

$ r# B; F7 s/ H: c6 j* H/ t5 k
# t8 ]; v% r9 h4 _然后编译执行就可以了(*^_^*)
% ^6 K& q- W$ |0 E* r$ I8 P其它:TC++上一定编译错误,不保证在VC6上也能通过编译5 f! o( I1 a- z1 }+ J  s/ n
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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