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

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

在9月8日那天我特意编写的,给大家分享的,5 w+ \" W- d8 Y. o$ x
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式$ I; P" C9 D& [7 }+ p/ `7 f+ T
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)0 y: J$ M0 B! w5 q6 d2 q
参数解释:1 M7 \$ U1 g' G9 W1 k0 @5 M: C
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 _- l& d+ ?" i8 W% jnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定/ x. I7 R/ x8 E+ j$ z7 z: a
返回值:
* |$ f* a0 F3 I; d2 e+ \  e4 j  d返回非0表示计算成功,0表示计算失败有错误
$ ?+ d8 m6 y) C. N4 n. w. z& S5 ]- F: y
( w. x  I$ |2 m

8 E* \* n% o1 [' S( P/ N; ^5 \' h程序代码:
/ }( F3 ]& l' ]* Q2 ^- d; h" H% x. [1 V4 \0 U
namespace fy_Exp{
7 W# _) n, G! a! |+ P& ynamespace {template <class _T>
- `' L; S8 E5 _- y% G/ ninline _T GetExpValue(_T t[], char& csym){' C2 x: x5 M6 X: n, t# s
    char c=csym; csym=0;& K; v6 i+ \# r2 p, `4 |. _$ ^
    switch(c){
' _4 |0 z# k- D. f! H/ [    case '+':return t[0] += t[1];
: b$ p4 V- H7 b9 A! n- o    case '-':return t[0] -= t[1];
# j# H, l- g# _' c0 e. |/ P    case '*':return t[0] *= t[1];  u6 U2 T3 m3 u9 n' o
    default: return t[0] /= t[1];//case '/':
5 s/ c2 K* x: p- @6 f+ G. {2 B    }
. u1 W1 i4 h2 B; S; m}}
( B& W$ g  e9 [5 {% a# ]template <class _T, class _Tstream>
" l1 x5 \8 D- U3 U7 e- E/* _Tstream: inputstream, _T: get return value
2 f# Y  ?: t1 p: ~4 F* a4 u" e* Return nonzero if get value successfully */
# Z1 g. F0 E7 ~1 j; Fint GetExpValue(_Tstream& istrin, _T& nReturn){; B. }! k  l5 K. B/ S5 L
    _T t[3] = {0}; //雨中飞燕之作
0 l2 ?0 b& O5 c9 }8 T: J    char csym[3] = "++";
0 P" f, I" o& l1 I    int nLevel = 1, nERR = 0;/ |. G. A9 _3 m* X
    if(!(istrin>>t[1]))istrin.clear();' H# R) ~# v1 k# w. E8 c4 z: a: I6 m
    for(;;){6 |9 Z+ T  ?( Q" O/ I( f3 z
        if(istrin>>csym[2]){5 g$ a! |' n8 b/ T" m4 E1 @
            switch(csym[2]){
6 I- `# U( d, S            case '(':) Z* b" M2 o& {3 v" n9 B/ H1 A/ [1 e
                if(!csym[1]){nLevel=0x100; nERR=1;}else
' {2 R% ]  z1 Q/ t  b                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;  X% B' `* h9 ~; V6 H7 M
                else{nLevel=0x100; nERR=1;}2 M, i% V9 z5 l; o/ x  b  Z
                break;& y% I; b" J& H+ l. Z
            case ')':( c# f6 V: j6 @( O! [, ]0 A3 l
                {nLevel = 0x100;}break;) r/ J8 W: K- K- |- p
            case '+':case '-':case '*':case '/':
- ]0 ]9 ?! @+ ]0 b! u' S. v                {csym[nLevel++] = csym[2];}break;! b$ l& M+ y  t0 F
            case ' ':case '\r':case '\n':case '\t':continue;% [6 \. L$ o8 c
            default:
3 e9 y& _2 u$ v7 m! M' o7 G                {nLevel=0x100; nERR=1;}/ a: K) t  \$ `* l; O; k
            }' g6 u- z* I& Q* o
            if(nLevel==0x100)break;
' o0 D- X1 o" W" \# i: ?5 B            if(nLevel&0x10 || istrin>>t[2]){* w8 Q3 s2 w( W* G
                nLevel &= 0xF;
. v( Q7 C# z1 I# v$ p1 n$ E                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 W5 L% O0 u; J2 {                if(csym[1]=='*'||csym[1]=='/'){
" ?7 T1 o+ s; Z9 B' N5 E                    GetExpValue(t+1, csym[1]);6 F) J0 P. Q9 h8 q$ W
                }4 z+ e' ?  L9 x" ], ~
                else{
8 C/ R) ~: H: D' c5 D                    GetExpValue(t, csym[0]);- c9 u3 d2 z, ^# u/ A3 E
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" C$ n3 c! C0 F8 k- t                }
; R. ^6 J& L! _( P9 a                nLevel = 1;' Q+ e. x- a3 T
            }
+ o; `1 b5 N* F/ u+ l7 W            else istrin.clear();) q, k- S  ^- _. c
        }5 B: J* V7 m2 F' D+ [# Y8 a" j% j7 {; L
        else{nERR = -1; break;}' E1 a9 A6 V0 J4 H! G/ |
    }
& D, G( Y+ Z# p    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 l0 v" H5 Q9 v2 g- F8 \% v: m
    else nReturn=GetExpValue(t, csym[0]);
. T" z0 @: d! ?/ b    return nERR==-1?1:0;$ B* v5 x5 U0 }+ N$ `6 Q
}}' \. ]0 W6 v8 d9 F1 D
0 |8 U) E7 Y1 P- Q) p  M' h5 Y

