获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
0 o) ?. N2 q) K* c' r5 N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" S! _% X7 n6 H$ ~; X5 \8 l只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' D$ }1 v, d- I
参数解释:, e9 p. j7 G  A# ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流1 ~* _% i3 h8 [' D
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( h& Y+ B) e! L" t3 B/ A3 D8 ?+ a
返回值:
7 `: b! Z3 t7 \1 J) W7 ~返回非0表示计算成功,0表示计算失败有错误
' I1 o& l9 d2 ^; G4 X! N
* ?  ?0 ^/ Z; a
9 p) h6 S5 y. V. z
; ?; j& s. O$ b5 Z7 u! d. Y程序代码:
0 C; _2 G  L; z5 f' g+ [9 `9 j/ [
namespace fy_Exp{
) L% `0 R1 `- {, ^2 t6 F# bnamespace {template <class _T>6 E. e  z2 Q6 X$ [, g! ?) @
inline _T GetExpValue(_T t[], char& csym){
) o. u, p% M3 I6 K    char c=csym; csym=0;
5 O+ ~( V0 i4 n% u* A* h    switch(c){
, F( C. W  W" p& v- e0 h    case '+':return t[0] += t[1];
2 G) `& i+ ~6 `. V2 L+ ]    case '-':return t[0] -= t[1];- N4 o* }. j. |5 q" m  R% ~* g
    case '*':return t[0] *= t[1];3 J: H0 P5 Q. s1 Z% j  H
    default: return t[0] /= t[1];//case '/':$ @' T, f' _: v- n. m0 a9 Z
    }1 i* w, I9 b" y' [6 G& n6 l; u
}}
( U% r8 g; z* U3 Z0 \template <class _T, class _Tstream>* I0 e  @7 b% @
/* _Tstream: inputstream, _T: get return value/ U3 V+ }! i$ T
* Return nonzero if get value successfully */
6 I. }6 I3 Q& }( K) e* x/ y  Zint GetExpValue(_Tstream& istrin, _T& nReturn){% `- n6 t8 a  N* _( l
    _T t[3] = {0}; //雨中飞燕之作
" Z1 M% a. `. M. T* m7 P    char csym[3] = "++";- W2 H0 Q. K5 ^; W- W
    int nLevel = 1, nERR = 0;
% o7 _. w, e  c- v: K& P0 [    if(!(istrin>>t[1]))istrin.clear();0 t+ c0 F" `( p2 S6 D1 V1 r) B
    for(;;){
( u8 T  f! t5 M" `0 |4 b  V' {        if(istrin>>csym[2]){3 e3 |7 _8 ?# i3 Q7 ]; _
            switch(csym[2]){
4 `6 h7 k; }1 C1 X5 h            case '(':
4 d+ P- r) u9 @. ~. n                if(!csym[1]){nLevel=0x100; nERR=1;}else
# l+ E; c! V7 R) m- n                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 i2 f2 {0 c0 G. q( E# [
                else{nLevel=0x100; nERR=1;}" z  b+ q( @9 f& D
                break;
- f. o, [, P/ ^$ S! }            case ')':  @7 Z, V0 S) d9 ]. A1 v
                {nLevel = 0x100;}break;3 ~% X6 p6 H( Q7 c
            case '+':case '-':case '*':case '/':. `" K& F9 s! ~7 J" B2 P' p& z( E
                {csym[nLevel++] = csym[2];}break;1 J5 ^) Y7 P2 j/ X6 {8 K& Q
            case ' ':case '\r':case '\n':case '\t':continue;
! U0 q3 [" E7 K            default:  @) O* F6 {; @" J6 a
                {nLevel=0x100; nERR=1;}/ |: W8 j! ?5 v& {2 \; X! W) r' ]
            }
- y* r; O/ K: Z' [            if(nLevel==0x100)break;
7 Q4 Z9 q9 w* M) K: }            if(nLevel&0x10 || istrin>>t[2]){' }' ~" k! P8 ^* z7 `2 Y6 E* X( f
                nLevel &= 0xF;
  \2 ]8 m/ @4 ^                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. d; v; R  Z- |
                if(csym[1]=='*'||csym[1]=='/'){. Z' [6 v% P! P* I( m- J% T8 _
                    GetExpValue(t+1, csym[1]);. f, q, W" |2 B
                }
5 ~* V1 \# [# P                else{
7 e$ }- ^3 W& g" q  n                    GetExpValue(t, csym[0]);
; }% Q6 C- v# L                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ C# y  D9 @( P# k) F; E2 c                }
: g* I' S# U1 ?2 e9 ^' f, w) e                nLevel = 1;
4 ?0 i! M' n8 P$ y3 L/ D            }
8 @2 V5 B2 B3 r$ ~1 o            else istrin.clear();
6 X" H3 F( `7 V3 m7 y        }% [- ?: n/ n$ H- ^) x
        else{nERR = -1; break;}$ B# h& R% a  M9 ?! F: p" x" N6 a; Z
    }
