返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,6 m7 Z' r4 [- e/ s+ z, ^* H
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) l, z/ r8 K7 ?- {$ v+ E4 v
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- M( }/ V. a4 O+ A) o/ C参数解释:
+ C" \1 [* G4 b" }/ h0 ~( u$ tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流, j. ~" a5 s& L' l# ?* h6 s
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
  l) c5 d/ ^- t; r0 L- J返回值:
2 g  q" D, h7 \2 V6 q返回非0表示计算成功,0表示计算失败有错误
$ w+ h% Q, k2 _: @% `- m8 y  L5 }( t! b" N5 O! |* \

; O( h( Q& ]9 K0 f& x- ~
# P8 ]* q/ h) S# M" t' F程序代码:
# A4 j/ T; F+ Z; N: g: r
& R8 q# u- A4 }namespace fy_Exp{
) G  B# {" X$ @% G- N' D7 }! `namespace {template <class _T>
* B, n: Q; m: C  A! Z. Zinline _T GetExpValue(_T t[], char& csym){
2 o# ?# S" V6 X    char c=csym; csym=0;. U4 r6 ]' W, G- R# d$ l$ u' T
    switch(c){8 R2 v1 I  V2 j! \
    case '+':return t[0] += t[1];
$ e* U2 n4 t; \; ?( Q' a- J    case '-':return t[0] -= t[1];
$ g5 |2 G/ U+ x1 @    case '*':return t[0] *= t[1];
1 N) q8 a. \. a) n" O! A8 G9 l+ n    default: return t[0] /= t[1];//case '/':
, U+ ^" M: E* F. m" Z3 X: d! r    }& ]$ s1 a$ w* j& ]+ ^+ y% w2 _% c
}}3 R0 [5 s' L  m, x/ K# h9 p: R' s$ O
template <class _T, class _Tstream>7 Y. u' `$ P/ C$ V6 B' r- g
/* _Tstream: inputstream, _T: get return value
# f# B$ K6 F, O7 M* Return nonzero if get value successfully */! |" V% |$ E" t, }6 U
int GetExpValue(_Tstream& istrin, _T& nReturn){
0 k# l: s9 l, m    _T t[3] = {0}; //雨中飞燕之作
6 N8 x2 w* o5 g0 i7 b1 l$ J3 G    char csym[3] = "++";
9 f1 Z1 B4 u% G0 t9 b6 C    int nLevel = 1, nERR = 0;- _% @3 x0 ]0 _1 S' [9 d
    if(!(istrin>>t[1]))istrin.clear();% _  q$ a: w3 x2 h$ A8 d
    for(;;){
5 {. W: z. d7 a. o, @/ y( L        if(istrin>>csym[2]){& t3 H- ^3 u5 t* Y$ f( k
            switch(csym[2]){4 m$ Q, U1 `4 a( O1 C
            case '(':+ |: I. {0 J  [% ~0 o: k
                if(!csym[1]){nLevel=0x100; nERR=1;}else$ k3 B# s: j& p8 h) S( k+ E4 u
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: E1 I, R# e7 P% ]* e
                else{nLevel=0x100; nERR=1;}
' y% i: \5 @9 G$ `/ i, D' z                break;& E( y  H5 L8 h6 i1 ]) ~
            case ')':
7 C. y9 F$ G  @# R( X- G2 N                {nLevel = 0x100;}break;
3 @( I1 n% l/ @' O6 K$ s8 o7 P            case '+':case '-':case '*':case '/':
3 }$ B6 Q5 }6 ~4 o( X                {csym[nLevel++] = csym[2];}break;
. p7 o2 m7 @: c- j3 C            case ' ':case '\r':case '\n':case '\t':continue;
8 p: B  l: ?+ X1 ?            default:
. o( c$ _( c  ]" Y( j) P                {nLevel=0x100; nERR=1;}# ?( i( @3 `2 E. z5 A+ g* F% ]
            }" l% T/ X$ b, D
            if(nLevel==0x100)break;. X) {6 r# z' S9 I" u
            if(nLevel&0x10 || istrin>>t[2]){
8 V; t7 M+ r3 {$ V7 j) }+ M                nLevel &= 0xF;; p0 w' G1 [9 o& o2 W
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 a" T1 v6 d9 o7 a3 h
                if(csym[1]=='*'||csym[1]=='/'){
" H; B4 H$ R# f) m                    GetExpValue(t+1, csym[1]);" X% |- r" m: @' w; ?' L
                }; }3 e, Q- A9 K# X8 E
                else{% y& K  ]6 P& k+ k+ K* @
                    GetExpValue(t, csym[0]);3 T6 l3 d+ U7 L
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;  L2 p: n* J7 _+ B
                }
6 Y. K' Q% x7 U* F/ o# ~                nLevel = 1;+ e& W! E  h  G" m4 Y* q" B
            }4 ^( a2 V$ L% g; j4 q- J- K" m
            else istrin.clear();
) k9 Y' B! }+ f: z2 L9 F/ b" W        }( a/ u# y& w( `5 J5 k4 n
        else{nERR = -1; break;}
% b0 ?' |8 Z/ C3 _- B    }6 A4 J# P, d' R# j) ]
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 G  n7 _- N" t# C
    else nReturn=GetExpValue(t, csym[0]);
; |! o5 c" j' @0 l# F3 ~    return nERR==-1?1:0;# k0 ?! {$ d3 X* _: C
}}
6 [+ r' j; ~2 s
  v2 \* a6 O, R1 y, J7 h  V4 d- ^$ w, G+ {0 V0 C9 Q" X, i' I

/ k2 z1 B7 X9 b/ E1 W/ [# E% o函数模板使用示例:. ~0 x" s6 I  I3 t
在以上那段代码的后面加上以下代码:
/ {; Y) D8 P, Z/ u3 Q$ o0 [3 d9 m+ s- E4 o8 \$ C0 s/ p

9 {' H2 T- s; c
+ a5 I" f2 u7 o" I8 M/ g, n3 F程序代码: # P; b# _7 J9 X# x1 q  H
4 x' v! u' f( T3 W1 A
#include<strstream>$ }; q+ t" M8 n6 e4 j( B; w
#include<iostream>
4 [$ v% n! [5 a( j#include<string>; x+ @& n. E/ e% K
using namespace std;
- h7 v5 [3 O' ]5 Z3 {int main(void)3 s: r# R0 Y* R1 J+ m
{5 p6 [1 |+ |2 c: O1 g% S: X* Z
    string s1;
; T  Y/ l+ Z4 Q3 m, p( d1 P    while(cin>>s1)
$ _+ f$ v$ c& p& w1 a1 e0 h/ v    {+ L" _8 v- w: N, j1 h! O. c$ L
        istrstream isin(s1.data());
) v# y) y& j2 H/ E* m        double d;
8 G4 V* O0 T0 ~) `9 _/ W        if(fy_Exp::GetExpValue(isin, d))
$ h7 ?4 E: i% L' Z2 r5 A, A5 Z6 m        {" K6 |6 {; P* Q% ?% F
            cout<<d<<endl;6 d9 w' K& @$ ^" d6 J1 `' G9 Y
        }
& T3 L8 ~# z7 l        else. Y; ?# R6 x& {6 {9 m- O* L
        {
: L- U, {  K, T! o& U            cout<<"ERROR"<<endl;
( M8 N2 y) U; J9 h        }, h9 f5 ?+ T& |8 @
    }2 _2 [" `8 E( ?8 t1 u9 C; p! u) v
    return 0;* _6 V) k/ r% e8 j# b  P
}
' m, K8 W6 ]5 }5 y' b! P9 n- s9 D' Q: K/ b' k9 A. }- \! w  H
8 y9 G: z( R- v6 |  W: z4 m
然后编译执行就可以了(*^_^*)
3 u+ j( H5 q) X0 D其它:TC++上一定编译错误,不保证在VC6上也能通过编译- X8 l4 ]3 d8 d" c
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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