返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,* n+ L8 x& R; q; J# C" h
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' i3 C1 [0 X7 o0 r) w3 O; q/ E
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
2 p2 [+ m. j3 D+ W参数解释:+ F9 e1 b$ A$ `+ V: y- `
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流  A4 s2 ?: j( {- R+ j& h
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
6 q6 A; D9 V7 A% M1 \- z返回值:! o5 ?3 g  u1 ~4 W4 Y* |* @4 f
返回非0表示计算成功,0表示计算失败有错误
6 ?" k7 m" b, q3 T/ S1 Z' G
+ i) C& [' k" c3 M8 V, ^( O 6 y5 V; R. e; e& k+ K. m

1 T8 h) V3 t, N8 H; W# w程序代码: " C. f' A; Z0 L+ z0 l* q

0 @: `% }  Q/ C7 }% V' Fnamespace fy_Exp{
, K" r1 \) o# @! B4 M: q( Gnamespace {template <class _T>
* x& N" U; x  H, P+ ~inline _T GetExpValue(_T t[], char& csym){- H7 t7 ]' F, A' O2 v0 c
    char c=csym; csym=0;. [1 M/ U% v% M% v
    switch(c){
( W& d4 h- H! `9 X    case '+':return t[0] += t[1];2 V7 z- |. v- n: n
    case '-':return t[0] -= t[1];
- _1 r2 @0 H' C3 [" B+ D* [5 g: E    case '*':return t[0] *= t[1];
+ m  C. t$ i- G, K    default: return t[0] /= t[1];//case '/':
3 [; t3 _+ K6 c' @- |; d    }8 t" V6 m3 |/ \6 B8 V
}}+ P$ N: E$ [$ H( G- ^( U6 ]) v) D5 Y
template <class _T, class _Tstream>
' [% H' U2 e+ c3 L/* _Tstream: inputstream, _T: get return value
9 L' k" x+ N* ?: I% a5 D2 v( n& g/ a* Return nonzero if get value successfully */
7 T3 D) f3 S( Vint GetExpValue(_Tstream& istrin, _T& nReturn){5 M% u/ ]4 |8 b+ F  E
    _T t[3] = {0}; //雨中飞燕之作
6 K+ d  z$ @& ~    char csym[3] = "++";
6 U+ k5 d4 Z8 C4 S) M    int nLevel = 1, nERR = 0;& c& u( {. M! y, G/ @% o
    if(!(istrin>>t[1]))istrin.clear();$ t' v' C! s7 m  ~& b# B
    for(;;){$ C1 |/ S- k$ z" Z& N7 l8 c' n
        if(istrin>>csym[2]){
  |" G- M' j  h            switch(csym[2]){+ b1 b" x/ Z" m
            case '(':
4 O1 E; I, \6 O& m+ g2 E# ?                if(!csym[1]){nLevel=0x100; nERR=1;}else5 G9 w; ]4 F! E" |9 m) `8 S
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% w3 d7 ?$ Y2 L7 m( i+ q7 k# m0 Y
                else{nLevel=0x100; nERR=1;}* i7 o6 T9 ^$ G% Y
                break;
$ u+ _4 f$ m; r/ d            case ')':" |0 N% J; {) N& u$ @' b0 r3 J% P
                {nLevel = 0x100;}break;* I; Q& w5 u' w. m' V2 B
            case '+':case '-':case '*':case '/':
! _3 C6 @( Z- b1 I/ H                {csym[nLevel++] = csym[2];}break;% g- J# Q' h) C! S/ W
            case ' ':case '\r':case '\n':case '\t':continue;/ u! @* R7 T4 R
            default:& s2 g$ Z5 j/ v
                {nLevel=0x100; nERR=1;}
& U' Q5 i0 E1 K" u* j; c            }+ F1 P$ p; c/ L
            if(nLevel==0x100)break;. C- d: ?, _8 T% R; K, \2 L
            if(nLevel&0x10 || istrin>>t[2]){
' Q( s. H: m2 N  S2 s                nLevel &= 0xF;
7 _8 Q( Q2 y7 H4 `, }                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" x& _' \9 [+ e7 m( R+ k7 p                if(csym[1]=='*'||csym[1]=='/'){
% G$ l2 s: W, C  ?                    GetExpValue(t+1, csym[1]);
/ p& G4 `8 s- A3 k" q                }
- y! J* J  a; h; @  G# ~                else{# L9 q+ g! \& l0 r+ j; a3 W
                    GetExpValue(t, csym[0]);
; N- [$ j+ [/ |                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;! {4 k* f0 T6 r3 p  B, O
                }- m. I3 J& q; p- p
                nLevel = 1;! p1 N/ H" l7 f
            }
) ?* g+ K: ^- z" G2 O8 Z$ P            else istrin.clear();
8 B  I- ^2 X$ |6 e- v        }
- A' |, g$ c  M; d5 Y        else{nERR = -1; break;}
0 P) j& O  L/ {7 B# W6 b2 [5 ?    }
( F" d; }! ~+ B    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);# \. k+ w0 a: y
    else nReturn=GetExpValue(t, csym[0]);
" s5 k, _6 K/ Z* ], u5 H    return nERR==-1?1:0;
& v9 |" P. }3 p) X, g8 i/ i0 S}}
1 y$ J2 t6 Z3 e. |$ Q6 s8 E6 _1 r( J9 Z" S1 h

' T7 t" g! t# p% E
2 U1 X! A+ k# `  F" l6 J% v3 y函数模板使用示例:
  h- k' ]! X( F4 d( }在以上那段代码的后面加上以下代码:- k: k8 Q3 i& Y$ q. ?

- n, m' r% p8 I. q / c) e4 N+ s1 v2 M5 r$ S9 l
' Z8 P6 w: W+ i  q
程序代码: 8 m# F# n$ k( J9 k2 _/ }
: [! O; l3 t6 ?& v' Z
#include<strstream>
0 D. A8 S) I% `3 D  K. Q# z#include<iostream>& R8 G$ o0 e; L6 W3 {
#include<string>2 h8 n0 Y; w8 K
using namespace std;3 y. m+ W+ R" I) O8 P7 v
int main(void)
1 |# D6 l7 b$ s/ N- r{
4 x* ~7 c' ?: N    string s1;
( F) f  O$ H, \( b6 v; I    while(cin>>s1)
7 L  l) n8 ], h6 E! i. M4 u  n    {0 ?( R8 v5 d) ]
        istrstream isin(s1.data());
0 X0 c7 S8 G  g3 V6 v9 J        double d;- Y) Q# C* |  q# |
        if(fy_Exp::GetExpValue(isin, d))
  A# C, L0 L+ {% v) J: Y3 }        {
4 R' H2 ~* y/ w+ s            cout<<d<<endl;
2 R5 M6 z: I2 P2 |        }
) f+ Y9 Q1 a* M0 l- ~! h        else, p0 h. k9 y( ?
        {
! s' {* s: z- k7 n& Z2 J" ~" ~" P            cout<<"ERROR"<<endl;1 e1 N4 q" C6 m; }8 m7 q; M& s
        }
) V9 |9 `4 x2 I5 @% p  f8 N. S5 o    }( D' f5 q) @% Y7 E. B* N8 ]' J( z
    return 0;; p) q: t/ U) G7 ~' e7 V
}) D: h0 R5 F' V; Z
" e* V" M) f5 {0 |  \4 E

9 u1 E% N- O4 ?1 v+ Z. V然后编译执行就可以了(*^_^*)
0 H9 g& j- Q$ t% N3 C2 s其它:TC++上一定编译错误,不保证在VC6上也能通过编译! k1 M0 @: O: l- B0 N2 L3 Y
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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