返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,$ x# Q) G. T2 o8 k' j
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ Y. n2 o; I# e6 s; B! y只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
, w3 j1 G5 m: e& a+ g- U2 T参数解释:5 L: |* q7 M6 X& R: y% o
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 q: A; p$ ^5 U$ `nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 Z* X6 E6 t9 w9 v+ y1 z; o
返回值:) n$ }' Y$ ?, W: C& D5 G
返回非0表示计算成功,0表示计算失败有错误
5 N4 H# c! T" H2 k3 t7 y# [$ i9 h6 s7 z3 ?9 U# g% H! w
( E7 [7 `$ ]% K. ]8 o. t+ H
% c# L  q6 k, r1 n: [; d) v8 x: P
程序代码: 6 _/ T5 t0 I! K3 l6 y
5 V9 _; L" d( G! A5 s
namespace fy_Exp{) _; W) ]* ^0 w! j) w
namespace {template <class _T>- b$ @" e- }7 Y; V6 T* u* c; x' t
inline _T GetExpValue(_T t[], char& csym){3 e2 n% B) `7 E- G+ c! A
    char c=csym; csym=0;! V5 x0 w9 Q7 {: h! \/ n
    switch(c){' T3 u& X8 N( V
    case '+':return t[0] += t[1];: [+ F5 \* R5 _5 I9 L
    case '-':return t[0] -= t[1];
2 v6 ~' i2 y5 W" o9 n    case '*':return t[0] *= t[1];3 v7 [7 I0 @! M% P
    default: return t[0] /= t[1];//case '/':
- e$ r; u/ e" _3 S! U( `' E, A    }: C; P. W! W9 l/ {7 ~/ z7 R: I# i4 t
}}
" @: v1 G9 S% y# x3 ^0 i! ktemplate <class _T, class _Tstream>) G; v2 t3 `) P
/* _Tstream: inputstream, _T: get return value
7 E. G) d0 ]- X( `! A" |* Return nonzero if get value successfully */: R9 x4 X2 g8 ]+ d9 \) R
int GetExpValue(_Tstream& istrin, _T& nReturn){2 t8 q* H* _# I1 K( |
    _T t[3] = {0}; //雨中飞燕之作* k6 W. u5 J5 H* W9 k
    char csym[3] = "++";
* f8 P' A% t/ U7 R3 J, c/ r    int nLevel = 1, nERR = 0;
( Z) F; G2 v# R1 U    if(!(istrin>>t[1]))istrin.clear();* E8 o8 w+ ]/ Z( E2 b1 n, {7 e! k
    for(;;){
9 T+ ~; g/ a- X! O+ [        if(istrin>>csym[2]){
* _* S( _' v/ a4 l8 ~# v8 l) g            switch(csym[2]){* x* S, q6 o: E! i, |* F4 v
            case '(':. h2 {* Z! J. L! M' e
                if(!csym[1]){nLevel=0x100; nERR=1;}else
6 e& n1 k3 w. I& e                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;+ }$ Q; s) r) @" {0 m
                else{nLevel=0x100; nERR=1;}/ Z; H) D3 t* h$ y6 h! f
                break;
& _/ h8 Z! @) F            case ')':
) X: q9 @2 q* J2 H1 ]4 r# U5 v                {nLevel = 0x100;}break;# y# Z! B8 F  J+ y& k# n9 Q4 z& u
            case '+':case '-':case '*':case '/':
/ w2 w/ D0 F7 s7 Z                {csym[nLevel++] = csym[2];}break;/ R3 j" i3 \* R$ k8 T) R
            case ' ':case '\r':case '\n':case '\t':continue;
, j: q& w  q0 t& h3 s* e" I) R            default:
+ j2 L3 e  V/ T# @# p                {nLevel=0x100; nERR=1;}/ A0 o5 _* z& b+ O3 }! m  c
            }
