返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,0 t/ e& F& @' Q. ?& G2 [& {
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 H5 s! H  z) P  ~+ X6 Q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ {2 v$ ~2 W$ W: P  U2 b3 M参数解释:
- g, {2 e* |/ @6 W) ^istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流1 D# k6 l+ T4 c: r" a: ]
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 o5 E" W& c7 O, ^+ w: H9 N9 {/ i
返回值:
* L! h. O3 L( C返回非0表示计算成功,0表示计算失败有错误! U! {6 o- j$ }) I

4 y: O! J3 g- {/ A9 ? ( P& o/ y8 u; d; L4 }' C
9 Z6 q8 g, }0 ^$ e
程序代码:
) g; F0 C- d7 N" M' V6 g( ]
/ M9 _. l( N! j! J" {! a% enamespace fy_Exp{
# @9 H) L0 I- A( }' @3 x$ e1 [: N5 {namespace {template <class _T>
7 v8 e4 p9 c8 D6 y; `inline _T GetExpValue(_T t[], char& csym){
/ F2 e6 I: p( b! ~4 U5 g    char c=csym; csym=0;0 w3 o2 F2 p' G, B/ S: t; ]2 G; P
    switch(c){2 N6 q, P3 C# X# [; L5 D- n% D
    case '+':return t[0] += t[1];
% x& _1 R+ x0 V' C& l    case '-':return t[0] -= t[1];( p" g) I( [) ^, b1 h- b) f
    case '*':return t[0] *= t[1];
* p: V3 Q% k% D    default: return t[0] /= t[1];//case '/':1 a  e" j8 r; q+ j$ o! u
    }
- ], I! k! T% J3 Y6 f3 ^}}
9 }7 m" }# q, c& T" |; X) Ptemplate <class _T, class _Tstream>& c% }# G. r& W9 G/ J
/* _Tstream: inputstream, _T: get return value
9 S2 E/ G: Q/ ]2 \4 k& q  U2 J* Return nonzero if get value successfully */
; p$ C0 R0 _. T& ^9 Z6 B) Tint GetExpValue(_Tstream& istrin, _T& nReturn){% }% J/ y8 \4 h: X* W# |/ f
    _T t[3] = {0}; //雨中飞燕之作" j, M9 X+ B- g" U* U1 c7 A
    char csym[3] = "++";
- Y" v8 t. Q' x# b0 f    int nLevel = 1, nERR = 0;
% |5 w1 }$ J+ N& E7 c    if(!(istrin>>t[1]))istrin.clear();8 f$ T( X& x& ^8 E  B( m' N" h
    for(;;){
5 }9 i5 c) w  S$ d        if(istrin>>csym[2]){  v* b& R+ f- z3 [# U4 W
            switch(csym[2]){/ a/ T/ j+ P; x6 e
            case '(':7 d$ f8 m* I; j* O
                if(!csym[1]){nLevel=0x100; nERR=1;}else
$ _  s6 X) J; Y2 c                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 W- I: }1 P2 N- C5 e: R
                else{nLevel=0x100; nERR=1;}! s4 `% \2 F, B
                break;
0 q  ]* l" t4 @6 d# r' |            case ')':5 p: Y1 U3 M- O. s3 Z$ }$ C
                {nLevel = 0x100;}break;
