获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
3 R. d0 d9 o" i7 B. V% ], a/ A一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) f& B" I& U- B  U6 ^+ m. {0 l只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
+ J, a3 G2 g. ^; N) H  W! p参数解释:/ q# R) v( f4 X) P- r5 h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 f2 d$ Z& P. W/ V0 anReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 `, F& X4 \! w+ p6 u* o返回值:. U3 l3 i$ y8 a: R) J/ ]
返回非0表示计算成功,0表示计算失败有错误
0 S0 D) A3 @5 y% M
9 t. Q  y4 I1 h* g' Z3 T/ `9 A
( b( b5 s, L2 m5 }/ E
( a1 B9 p, v6 h7 P& f程序代码: : ]0 D; @# ?7 [# j

# s- v2 j6 x) c( i6 w; k% h2 cnamespace fy_Exp{# c' a' M, _1 y0 I
namespace {template <class _T>2 X: L6 Y8 l0 g' ?$ _4 S* Q- q
inline _T GetExpValue(_T t[], char& csym){
/ M9 F* u4 k$ Z  L, ]    char c=csym; csym=0;
$ A% J; O7 e: [4 u- L) g* T    switch(c){
* e3 A/ r1 H& I+ y- D    case '+':return t[0] += t[1];
0 t% Q* s" }, P" t; t& D* ]    case '-':return t[0] -= t[1];. r4 @  @9 q9 p; k
    case '*':return t[0] *= t[1];
  E( \* U- J8 @    default: return t[0] /= t[1];//case '/':! h9 c, }9 N$ X: w
    }
  a5 V' H. w( f6 {" r5 b. N! C# P}}
( {# R- _) P& b9 p2 ~, ^3 Utemplate <class _T, class _Tstream>, `8 S) B) Q3 V
/* _Tstream: inputstream, _T: get return value; N; F5 [+ C  b$ i3 g
* Return nonzero if get value successfully */* R7 ?/ H* c& \+ p  X) D
int GetExpValue(_Tstream& istrin, _T& nReturn){) e2 g8 z- U! Z5 ~! t9 ~5 P7 H
    _T t[3] = {0}; //雨中飞燕之作
+ R) |) G: Z& z+ F- N- s* k& x$ m    char csym[3] = "++";
" J0 t( t3 h3 \: }    int nLevel = 1, nERR = 0;
: g8 Q1 W0 d5 I8 l: |. {4 o0 w7 R- I    if(!(istrin>>t[1]))istrin.clear();4 \) v( K# C& s5 |
    for(;;){8 U; r# d2 }! }. s( Q! @9 o
        if(istrin>>csym[2]){
/ M/ t4 t  H! @2 O1 m            switch(csym[2]){
, l7 B- G8 z" j5 F4 s# K            case '(':" `% B& z( p$ @  A" X+ _4 J" o' b
                if(!csym[1]){nLevel=0x100; nERR=1;}else7 u) A/ U! J2 k) _* K
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) {) q% O. o, D9 B8 N                else{nLevel=0x100; nERR=1;}
# U8 U- j( x" }) S2 `' c                break;
  o' A+ E' s2 j; G, a8 e            case ')':- S* m2 ?6 Z' O
                {nLevel = 0x100;}break;* Y9 P1 Z2 h7 T& m
            case '+':case '-':case '*':case '/':
6 e4 }0 v9 Q8 Y- I                {csym[nLevel++] = csym[2];}break;
* G% c( R. d1 j2 n            case ' ':case '\r':case '\n':case '\t':continue;$ L  u3 A  e4 ~. t
            default:
( N1 U/ t  B6 {  ^$ {  e9 I3 A                {nLevel=0x100; nERR=1;}
# D# W# S* z  x3 C, I            }4 j4 [+ W% O6 @- v" S. s
            if(nLevel==0x100)break;
! q# A3 [+ P' E- q8 M/ @            if(nLevel&0x10 || istrin>>t[2]){- @$ s( x" X' [. l/ J/ ]1 N
                nLevel &= 0xF;
9 b. v8 |$ X! U2 H: B                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}/ m% z3 }0 ?. p7 P  U
                if(csym[1]=='*'||csym[1]=='/'){5 `" T$ y. q7 E1 A! C4 w
                    GetExpValue(t+1, csym[1]);
) L+ u7 O5 o  z$ f9 m) T! C; h                }% `0 P0 b' e/ M* y! ~% ~" U" Y
                else{
: ]. e# l# h1 `                    GetExpValue(t, csym[0]);
: T! Z7 K1 A; v$ q$ P) S- Y7 q                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;$ p# W4 ^$ d! o7 t/ j& H5 E
                }
6 I# Y& P- V( c                nLevel = 1;3 o! p) t" b; w
            }- O$ f- o5 U! C
            else istrin.clear();
) r5 _) H/ P* O# a; l( N        }
  }1 D+ w* `$ p3 p1 ~& T  o. N        else{nERR = -1; break;}! l8 W2 z8 c4 j5 l3 E8 Y) q$ k
    }
; d. r0 G4 |* `9 ]1 {5 @    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
% b6 S/ Z. C- c3 P, D    else nReturn=GetExpValue(t, csym[0]);' \3 `( ~2 F4 |
    return nERR==-1?1:0;
' [4 m8 h5 U4 V2 Y}}
8 H: X) P' y5 x( X, I  q( `9 b/ n* g- ?9 ?) n
5 b' Z4 V& X/ o9 k) D/ e