( O' }' r* \/ m& ]            if(nLevel==0x100)break;3 U+ c) V; z- i8 k
            if(nLevel&0x10 || istrin>>t[2]){
9 f. b  V+ U8 W& _+ B                nLevel &= 0xF;# t  X6 g9 l; u4 `
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! n3 ~2 q; ~2 y6 B                if(csym[1]=='*'||csym[1]=='/'){: v! ^3 A; E: U4 q( T
                    GetExpValue(t+1, csym[1]);( }- W6 {$ u6 y$ i+ r
                }
' M& N) e6 D! o5 ~) ~7 ^6 x                else{( J7 t4 Y6 x. S! N5 c, o5 p8 u
                    GetExpValue(t, csym[0]);
7 }' E% s- L' I& y9 d$ e8 i9 Q$ ~                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;) k# R+ h& z  A: w5 d
                }1 t. ?* ]4 [, k3 [" ^5 ~
                nLevel = 1;# v% T# t0 n; e1 ^# \+ U# s& }& \
            }+ T( |0 ^9 `8 t
            else istrin.clear();
/ J3 N8 _! V* U6 {  n% z        }
9 W9 N& C6 F7 `. h& ^) `4 o        else{nERR = -1; break;}
( R  S  A8 i8 L, B4 L5 o    }
, {4 }5 k0 p, S" V, V! U* c    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 T+ }, i8 [* W  j4 a
    else nReturn=GetExpValue(t, csym[0]);
( c4 F7 z3 G: M; v    return nERR==-1?1:0;
. M2 D* `5 P2 J, H}}: {) [! c* x! s5 m  I  h8 m2 t9 Q
4 N3 q7 @1 P: [, B! n9 j7 K0 e
0 k, z( G8 j: t! b" L* X
! E# O+ ~$ B* L# Z
函数模板使用示例:( V6 q9 F( U6 J, d1 k
在以上那段代码的后面加上以下代码:  N1 ]- e( Q  I! c
4 Q6 `/ }4 e$ g/ n
  m4 X; S$ C5 z, @& ?- c

  `3 Z6 H' \& N% E- Y程序代码: 0 v0 e5 e: H5 [

# K3 n2 O) z8 ~  i4 m9 [#include<strstream>0 `4 N. r1 n4 C& H( v
#include<iostream>
( a; N) t" J9 g6 i#include<string>
0 h7 J& G" \2 Uusing namespace std;3 q$ R+ t4 b) ~% B" O
int main(void)
8 T6 n4 F% w9 V2 h* S" u" U{( r( E) @9 M+ W  Z
    string s1;
6 f+ k, D* a$ N    while(cin>>s1)
5 _. J+ F7 W5 Z( \) z    {
+ Q/ U) Y1 ^- j  u8 }5 U# X: o        istrstream isin(s1.data());
6 _! A1 V$ Y* T0 t2 X2 ^        double d;
6 ~9 T4 x" b4 O4 d( y' X        if(fy_Exp::GetExpValue(isin, d))7 m, m# Y: z2 B! |
        {% ]$ G# E! G) [
            cout<<d<<endl;
1 L: {' V* I/ S5 y( d  D        }, j0 W: Y5 g/ V& e  P1 n! E
        else
1 O( V/ c( K) o5 a2 {3 g        {6 c/ e4 S2 N; N2 F
            cout<<"ERROR"<<endl;. d& ^  o7 y3 ?3 S; ]! T! T
        }
: q2 e1 r  X# m# X- ]( p    }! i/ t+ r  l+ d- g2 D
    return 0;! c9 ?$ V: T9 a5 Y) d& a; ^# u
}
& T1 p0 o( j! @+ }" x: X% T$ m% ~
% g& H  e7 B* L3 w1 L% H3 a$ q6 Q5 b& s- G
然后编译执行就可以了(*^_^*)
- P) W/ S/ l$ G/ b# I% C* O其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 `0 e4 a7 v. D0 `# e* T      建议使用VC7或VC更高版本,或者使用GNU C++编译

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