返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
8 o8 F5 D3 P( a) s0 d; ]一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% G( ]7 m7 I- e& O# _5 q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# v' {0 O0 ?' z8 G% L5 L" {7 P参数解释:& ~' C7 U/ S/ c* W! P( t
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
) p# \% ~1 j% @nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
! \. n8 v+ Q& X# K9 ^' C返回值:
! e4 X! r3 L3 N/ k' X! g返回非0表示计算成功,0表示计算失败有错误2 }+ B4 Y5 c( j, k0 F. m  i' g

  V1 s  Y, E: e5 t4 K# n- }+ Q( x0 B 3 o* X- l" K' _/ ^- }5 S
  E7 ]4 a& G' @6 R/ j! U
程序代码:
; e" |8 c$ G* c6 ]6 H& y
8 ~/ |+ r  n" X# ~! qnamespace fy_Exp{
4 ^3 o5 P  g1 u5 R- X7 Z. @" ^namespace {template <class _T>
" X* J- T. Y, B3 minline _T GetExpValue(_T t[], char& csym){
) j7 o" ?/ M" `2 Q    char c=csym; csym=0;) [) [  \3 e2 `  p, w
    switch(c){
) q+ W  o0 Y( I4 ?- l0 `- S9 l    case '+':return t[0] += t[1];. q3 V0 b% `6 s1 B2 }  C
    case '-':return t[0] -= t[1];
# o. j( L7 `9 @6 {9 ~    case '*':return t[0] *= t[1];
# e+ L0 I& `/ x8 e  ]3 s; ^9 f% A( e    default: return t[0] /= t[1];//case '/':9 q; W# V# X* m. Y
    }5 ^+ a! R( n: I) K, b' V
}}
* K- Z1 H0 q$ K3 ]  {1 t: \template <class _T, class _Tstream>
# i) q% ~6 g3 J/* _Tstream: inputstream, _T: get return value
5 A9 Z6 R* |. S( y4 H* f4 j* Return nonzero if get value successfully */
- O" N7 x6 q, h3 G% L0 V8 C2 Eint GetExpValue(_Tstream& istrin, _T& nReturn){! N( a( s( y8 F8 ]
    _T t[3] = {0}; //雨中飞燕之作/ ^2 I- v% y  z
    char csym[3] = "++";" F; n: h( J( z0 D3 Z
    int nLevel = 1, nERR = 0;
" a& [7 ?$ R8 a; K- x! J( h+ \    if(!(istrin>>t[1]))istrin.clear();: H  G, Y" b; L
    for(;;){
2 G: P# j# v3 Q- |        if(istrin>>csym[2]){2 T8 C# J! R4 O
            switch(csym[2]){+ e: n( ]# |2 I# N; D2 c( }- M4 y
            case '(':8 @7 r- D! P. c0 _
                if(!csym[1]){nLevel=0x100; nERR=1;}else
$ u3 r0 x- y* C$ `* j                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
& ^! P1 R* d( q$ J3 K. H                else{nLevel=0x100; nERR=1;}
0 j, t& T& m$ F                break;
, a0 O/ T4 V& ]5 N( r, w            case ')':8 B+ w  }2 }7 G9 S1 J5 f  A
                {nLevel = 0x100;}break;
( x9 G0 u9 }8 y            case '+':case '-':case '*':case '/':0 h* @3 k7 t" T8 }' h  V
                {csym[nLevel++] = csym[2];}break;$ y' U/ r5 g  C# G6 {* l
            case ' ':case '\r':case '\n':case '\t':continue;
' U, D, f; J# \6 @* p; O            default:1 M& Y+ r5 O+ y" E
                {nLevel=0x100; nERR=1;}- h1 ~; l/ {1 y3 X- {) Y9 t  [
            }6 _! w3 _" u2 [6 I6 L
            if(nLevel==0x100)break;
" {) z( w  }& l( j' r6 P$ H! W7 a* P            if(nLevel&0x10 || istrin>>t[2]){6 O% O1 t" B" }
                nLevel &= 0xF;, C' M% \9 X- o0 e
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
' g& L2 P' n; H                if(csym[1]=='*'||csym[1]=='/'){
9 N; B1 n( J  b5 L1 u4 n                    GetExpValue(t+1, csym[1]);  E5 z- ]4 s. y: d; v/ T' i
                }$ ~  n, Y4 ^) E, Z9 {( ^
                else{
$ W' Q& G1 d1 [# x                    GetExpValue(t, csym[0]);+ r- h( R8 y4 o" i
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;5 {; N  Q  F; E1 a
                }
( ^- R& T! `9 Y0 p+ b                nLevel = 1;
. ^) c& n- w5 E- ]6 ^            }0 q" F. {6 x; k0 C: M' }( R
            else istrin.clear();" m- O4 P  ^; F/ ~5 t
        }$ m& M! j/ ]6 S' p. m( c% \7 g4 p
        else{nERR = -1; break;}+ p! ^& N3 w- @0 l9 i$ o! j
    }
