返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,8 H1 j! J- s' C( r( u
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式  \4 c  D6 O: }# X7 v# z" c6 Q; u
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); S! D5 t! N+ J
参数解释:* p0 {' N0 R  G4 G
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流/ t' T" }+ t: ^/ C& G
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 @- g% v, e/ T
返回值:
  h' V8 ?  x( W) N, K; u返回非0表示计算成功,0表示计算失败有错误- ?+ {8 T! s  ^; m0 i) K3 j; _
0 }5 p' Z$ P$ n7 A) _6 ]
, _  p4 \8 ^6 [" L+ `$ D4 p: l
# T, L1 o' }0 C& Y" ]0 I1 K
程序代码:
' j% C8 z5 C9 L2 B
$ i; \* K! i! N' Y+ Z$ f5 c. Lnamespace fy_Exp{
1 ~  r- K0 X9 V1 _namespace {template <class _T># R! L. t) g$ k4 d7 T# a1 V
inline _T GetExpValue(_T t[], char& csym){
4 ]& r( Z& Q4 u& U- @# k8 K5 ?: L    char c=csym; csym=0;
8 Z: J8 Z* u& l1 P  H    switch(c){# _9 }4 M& f3 _9 y2 \2 x
    case '+':return t[0] += t[1];! b; o1 X9 D" e" O& y! u
    case '-':return t[0] -= t[1];5 i  t% N* |  G: [4 u9 \6 [% P
    case '*':return t[0] *= t[1];
$ U3 j  Q8 @" x0 q$ `( }    default: return t[0] /= t[1];//case '/':9 B4 f& m! f$ F# E4 c
    }- e0 o' c& p- L$ g
}}/ h9 N3 o$ c% i6 x: [
template <class _T, class _Tstream>" D7 ], y" w+ k8 V, `. s
/* _Tstream: inputstream, _T: get return value3 Z1 H7 C: Q; R. k
* Return nonzero if get value successfully */
# y5 N5 X0 j1 _int GetExpValue(_Tstream& istrin, _T& nReturn){
- _8 A- _( s9 c. t9 \. d    _T t[3] = {0}; //雨中飞燕之作
& r8 N7 s$ U5 o$ p3 N% i- O& ^    char csym[3] = "++";% H/ v/ n: [9 a- k
    int nLevel = 1, nERR = 0;6 P+ X$ P+ |' f+ E1 |
    if(!(istrin>>t[1]))istrin.clear();
$ h& e2 u5 l5 g/ d    for(;;){
, W" B9 v" K! X+ O9 C/ p. [        if(istrin>>csym[2]){
6 H4 a3 n" f: W            switch(csym[2]){0 c6 C& x; @. L: B# N
            case '(':
. T2 \5 C  K+ ~* Q- \* H                if(!csym[1]){nLevel=0x100; nERR=1;}else
2 ]0 A$ ?+ I3 W6 R+ R* y7 e                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
  k, ~: z% U% I$ b2 p4 ^* m                else{nLevel=0x100; nERR=1;}
6 M  K8 f( F3 b  R  Q( ?$ m0 b9 P                break;9 p$ N2 M( R5 Y4 e
            case ')':
. p+ f7 o$ d+ W3 T                {nLevel = 0x100;}break;
+ s' [5 c" G0 Z" _" A/ ?            case '+':case '-':case '*':case '/':5 {" x$ e$ f  k, f2 s$ {3 t
                {csym[nLevel++] = csym[2];}break;
' u3 w5 @0 ~: `+ z& ^8 m9 P  l: f: G. v            case ' ':case '\r':case '\n':case '\t':continue;5 m9 \) S& P# v" _4 r. G
            default:8 ?  K+ z. M" C; A0 J2 J, g$ N% q1 g
                {nLevel=0x100; nERR=1;}+ h( A9 ^, h, B4 C
            }/ O, e. Q. J, F: x! `2 G7 q8 H
            if(nLevel==0x100)break;
  X9 m8 [0 T5 y; s% ^" C" c& B            if(nLevel&0x10 || istrin>>t[2]){% M! N* c' e1 Z( r/ ^8 [
                nLevel &= 0xF;
; Y) G+ w* _1 V/ X                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}  }$ j4 w6 N6 P: N! N5 Z
                if(csym[1]=='*'||csym[1]=='/'){7 A: e/ |5 ~& E" c
                    GetExpValue(t+1, csym[1]);1 r, O$ T# h' Z
                }7 k7 v1 ^3 h" r8 H* U2 M6 D
                else{$ Y& M  [) }$ u9 a' C8 t3 g5 e
                    GetExpValue(t, csym[0]);/ G+ _# @% @% O! N) k8 D/ e" ?
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
; k9 y/ Z9 t2 J# y$ S0 D6 u0 r                }
& j, T* x; K7 n0 P3 M                nLevel = 1;) a9 e1 b  H2 _7 d+ M
            }' M) H8 z% U8 h
            else istrin.clear();
$ Y7 p6 s" z* O) B. Q8 V/ _        }
9 s' |( r# I& E9 }& `- N' K        else{nERR = -1; break;}- D  x* c9 T: z
    }0 q2 G2 D/ g; S' R: u
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ l7 w6 L0 _9 E7 s/ W% z4 t/ a
    else nReturn=GetExpValue(t, csym[0]);1 R$ R9 N, j3 {, ~
    return nERR==-1?1:0;- H% |: k' k9 p5 h
}}% f+ P. a. l* I5 d5 v
' L1 X0 X: f4 J/ H
( |) D* r! S% {4 T3 v6 m3 H' ~
& u$ n, P7 P9 _3 f
函数模板使用示例:
* I, p4 z/ ?% F9 i7 I( Y& ]在以上那段代码的后面加上以下代码:  d' g7 S/ {$ q  Z, H' Z7 O
0 \5 ^( ?  ~* U2 }# a2 L
, Z3 G3 x( b, H# _

7 Y+ R7 [# S0 H! @- i1 i  M程序代码:
$ R9 A: r1 J7 f3 c0 \# G; T6 w; y2 S
& m, j% F) L0 J1 d/ i# q9 H#include<strstream>3 I) Y& y, F3 N% ]5 N" A0 P2 Y3 D" z8 v
#include<iostream>
8 H* y( _' P4 Q  [( Q#include<string>
6 }. W. V! }4 D! V6 zusing namespace std;9 {* o( a; }( F' B0 d/ V2 T! [
int main(void)
" }2 `) ~* H+ [* k! Q0 s% w{
( |2 c3 ?' X& b7 B    string s1;/ M, Y5 x1 w9 l
    while(cin>>s1)
# ^9 b% F2 m% i0 T  \/ u) ]    {2 e  T; h- ?% y6 w% }" I5 Y
        istrstream isin(s1.data());5 M% E# S% l  h% u5 d! S
        double d;  g3 V2 @5 ^! ^
        if(fy_Exp::GetExpValue(isin, d))
- d/ |2 `9 k! O( S9 s        {, D, h+ s* i1 l* k6 W% r; U' o
            cout<<d<<endl;& N# R3 H8 z- K9 O. ~7 q
        }1 r6 L  h- ]+ m: P, ~6 W
        else6 C$ K( p+ I4 `$ u
        {( m# M, n* n+ [4 y
            cout<<"ERROR"<<endl;* g% w* f, O# H, r
        }) @1 j& s6 n8 o
    }
3 k# |2 l( C( E    return 0;+ @0 u' [9 F: A
}8 F3 d5 R" W( R# h1 i& N
0 I/ S* m# i/ F  w  I

6 G% r; A  D2 F+ y2 D3 Z% V# t$ A然后编译执行就可以了(*^_^*)
6 `+ |" b" |; O1 r其它:TC++上一定编译错误,不保证在VC6上也能通过编译# x6 e$ n! `- k% Y0 V# J! Q. }" U' e. q
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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