返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,- Q- H2 e2 ^! S% m& g
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式/ E- M. B9 z5 ]1 f/ j7 a; i
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) Y5 Q7 Q' `, V参数解释:/ h& B0 C, U7 a: D; d9 U2 ~
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 j2 J) t( e( ~& U& P* O. i& OnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( a* V: s2 e9 _
返回值:* a* R, j1 D1 ~9 K3 v" E! I! N+ Z
返回非0表示计算成功,0表示计算失败有错误# P" r; }( q( _; N7 H4 ?

# M1 U# q; X* K, ^6 I - @" g+ m2 m" `1 k0 K% W9 p1 L
! h3 R! O* }8 f' Y, A2 u
程序代码:
4 Z# Q, _4 N* A* C' F' b# W6 x/ P. R  @" @
namespace fy_Exp{
- [2 P! I+ |* i$ Z9 L* H9 l" snamespace {template <class _T>5 m! q7 b. h3 ^0 R7 f( Y
inline _T GetExpValue(_T t[], char& csym){) H% ~9 L/ i; u  Y4 ~
    char c=csym; csym=0;
( K, i9 J5 z' [- P4 }6 ?2 m    switch(c){( F  ^3 L/ l; T4 r+ u  W
    case '+':return t[0] += t[1];) }+ b( X3 W' J" r8 |5 M
    case '-':return t[0] -= t[1];, [* y, b% j9 f. ^
    case '*':return t[0] *= t[1];/ @7 P8 l& W  d% {. C& Y* g7 B
    default: return t[0] /= t[1];//case '/':4 R, u$ e$ X: V! b5 {
    }
; T/ x" o9 \6 f- L+ e}}6 t/ F) b( w% S$ J% f* l' _
template <class _T, class _Tstream>
3 {+ z' b6 o& M+ B$ F" t2 q/* _Tstream: inputstream, _T: get return value3 ^+ j, X3 H' Q; G% w% ]9 P. G
* Return nonzero if get value successfully */
7 x: r7 @% _# D; ~! V: mint GetExpValue(_Tstream& istrin, _T& nReturn){# @& w+ M) I+ |
    _T t[3] = {0}; //雨中飞燕之作
% o: F& u5 I/ h6 O2 o% L    char csym[3] = "++";. O% n% l, _) Y# J4 Q: z$ h7 F3 a
    int nLevel = 1, nERR = 0;
( o! j5 B& J% w( @$ Z  ]$ t    if(!(istrin>>t[1]))istrin.clear();, e' d; @& \; C
    for(;;){
; n0 A8 o5 n4 i& K$ `        if(istrin>>csym[2]){9 f7 t7 A% i$ t. M0 m
            switch(csym[2]){
  E2 a4 A+ V5 W            case '(':
# \# ]% L5 j/ b$ I5 V* F                if(!csym[1]){nLevel=0x100; nERR=1;}else
' m# ]* l' r/ \% u                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ b* k$ Q  N3 s- }4 l                else{nLevel=0x100; nERR=1;}  {2 l& V6 _: m. |. y, \/ x
                break;/ d4 @" l3 @' o" B
            case ')':- l3 ]7 k3 B0 ]# D6 I
                {nLevel = 0x100;}break;( A% t$ R1 a. u  i. g' d0 c3 Z8 t9 R: i# h
            case '+':case '-':case '*':case '/':1 ]5 A0 l. }- v  r
                {csym[nLevel++] = csym[2];}break;
( @- ?% o" u4 I4 ?" \  d            case ' ':case '\r':case '\n':case '\t':continue;
) y( _( Q1 f7 p9 k8 P            default:
) R2 W" u6 c* J8 a                {nLevel=0x100; nERR=1;}! T7 M7 w* f" D! ?0 d
            }  n2 M% f7 f4 f2 B/ f+ X  `( S
            if(nLevel==0x100)break;; o$ _) b; }0 J2 _# x- v
            if(nLevel&0x10 || istrin>>t[2]){1 d# x- W0 i5 q& v
                nLevel &= 0xF;' z- o; Z3 A$ b8 a- ~9 ~$ K
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}+ p" E) w- X6 O/ U
                if(csym[1]=='*'||csym[1]=='/'){
& D- b- l" Y+ Q0 k. @( X6 m                    GetExpValue(t+1, csym[1]);3 E- n) B/ s1 G3 B
                }1 G% b- ~' [/ c; Y" m1 t
                else{
, ^& T9 T5 O+ i( J  V( R( U+ I# M+ @                    GetExpValue(t, csym[0]);! w8 g- f: a7 f) d- y# H6 x
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 T# E, B  ]8 w6 v' R' o, I
                }' n9 G# n0 R# l
                nLevel = 1;  J/ p* P8 x* `3 j; Y( t
            }: o/ W) @2 p8 F; [8 H; W$ B
            else istrin.clear();# h; l2 [' c! o2 M% A5 |0 }
        }& K3 n" |3 j& q4 M6 K, Z
        else{nERR = -1; break;}! R! V& }  D- T" \# n; R& B
    }
4 _( b+ j! h2 T( d    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
% w9 e; L" P/ M# b& m7 J    else nReturn=GetExpValue(t, csym[0]);
# P$ s! \) K3 ^* t& a$ n7 [    return nERR==-1?1:0;/ W: r+ f/ t0 Y7 J/ c4 |
}}& U# l% B; ]$ @& W9 H

, r% ~1 ~  [# d3 R
. t3 s4 Q0 w, d; B4 V' F$ u+ }3 o
函数模板使用示例:( i. f$ n* i6 n0 P" Z/ a
在以上那段代码的后面加上以下代码:- j0 R( K  k0 I, W8 t$ ]9 q

( ^6 _# G* c: I- H( @
) |" c! p) v0 `
" F, d/ m7 k0 W& a, K( o8 {程序代码: 2 |( u6 [0 ^4 V- c  Y

0 o% {+ d, ~0 l9 r#include<strstream>
; U3 c) v8 i7 g4 `#include<iostream>1 }1 f) @0 s: t% G
#include<string>  |" R- ~# \% K' A3 _
using namespace std;/ n/ p, o" O7 j' G" _$ e% V" W+ e
int main(void)
! J+ z6 r. ]4 I( F/ V9 c{( y; f( n! h! g0 z
    string s1;
' u% ?9 `' B: Q6 W* }    while(cin>>s1)
& Q; T( T9 a0 S    {
$ O8 D' H. a. i        istrstream isin(s1.data());
' S6 g4 ^/ j* Z7 G; n) r) y* y        double d;! ^5 M& I7 m0 P+ `' {
        if(fy_Exp::GetExpValue(isin, d))0 ^. s. s% [% E" u  h1 Y8 w# h$ h
        {
2 ]% n8 d. g) Q            cout<<d<<endl;
) ]0 D) r0 r% j        }1 D% T% M% }0 H$ Y' B$ R8 w+ g
        else
0 Y) M% D( d0 B" u7 N9 |        {( D7 l2 w& F! O+ |( x9 O$ l$ t
            cout<<"ERROR"<<endl;0 {2 X! V3 _& F. O
        }
( S1 K3 F/ @6 g7 s& x    }
( [1 t2 z/ h: U    return 0;
0 P- Q: o: G) I% `7 y4 J& z/ [}6 A: r9 D) l1 E! B
; E# l  `# N! t4 g2 l1 Q- D

4 L; |5 J- u: I然后编译执行就可以了(*^_^*)3 h4 j& x4 S* r! F
其它:TC++上一定编译错误,不保证在VC6上也能通过编译# n- `& T5 H4 K& f/ I7 b9 f
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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