" D, Q! }- e3 s5 ~. o0 [: U! z
7 q9 _/ L' L  Q3 A! l函数模板使用示例:9 G, f$ ?! ?* [5 U8 p
在以上那段代码的后面加上以下代码:0 c- W0 D* q" L. O( ~5 j0 Q
4 M: a( c! |/ w4 W; v# F* v( O" {

  _1 q% @" E- f- `; o  V% @3 F7 b0 Q7 o! Q. X! z& R& ]' z, x
程序代码: ' B9 f  t5 m) G, J: d" _7 V
7 K1 z- I8 n) P/ c( ?
#include<strstream>
& `9 z4 N3 G6 K/ B7 c% s  Q#include<iostream>) K4 ~; `1 `6 u3 {1 P
#include<string>6 u2 U% A6 {8 u3 y5 r
using namespace std;
2 t  }1 [! [5 M# \int main(void)9 E; r7 A4 Z% L) \8 H- I/ Y
{
2 a- y5 D8 I* p    string s1;: O6 F  R! k$ J7 q4 G' g& A
    while(cin>>s1)
' r6 i/ i' w! z5 R    {! s, t; s: \) ]6 X% e- c8 {% ]
        istrstream isin(s1.data());
& L7 N: b+ m, ?6 w) K7 x        double d;/ N/ ^! T9 p1 D7 C
        if(fy_Exp::GetExpValue(isin, d))
# H3 A- A% T9 |% }& K% o  i# O        {
( b9 C! e$ T* l9 M  }: U            cout<<d<<endl;
1 {. H" y% {1 Y  E2 b        }6 t( I9 Q7 ]. `' A$ b
        else8 r3 y$ ?. L( @+ x% [- }
        {9 [/ q, i) U* b
            cout<<"ERROR"<<endl;  q/ X" h& x  e& [0 ~5 L* W
        }
1 c3 A* h# c1 R/ p0 d! j# N    }
  E+ {* ?1 ~9 t6 c6 s    return 0;  C0 U& I- @7 e/ \" \# j2 N
}' s) g( O0 I- |4 |

$ |/ O: |6 \% j& K; @. d& Y
0 c& t* L/ C* l1 g; J然后编译执行就可以了(*^_^*)
- M+ p* u& u1 }$ d( ~; s+ c其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& f4 ?% I8 J: U      建议使用VC7或VC更高版本,或者使用GNU C++编译

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