2 w6 p" `2 |0 E7 n7 M; W' O, n    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 d' }/ O% @. A* C$ m    else nReturn=GetExpValue(t, csym[0]);
) B2 p- i3 l2 G6 o. P    return nERR==-1?1:0;
7 I* T5 o% a) h4 J" ~& P}}
! y$ T" ?# p4 X0 d# ]" P: {( M7 X1 S3 }. o# ]2 b1 S; X+ [
" o4 c7 n6 _* W, D, X( U8 r+ Q
' {: R0 T* ^( V) e
函数模板使用示例:$ U" M/ c- e, H; O
在以上那段代码的后面加上以下代码:
/ L- J4 X3 V' q0 a, K
( f1 L  n5 N) J; E3 ]5 S: W   J3 u, v) w' D  ^' |4 t$ H# K

* M7 W$ K! r& V" ]$ R; o程序代码: & Z  Q) t* K! F# \; n# M& \
" j0 x+ o- M! H7 Z
#include<strstream>) M4 N( x! H9 ?! f9 ^
#include<iostream>
' g' n9 _# ]$ Q; t$ s6 U#include<string>
: N+ S& Z! Z9 y. F6 f$ B2 {6 d4 kusing namespace std;3 w' J% c1 N0 R5 j  F! [
int main(void)
6 W9 X5 K" X) P! m# R& V{
/ o1 w. V* K3 A/ w" Y9 u    string s1;4 J* f' J4 ]2 m( p
    while(cin>>s1)
/ i( P- S5 n7 q7 n- d) z+ V: K    {: x7 h" u4 I' e4 b! t; [
        istrstream isin(s1.data());
9 v. |8 r. t6 r9 o8 S/ v( V        double d;5 `% |* D$ `) c; r
        if(fy_Exp::GetExpValue(isin, d))
5 u  S6 X4 M% J3 _' s! E        {
$ F8 y$ V0 T; D( Y7 L6 ^9 C            cout<<d<<endl;
+ w8 S( w' I2 Y6 |1 J9 K  G        }1 s1 e, |0 z1 Z& o6 K1 G. ?
        else, i9 A! `/ e1 V& p) q6 J! M
        {4 H8 z8 T: e: z9 ?
            cout<<"ERROR"<<endl;
5 g  u0 h" B" u9 ~        }
. F  O; A- ?) P    }
! g  r, w& B9 |  E/ S: ~; G    return 0;1 n: C2 z3 C8 ~2 y4 L5 `* P1 [
}' H' @% G) B) n# r2 J' @2 {
  b+ H7 Y) ~4 P& q

0 X$ a+ S+ t4 v0 b然后编译执行就可以了(*^_^*)
6 T2 _. s, k1 m& B1 }其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" Y* D/ n$ ^" ]      建议使用VC7或VC更高版本,或者使用GNU C++编译

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