+ F# Q; L4 C: f. f' C    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);, q) q( s) M: s! {# E
    else nReturn=GetExpValue(t, csym[0]);( E( Q9 |! H# `
    return nERR==-1?1:0;" y/ H; `2 D3 A8 s' x. a. A/ @
}}" \3 \& V+ i( y7 ^' ]( `/ Z) Z, I
1 U4 y9 E  u1 a: N- f" z" {

7 ~% c, T- }3 _- ~
) v# G) w& {% h3 m函数模板使用示例:
+ [6 E2 ?0 \  i2 H在以上那段代码的后面加上以下代码:
( [$ Q. V5 u- M7 I% Z0 x2 [9 O2 }1 k% O* Y$ [; `. n1 R) o. A

; B- M+ q8 m8 d5 a7 S* l4 k: v6 I4 p) R5 R, \$ n4 ?/ e( Y" R$ ^
程序代码:
/ h2 I' h) r7 m5 n
* m4 \/ N9 m5 M#include<strstream>
! ?# b: [; Y* O( t#include<iostream>3 [$ [( b0 S( t& K0 m7 Q
#include<string>
- o$ M1 X4 j; v* w' Busing namespace std;
0 B) P/ I) d* p9 n3 ^int main(void)
8 E  K) _% U7 Q' c6 }{
, U& `; |& G$ A5 S2 P; G    string s1;% j" p" o: W) C) Q1 U
    while(cin>>s1). x! C5 {( t: z# g8 X9 H
    {
# C3 K( x# H* g& r8 M        istrstream isin(s1.data());: c! w6 l5 l& b5 R
        double d;
' A9 L9 W& I3 b1 ~        if(fy_Exp::GetExpValue(isin, d))* w8 L4 }7 F/ _& @9 D
        {% n4 O4 J" Y. W! s7 X
            cout<<d<<endl;
" @. Z. i; B4 O  b3 _- o) H        }6 d* X; c6 R$ K5 S  Q7 l' o! a
        else- L. _% w. [& S' ]$ z2 e7 \6 v, X
        {
  a( Q' [7 z3 ?& \% i            cout<<"ERROR"<<endl;
% H0 e% l- N/ N) R5 F) s1 G        }$ A1 h/ x! \' l( ?3 k! y
    }9 U0 C+ M( h- d0 y( I# W
    return 0;9 s4 G- L0 G( s: R6 U' v  q
}
" _# m9 a) `/ A3 g  @! |: A; `; E, O7 h# u8 F6 L- i
7 g' `* D" m. @! b2 p( o+ v
然后编译执行就可以了(*^_^*)* C6 M2 G9 D! u3 W* P5 T
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
$ N2 s5 O+ e  t" T      建议使用VC7或VC更高版本,或者使用GNU C++编译

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