返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
  I5 d2 @, u6 S& I& Q3 r1 a8 Y4 \一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" N1 _& y8 h: L8 Q. L3 Z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 V/ N7 l8 L* E# g% U参数解释:# [1 s9 `" r! N
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 L* q9 w' e( @* L2 e7 d
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 b% z6 V- e" {& t& \& |返回值:
# _: k- I0 k) A6 m返回非0表示计算成功,0表示计算失败有错误" e# t; l2 Z8 b
6 Z# B: I5 b% V) Y+ Q
, K8 E' S! _7 X9 D5 m/ a( y

5 g3 h) r5 |; s程序代码:
: w( t( `3 P6 {5 F+ g, ~2 ]* N+ b# h+ R( A( k& B+ E/ r( K( o
namespace fy_Exp{
2 b1 h! |- B( E# fnamespace {template <class _T>
0 I1 m- A+ [) E7 L- [8 I; x% Ninline _T GetExpValue(_T t[], char& csym){, z' [* @$ e5 b$ _& @
    char c=csym; csym=0;
! ]# m0 a8 ?6 K9 m. J    switch(c){" a' s7 I( b! G* I9 w! A
    case '+':return t[0] += t[1];
* ^6 T$ o7 B2 R# I9 ~! _    case '-':return t[0] -= t[1];
; k4 V& Z) t5 O. i* o5 B; N! n    case '*':return t[0] *= t[1];2 V) V( D, x/ p" C4 K8 H# j
    default: return t[0] /= t[1];//case '/':
4 L) X9 f5 D# [; _+ m( r9 t    }
% }5 q+ D4 _! h) Q, [/ v  ?' Y4 f}}, x' ~0 B1 c; G, s0 l5 S
template <class _T, class _Tstream>
1 p, G. F9 ?0 {/* _Tstream: inputstream, _T: get return value! r- y- p# i& H; a% V
* Return nonzero if get value successfully */
; j. D+ P. j+ R, J3 E2 s. O% |& Z; kint GetExpValue(_Tstream& istrin, _T& nReturn){& P4 R8 X( ]+ a% f' X, i
    _T t[3] = {0}; //雨中飞燕之作
& [) M, v' M! J9 B) w    char csym[3] = "++";
' i% B- d8 q% G% U    int nLevel = 1, nERR = 0;0 p: m7 a( G6 A3 U( Y* X
    if(!(istrin>>t[1]))istrin.clear();4 _. i+ [! B! H  V3 n% @
    for(;;){# Y4 ]: q, E) L! g! m
        if(istrin>>csym[2]){# W1 X$ C7 e2 D6 \% t. e! O2 n
            switch(csym[2]){
0 _7 _- ]. O( @8 N  g, r, j            case '(':
& b. ]! T. O6 d; h2 L8 R                if(!csym[1]){nLevel=0x100; nERR=1;}else
. O6 R9 }; t. m. \$ l# J: e+ |                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
6 p& p& J( s) z' D, P/ S. ~                else{nLevel=0x100; nERR=1;}, G+ u2 @' z" g$ a
                break;
; N/ }) w: A1 E+ q. `9 D' M            case ')':
- ^) P3 R8 H/ @6 B0 |7 E1 u+ D2 g                {nLevel = 0x100;}break;
( Q2 _, N  q+ p& w0 O0 K            case '+':case '-':case '*':case '/':
& e8 q, D* [. @5 b2 @# w                {csym[nLevel++] = csym[2];}break;
, c  H- Z. R4 d4 a8 V  `            case ' ':case '\r':case '\n':case '\t':continue;
+ c& L+ w& T) f, s' o  ^1 H+ p6 E            default:
+ ]5 @, r8 {/ C4 n1 {* k$ A                {nLevel=0x100; nERR=1;}) B1 G) ]7 z+ k3 W
            }
; _( ^; u" S. M* D" u* }3 c: j            if(nLevel==0x100)break;3 [2 p9 P3 l$ r6 {, p
            if(nLevel&0x10 || istrin>>t[2]){" S2 a- W' j4 l& M3 [
                nLevel &= 0xF;
# r# ^$ r* p9 r6 C: _$ U; [                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 X( W$ l0 M# O4 J* k5 F
                if(csym[1]=='*'||csym[1]=='/'){
. m- P1 P( N& q+ Z, q0 P$ X( Y0 T                    GetExpValue(t+1, csym[1]);3 G, h9 G# F# A" t5 T9 _
                }
, B! Y% I- c) I! n: b4 y4 }                else{0 g8 p( @3 j6 }8 l7 N
                    GetExpValue(t, csym[0]);) w& N  M- I, Q8 x0 x
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;" t; ~$ m, \3 _
                }
# t, u% b  g  n' [- c" n                nLevel = 1;) [( s3 u$ B" `% E3 S3 W7 I' k6 c
            }
5 `9 i0 P$ e3 L3 k( y) M            else istrin.clear();0 \! u7 v" E4 Q' h' ~
        }/ k' p( B; Q! l' T2 j
        else{nERR = -1; break;}7 ^( h3 D+ {' S) J- f9 j
    }
( _3 }0 K: Y5 m! D! Q    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& e. S9 f! ~" S    else nReturn=GetExpValue(t, csym[0]);5 u$ [9 H/ X( F* [$ c
    return nERR==-1?1:0;4 d! N& }! K) S: \. _1 T/ Z
}}/ A/ v5 F! `! b
9 w8 s1 _' u' K+ I) u/ p+ m) a! L
1 y7 ~# Q  f: g: u