/ Q4 p- z1 `0 L4 U1 w            case '+':case '-':case '*':case '/':3 ?  E' R! }9 m2 B' s  D
                {csym[nLevel++] = csym[2];}break;! X3 A# p5 n( ^6 \# N0 u5 t# i
            case ' ':case '\r':case '\n':case '\t':continue;7 R  X2 i, o+ A% B5 X
            default:
' y/ F' k  X7 n; c) d' g+ n                {nLevel=0x100; nERR=1;}* a1 W( h+ x5 M" W0 W
            }+ z& b8 ~8 Z- W% c, b1 W( P0 {
            if(nLevel==0x100)break;
  _9 _" n6 b8 ^            if(nLevel&0x10 || istrin>>t[2]){
5 d1 M( v. v0 u  m% \$ O$ I                nLevel &= 0xF;% P; h; N. X( L0 }
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 @0 I) z3 k9 k: V                if(csym[1]=='*'||csym[1]=='/'){
) Q. h7 v/ Y- t" e' x, b- L( D& |# W! X                    GetExpValue(t+1, csym[1]);  `- Z6 ~+ j% a# P: i
                }, w( |6 b& q  d$ g
                else{
; ?' @; w0 P6 U5 ]* P  m4 m5 o4 ?2 o. H$ B                    GetExpValue(t, csym[0]);& d/ m3 {! N3 E$ O
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;" O7 j" h' O; h6 Z3 S! x# `
                }/ E) V$ X7 T% S& D
                nLevel = 1;) L7 R( N; C! Y, h7 o
            }  ]& ^* x- H7 Y# F  x, W
            else istrin.clear();. |6 o: v; ]8 u+ y# m
        }1 @3 d+ h: ~' Z, _) D- W
        else{nERR = -1; break;}# ]( ~: W* i, R
    }
4 I, Y  P9 ^8 S) L9 z) q    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 Q+ n& j: `* |' d4 x6 h( q  U$ C" B: V: r
    else nReturn=GetExpValue(t, csym[0]);
" f4 \/ S6 X! p( L7 k& E% H    return nERR==-1?1:0;  E* P' W( ?. A/ A% J5 Z! r
}}3 {+ ^% d- p) }/ C

9 f; N6 y9 g  L0 @6 H+ o) x" j0 m1 \( c2 h

# q8 k! d0 [$ @2 W1 [" b4 \0 ^函数模板使用示例:
% e' e4 |" d. s1 P( G在以上那段代码的后面加上以下代码:! @3 U5 F) @" E
  ^2 v4 \' c3 a4 `3 n
; j3 j5 e  \9 f& e) q7 d$ T; _+ K( K( o

5 e) _. T5 C, v4 |程序代码: " M# k+ m2 ?) L8 l2 g: h
, m6 K( ^$ S: X2 l7 k
#include<strstream>' y7 U7 T1 K6 G8 y/ T2 |$ v" i0 z$ P
#include<iostream>
" q/ `1 P) o' x' [; C3 l#include<string>
* {; b' a$ y0 \( r! ]0 n0 ^4 Eusing namespace std;( n7 X. C- C; K: t% R3 l& D- m; G* S7 U
int main(void)$ x0 F5 D# d9 a4 _
{( I: x! y# b7 a4 Z3 h
    string s1;
" q" c( j" K. }' y/ p( q1 h    while(cin>>s1). Z- ^& H6 Q% l0 a+ ^2 R
    {
1 U3 M1 t& Z6 P. C* l# X6 ~" r6 @( L        istrstream isin(s1.data());9 M) x( R2 i( L" c: \9 }
        double d;2 M3 g! g% I2 a( |/ c% R/ ?
        if(fy_Exp::GetExpValue(isin, d))
8 ?5 ]( M5 z4 k7 J7 U7 }% g        {5 L$ n1 U5 U. |6 ]
            cout<<d<<endl;
, c/ D. J- y7 K2 A3 R. B        }
' e1 H3 [* z5 ~5 f: v        else
! [! B$ K/ J3 _; i; {6 P        {
# j! H$ K& g& `4 R8 T            cout<<"ERROR"<<endl;1 @. ?) a: D) t3 t
        }. L2 ]9 G6 |8 K, F; f$ n
    }
( N/ E, N9 P5 v& w    return 0;6 {) m& @3 [+ n- \1 k
}
+ B3 J) [9 K- v# ?# B3 d  k" p3 [8 N2 |1 s3 @* k

( k, Q7 r( y* v( }1 L& P然后编译执行就可以了(*^_^*)
0 w$ `6 T; B" P% i- ]- P! y: [其它:TC++上一定编译错误,不保证在VC6上也能通过编译% R1 ?# a9 Y- Y# H) _, O* Q6 V7 T
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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