返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,( e: D- {8 H: a4 `
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
2 V% I5 d$ n( b. M- u- ^1 \只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)6 X4 E7 U/ t- k
参数解释:
# W- ^4 ^- A# a. b9 U% Histrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
4 ]. {8 ?% ^" G& R6 J3 m9 d5 t  y) KnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定- W4 Q1 `. T7 v5 c
返回值:
  T' ]4 a6 C; O+ d) S! z! _返回非0表示计算成功,0表示计算失败有错误" L+ u/ b6 W3 e& f  y$ X" Q) ?# i

* y9 i: ]/ T6 n/ k7 @2 W. ] # `: S0 Z6 ]1 V0 `# l2 \6 P0 @

4 v2 D- I' b4 a9 e程序代码:
/ v9 x3 ]" d9 S0 K6 S5 d2 z+ k0 g8 V$ E' Z1 \5 v
namespace fy_Exp{
! |, h. m* Z/ f: X% D: Enamespace {template <class _T>
+ R' ~% d. B5 S# x; m& Qinline _T GetExpValue(_T t[], char& csym){! l+ a, I. Z1 x1 y" r6 k& s1 m
    char c=csym; csym=0;5 A7 g8 k4 G. E- q" c
    switch(c){! m! Y) V2 k# x; S3 A$ T
    case '+':return t[0] += t[1];1 D& H/ N4 D3 z* W. |
    case '-':return t[0] -= t[1];4 N& |% H: L% z9 E: n1 r0 r
    case '*':return t[0] *= t[1];9 }& b) P! d  |0 j/ q% |
    default: return t[0] /= t[1];//case '/':& ]" s1 P* {5 V# N2 j; X/ A; Q
    }+ R1 |2 V6 I$ {$ \3 P& O1 |5 P4 s
}}( ]) T8 Z) g8 q
template <class _T, class _Tstream>: B/ K: w2 h4 G4 e+ t
/* _Tstream: inputstream, _T: get return value( G. h9 d# ]7 ^# A
* Return nonzero if get value successfully */
" o% o1 x' \' l/ n# {7 j9 G9 Pint GetExpValue(_Tstream& istrin, _T& nReturn){4 `$ Y' [2 U) l/ Z9 M8 e
    _T t[3] = {0}; //雨中飞燕之作2 C3 J5 x- K" I$ m! F: O
    char csym[3] = "++";
& Z- E8 `  u* U; U# ]9 l    int nLevel = 1, nERR = 0;2 O  o. y$ ?/ m1 l0 c( F
    if(!(istrin>>t[1]))istrin.clear();
( z# C0 V4 l: `* C( r' c3 P" \( B2 d* G    for(;;){
& Q- q9 r, e* ~' K* E' Q' ^        if(istrin>>csym[2]){0 S5 T7 A5 R* z* d: a
            switch(csym[2]){
- v! x+ w; y' R8 `4 X( k/ J            case '(':
! _8 u# H1 F0 W% e                if(!csym[1]){nLevel=0x100; nERR=1;}else7 l, i7 Z9 o8 U4 l' P7 Y  g8 q
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 U  q0 y4 g: K# M& g9 G) y/ X
                else{nLevel=0x100; nERR=1;}" ]" m1 j8 u$ e. A3 v' X
                break;
; t! i' d1 F7 C5 j, O3 D) W: |            case ')':$ d6 p) K0 W1 R" {& j
                {nLevel = 0x100;}break;% P9 k# |. K* c8 n
            case '+':case '-':case '*':case '/':
" z2 f7 `  Q* u8 D& J                {csym[nLevel++] = csym[2];}break;
, I# r! c5 @4 A' I            case ' ':case '\r':case '\n':case '\t':continue;
& p( L3 v5 T8 i2 a3 c            default:2 o/ h/ J( D5 q. _4 O
                {nLevel=0x100; nERR=1;}
1 n" p: f( `* B3 g7 I9 {            }
6 W  ]$ _" C) m. O0 H* k            if(nLevel==0x100)break;$ a' v3 S4 a1 a2 O2 L8 M
            if(nLevel&0x10 || istrin>>t[2]){& I! c% Z( e: p
                nLevel &= 0xF;6 I! i; O7 S% k# z4 n: N
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& w; y3 g& n  |. T, u0 K' N
                if(csym[1]=='*'||csym[1]=='/'){* G+ X0 s* L  P1 h% }
                    GetExpValue(t+1, csym[1]);
% S" j% G) n/ D" ~( Q! y                }% a2 o4 K/ I* `: D. r# ]* v
                else{9 j- w3 I( g- d3 |  Z* _
                    GetExpValue(t, csym[0]);
5 a4 G! m# e5 g                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
( i/ ~8 `3 }; e$ N& o1 ]9 l                }4 i% b9 O, H& z' I% p; }; ~
                nLevel = 1;, w, J- i; j7 H% s) X* x' E4 W5 a1 s
            }% o$ F& B! Q6 Q1 S" p7 _( G7 p, l
            else istrin.clear();