$ Z4 J; W& i  n3 I( k+ {# _+ v函数模板使用示例:
9 t' F7 y( A8 N/ k6 |在以上那段代码的后面加上以下代码:$ ^: `. C3 k* D' y5 u) [3 K, I

5 p" L' _3 u( V. l: I# M( ~* m & D0 B1 _6 V$ }) X  t
7 J( x$ G& @( |. \- G
程序代码:
0 Z8 @& d8 t2 Z* F- o; d7 l) Z$ \1 \9 @
#include<strstream>: b0 y1 j* L4 S* H: l
#include<iostream>
6 E/ c9 w% ~4 r! }% n. K#include<string>
, m- ?! t7 {8 s' Zusing namespace std;
( ^! S( j% V9 `int main(void)* [1 J% }' a& B
{
: y6 [0 w! o: {* Q4 L; }) u    string s1;
: f% s; X* P6 r/ r6 s1 c    while(cin>>s1)
- j  M4 ]; E4 Z6 m. B, o# g, d    {
  l* a- h) U5 o: W. M3 D( N; Q2 h4 O        istrstream isin(s1.data());
/ p( ]$ I% ^3 j( r        double d;
; H- j* q" C7 J7 T        if(fy_Exp::GetExpValue(isin, d))
: J: c8 v) U6 s3 z/ y* f9 P& ^        {5 \/ h1 o, X4 r7 m5 Z& ~' S4 o
            cout<<d<<endl;
1 r4 A! S, l4 e* N5 S8 p. U        }
0 E. k* p0 a" N& Y' V( G        else* a% X& {: d/ ~  z& \
        {& U. x. z/ t, Z) r7 G
            cout<<"ERROR"<<endl;2 s9 Q& W8 Q1 N0 ^* W; {+ a9 V
        }
/ p8 p# y1 V+ w6 R+ x    }  i2 F& r3 B( _' a' m
    return 0;
! [* `; o8 i+ A! J% A& k+ P- ?2 l7 I}; b9 i1 C+ N& [6 R% @* _4 {

* a" N& ^- a6 _6 a! C
: O" {  z! u  i9 w2 G  i. {) N然后编译执行就可以了(*^_^*)
: S) e! o8 x. N1 L. L& M$ w5 @其它:TC++上一定编译错误,不保证在VC6上也能通过编译, U2 w1 \: X$ V4 q
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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