返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
* ?& z$ ^, [" D( G1 h+ L4 R一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ j8 C$ C6 d' r# M3 t/ b7 a( [3 ^
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! z2 o- A6 I9 c. C
参数解释:
2 c( |0 {3 R1 e. x/ {- i, bistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流- `9 U) F5 r: T% F1 _2 c" Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
2 ~0 t- p: r3 j/ j' H返回值:
7 M" k' t, |. g- Z! T. N返回非0表示计算成功,0表示计算失败有错误
1 {: j5 Z' Y5 f& `# F
0 R: e# D9 B8 b, Q2 s( K/ [2 m
2 T. u2 o! e" U( B" Q8 x  G5 l: ?2 Q
程序代码:
" h* A& E: g6 I+ `7 Z  z$ w$ l' a. t0 h, }$ [* M
namespace fy_Exp{
/ L. ^0 d' O3 o5 Snamespace {template <class _T>
; b+ Y% J) H9 H3 _& p3 e6 Ninline _T GetExpValue(_T t[], char& csym){
' ~" b) I, F1 J1 L8 F6 I. p    char c=csym; csym=0;
' `& k3 z, ~: O7 ^$ s* ^    switch(c){
. V4 E" E# Q, b! K. j& F' y! n& v    case '+':return t[0] += t[1];/ U: w* A( p2 K& v
    case '-':return t[0] -= t[1];$ B9 N# }/ T0 m' E
    case '*':return t[0] *= t[1];
! o7 w! M- C9 Q, F6 f! [' c8 ]    default: return t[0] /= t[1];//case '/':* F! v! ]  K4 B& _0 V2 _
    }' m! q/ T( ?3 ~" }( L
}}
  [1 G8 w; u! ]" Q% `template <class _T, class _Tstream>8 ~9 ?+ E6 y, `; O' y
/* _Tstream: inputstream, _T: get return value
* G; q( x0 E; |3 j3 S* Return nonzero if get value successfully */
0 c2 H, @9 X6 R3 a" @  F( J4 rint GetExpValue(_Tstream& istrin, _T& nReturn){
$ E; z* Q/ o, s0 n; c' m    _T t[3] = {0}; //雨中飞燕之作; e# N% O8 b) P) b) F
    char csym[3] = "++";
$ C8 x' ?; \3 b    int nLevel = 1, nERR = 0;
# N9 r) G' C% V+ D2 u8 W- Y    if(!(istrin>>t[1]))istrin.clear();  Z4 ^# g+ K! j8 c
    for(;;){% Y% Z, }3 j( l! A! [; R
        if(istrin>>csym[2]){. g6 v/ e, }* D2 W
            switch(csym[2]){; e3 [$ g- e3 d) @
            case '(':' F& V' C' Z0 [2 ^4 \/ x
                if(!csym[1]){nLevel=0x100; nERR=1;}else' u0 }7 p6 X- H' N, h
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 I# Y7 G$ I/ D7 C
                else{nLevel=0x100; nERR=1;}
& ~6 M6 j: O# N( z# ]                break;
# K8 W# \! Q6 m. M            case ')':
! z7 s) s- I! y) W9 M' Q% B                {nLevel = 0x100;}break;
6 O- ?" g1 Y2 j* q- X            case '+':case '-':case '*':case '/':
* g( ?0 C; q) _  u3 E9 A7 a0 T* ?                {csym[nLevel++] = csym[2];}break;
  `2 ?0 S' t. m3 u3 q: i1 L            case ' ':case '\r':case '\n':case '\t':continue;- P$ V2 q- ^/ u6 S- w2 m
            default:
+ s6 m! }/ l9 W% k" d                {nLevel=0x100; nERR=1;}
/ R$ L: @- ^% A            }% `4 ~3 m( z& ]
            if(nLevel==0x100)break;
7 K: m# ]( W& x; Y/ d5 ^0 S            if(nLevel&0x10 || istrin>>t[2]){
$ f3 q* O3 ~: C7 z: `0 j                nLevel &= 0xF;
, U8 K+ B+ G9 }  O                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# t2 `% s! `' [/ x8 R4 S( T                if(csym[1]=='*'||csym[1]=='/'){1 C' O0 K$ ]5 O9 V/ T
                    GetExpValue(t+1, csym[1]);
: x. E4 `2 c) P$ w$ ~! O1 m                }3 u& m& ~+ V7 I8 W: [8 D$ @
                else{- [  n7 Y- p' o2 H1 t
                    GetExpValue(t, csym[0]);* V8 F2 W2 i  o( K0 b. |
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& C: q. h" Y( F' U! f9 e                }
" b7 Y- s& y) N1 }                nLevel = 1;
. T2 w6 Z; A* Y            }! w9 w: r3 l0 @7 ^
            else istrin.clear();9 K* L" h/ F; `8 M, }
        }
6 s2 I/ K9 p' e        else{nERR = -1; break;}* c' ?2 ?; f9 w5 A/ y
    }
+ D2 z- n  E* H4 Z, Z8 q    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" a7 Q3 ^0 {" \4 w! D' e4 y    else nReturn=GetExpValue(t, csym[0]);
/ G8 x( w+ }$ ]    return nERR==-1?1:0;( d$ r. V$ }% Q, M; H1 \
}}/ ]+ I3 [7 C8 p; A: Z; M

+ W. l0 i" L) a
/ w; o, Q" c, V' W
; C' |  ?" }* R" E% M函数模板使用示例:4 A) k$ \9 p, z1 u5 f/ z  N
在以上那段代码的后面加上以下代码:5 s1 ]- Y* j* H

/ u8 ?9 [* l' r , C* M& M8 c! e9 M1 z

" `5 ^* a; n: {6 S: I& v程序代码: , ^2 e7 e- k1 Q" U$ D2 n

3 R( L. `& v* h% x#include<strstream>& c6 B" [- h) _1 i8 J- x, W; ]
#include<iostream>% `7 {) h3 }6 T6 e
#include<string>
9 u6 F( m5 i: i  cusing namespace std;
6 y5 r! |7 J) I* P, hint main(void)
4 O6 v4 e; E* ]) @7 P( S0 i7 Y  b{
; _, W0 e: `2 {4 B    string s1;/ N: b. o$ B. _% @$ }
    while(cin>>s1)
) u3 a* a0 B$ l& x" y    {! _0 W6 t/ x' m. ]2 p6 i
        istrstream isin(s1.data());
4 S0 y1 k8 w6 ], ?7 h9 w- R8 b- s        double d;
, w- H$ g+ c' o1 H        if(fy_Exp::GetExpValue(isin, d))4 v2 }" a0 q" l4 j4 R' M
        {
9 \+ V$ q. e- x) O/ X            cout<<d<<endl;
) u5 Q0 ^+ U! w; T4 `        }2 U+ ?+ l. L, m" o( ~' o. d: m8 O
        else! g3 Z5 R$ e  [! P& I
        {6 j$ d& k8 O# m. O6 A% C
            cout<<"ERROR"<<endl;% p0 E9 ]3 j( _1 g, G
        }& n8 L2 \3 B# w( V9 N& r
    }
0 O# ^9 x, o! @4 t5 Q6 x    return 0;
: C  J6 s$ Q( V0 C! v0 O3 t5 H}- _/ o+ W/ b) r6 B9 V6 s7 x

. L  L9 s! s& h6 a: m. P! G* {1 R( S, u3 T/ B
然后编译执行就可以了(*^_^*)" [; O) p/ H; |7 w* I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 M6 h3 {! h. k; B5 W" n      建议使用VC7或VC更高版本,或者使用GNU C++编译

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