& f& f& A4 H2 F! X! {        }; ?9 {4 i' A- o% h4 r7 G
        else{nERR = -1; break;}' P( e& C6 F( l" I1 B
    }
) J. \! |4 J( H6 T3 D4 [5 o    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
  F5 q/ ]$ {* r' T+ z! v+ I    else nReturn=GetExpValue(t, csym[0]);7 d0 A2 ^2 B8 ~8 j) Y- i
    return nERR==-1?1:0;5 {0 U6 S( {7 N$ e& w/ ~% h% A
}}
0 x* x9 T& i" u1 J, @6 }% v/ g
" ^3 p; A; `7 q& T* R9 ~, u8 X  X( I$ W5 K
! A3 g! ~% h  u3 o
函数模板使用示例:
# N( m9 A5 ^" V/ \在以上那段代码的后面加上以下代码:
' o& C5 w6 r* g8 v1 E. G3 G' J3 i  N! s' E$ e8 h8 K, T% M2 C& e
  [1 `) ^) ~7 |) O

. \; o" w; w8 @4 \$ {4 x程序代码:
+ A# H4 {9 ?$ V. T
. f  X9 ~, J9 ?6 T4 M#include<strstream>! v' C) r+ n; i; U$ \' J% Y& Y
#include<iostream>
. `, T# p% \" j& a/ R/ }#include<string>
; E# q: A* @2 v* Vusing namespace std;/ b& j* z( z( I% u
int main(void)
8 q5 j! {# |0 O5 z# S( a{
# J( b0 J9 X' i5 j" O/ P: U1 T2 ?    string s1;6 S$ }; S7 [% A5 G1 G8 |
    while(cin>>s1)
% c& B% [; x: o  q0 Z    {% p6 o. e( a7 N8 h( T3 @- q7 x+ C
        istrstream isin(s1.data());
# _/ s. u) p2 m2 t! |9 h        double d;
6 }* @6 m+ _$ {6 U" V        if(fy_Exp::GetExpValue(isin, d))4 o7 ~; q; N' n% c$ p
        {
7 Y9 e4 u' c' ?3 W. Y: {# ^8 b            cout<<d<<endl;
, U! z( N4 P  m+ D( p. {        }$ `2 F: k3 J( q  ~# r+ H
        else
0 Y& L+ V2 F9 h" Y        {, q) z5 [5 @# o( `, d
            cout<<"ERROR"<<endl;
9 J% }! O- A* l8 m" \        }
2 a6 R9 S6 f1 v    }' x6 v: m6 W% j  B* Q- u4 l
    return 0;
( O# O# i, W- F- T3 ?}
2 W; B( V* x4 {9 k
- C; y) ^  S  D% J' M; U' Q- s6 `* k( c) i) r& p1 [: y
然后编译执行就可以了(*^_^*)7 r/ v: S& O, E7 ^3 }
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
9 I! r" ^" Y  S" L* p6 g1 ]      建议使用VC7或VC更高版本,或者使用GNU C++编译

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