$ s$ r. j) Y3 `) C/ l. L  a函数模板使用示例:
- t) w" G- S" w2 g" E在以上那段代码的后面加上以下代码:
2 M1 f5 ~8 c$ n, e/ r4 s" H9 ~7 \" q4 F2 z6 Z2 x& D4 J* S

" ^6 K* F2 e' r' h
- d& I' R" g2 O& D" s' i* x. I程序代码: ' z$ c$ |# h+ C6 T% J
' W. n( L( a0 I4 _  v$ k
#include<strstream>
( @- h: w! ~" @( S2 u  C" Q#include<iostream>
5 E& m! F. ^" J! o; g+ i#include<string>4 S' L. _9 d& ?4 Z: Z
using namespace std;
8 V1 b" G% g( b4 @4 ]1 E2 d: Tint main(void)
- O9 k% [$ g9 C- e{% x) T2 w* X0 O8 D- u; L
    string s1;6 K3 ~4 S) j3 W$ P% I: n0 ]$ u; M
    while(cin>>s1)& E( |* |4 c, p/ `8 S9 `. L2 U( y
    {. z$ V/ d4 y4 y' ~6 U, Q( s: z
        istrstream isin(s1.data());2 z$ I9 [) Q2 e) g) l$ x! W( o
        double d;) D) {0 d" I' b( f4 j
        if(fy_Exp::GetExpValue(isin, d))
, C) }2 s. [# ?! `+ c7 V        {
$ u$ f) u2 C* Q; A  u3 u/ n            cout<<d<<endl;
7 D* P+ {( b$ ?1 W7 E# K5 s        }
' L5 Y& v/ _) t" o        else
: y  S/ T2 y  z) Z7 J9 k        {
, L1 j8 i, F) N7 m: T  [  j            cout<<"ERROR"<<endl;
- c, M5 _6 o" o. p" }        }7 p4 a. X( T+ A* C
    }
2 p7 T, @* W1 d# ?  s, H- O0 z' d    return 0;8 J- m& N9 B+ P: v% i! o
}8 h' m- I9 J% y) }3 L; s
1 A! r  l& k- S' x
1 `0 C1 F* F% |/ k7 f/ O
然后编译执行就可以了(*^_^*)/ P8 D7 n: j1 Z, T  Q
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* r  r1 L2 j/ _( c% y$ }$ @      建议使用VC7或VC更高版本,或者使用GNU C++编译

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