返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,+ A7 C3 R+ m3 b, W
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式  i- ~' Z! W( Z& c  \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 \5 T2 @4 A/ I6 z) j# W参数解释:
, ]1 ]: u, X! D3 n  W" l. wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流4 i6 B" M9 c, Z0 L+ F
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
& N) d3 w" h* i) G8 `返回值:. w8 k  e; n/ L0 [- E4 L5 u
返回非0表示计算成功,0表示计算失败有错误
& o1 I6 Q# u5 a' P+ O+ c: e
6 L  k7 R) M$ D/ ?7 f
* i- i7 L" ?) L/ u8 E4 Y. v" K. l
. h6 u3 M# x& ^- M% x, a程序代码:
; }$ |' l1 p% W% A, P6 T. W" V+ q2 ]
- {9 e* b' H( i0 p  O( Q: @9 inamespace fy_Exp{
( w% ]/ P2 s- r6 Pnamespace {template <class _T>
  u  Q$ y: t. F( r; w: finline _T GetExpValue(_T t[], char& csym){. a- J$ v6 U5 D+ C
    char c=csym; csym=0;1 i5 Z8 f# g3 ~$ x/ _& ?
    switch(c){
4 O( D6 g0 b( }5 Z' e    case '+':return t[0] += t[1];
' Y) `5 g) s1 E9 @: m/ d    case '-':return t[0] -= t[1];) {1 m) ]* D  w( M
    case '*':return t[0] *= t[1];
  ?0 r' u& M! }( `( ^# U+ O    default: return t[0] /= t[1];//case '/':6 D& i1 A- U) b/ G( @! s; G$ e# M
    }
0 D% L9 M% y! I3 W( e6 b}}5 _: u9 V- k% k
template <class _T, class _Tstream>( ~- R" L4 ^0 S" R* a  w( z7 F( {
/* _Tstream: inputstream, _T: get return value
6 Z- Y4 ~3 S9 l. y  t* Return nonzero if get value successfully */
, N* E9 c! ?  F/ G: }: `& sint GetExpValue(_Tstream& istrin, _T& nReturn){. @  T1 Z+ c' m% h
    _T t[3] = {0}; //雨中飞燕之作6 }, p5 F1 N2 d1 \* w' z9 q' c0 f
    char csym[3] = "++";6 Y8 s, m9 B1 g6 v. |* M, `% K
    int nLevel = 1, nERR = 0;& e& _  I; Y& a  W) e- u: n
    if(!(istrin>>t[1]))istrin.clear();9 O7 ^! T1 g+ d
    for(;;){
) s  G) _8 K1 Q' r# ^; \        if(istrin>>csym[2]){0 B9 k3 t8 U8 a% d
            switch(csym[2]){" B! V9 v5 D: `( z% ~" C
            case '(':
  M" P9 m, u8 U% b9 M2 S% _1 m) S/ O                if(!csym[1]){nLevel=0x100; nERR=1;}else
  c( G4 @, y  r" x                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: z" ~' q" \& u, d  n                else{nLevel=0x100; nERR=1;}4 D) b: z" u  w  m  t& h. B1 B- H8 t
                break;, a) @7 ]# X9 F% @/ m
            case ')':
+ V$ e5 X7 O" d% b/ h1 n$ C% |                {nLevel = 0x100;}break;
- @* ^/ \/ n' _            case '+':case '-':case '*':case '/':: ]( }" m, A$ ~8 q
                {csym[nLevel++] = csym[2];}break;% z) p5 j. G0 F7 y; r
            case ' ':case '\r':case '\n':case '\t':continue;. |8 M3 e# z2 t0 L% ]- e+ M& \
            default:4 P  c: Z, k5 [' ]8 X5 X
                {nLevel=0x100; nERR=1;}
1 v  z. k1 A. O            }
: W9 N* U9 M) s- O* V9 T' k            if(nLevel==0x100)break;) Z  d" a, @9 F- V- P
            if(nLevel&0x10 || istrin>>t[2]){1 c1 f+ B3 U, z8 Y7 J* Z
                nLevel &= 0xF;
: l  @% _2 P4 V2 J                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 J4 Y0 R' T, R4 @* ^7 b3 B& \                if(csym[1]=='*'||csym[1]=='/'){
. ^3 d; r$ G8 a) Z                    GetExpValue(t+1, csym[1]);
! w0 J+ l( r0 h$ v! q5 z$ f                }
- E! u! j) C( w' H0 s6 e. n9 m* Y                else{$ I3 K; S# C, Z4 ~
                    GetExpValue(t, csym[0]);
, _' ~7 _& a; @                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;7 g& z; l0 V% ^5 G  p- a+ Z$ z
                }
- X. [1 D$ y  a) G7 u" K                nLevel = 1;
2 p# R5 E+ Z* r# i7 P8 \% p            }
, A, t. g- _! Y! `. s6 U1 b2 e            else istrin.clear();5 N% m' E# \: V2 t0 Z5 r
        }
3 c) t1 z5 H: }        else{nERR = -1; break;}- I8 [- }+ [1 a: T6 X
    }
+ F$ g# j' D+ p4 Q4 n2 Q    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);0 V% G& E2 w9 D! y) v
    else nReturn=GetExpValue(t, csym[0]);2 C+ n( d6 J0 O  a* N; [
    return nERR==-1?1:0;4 H0 O7 T/ _5 I& r2 R; Q; Z  o
}}) w2 c9 _/ c0 f1 q

0 O8 W0 [* I6 A/ P+ G: C  U3 i: i  u7 N
  p- R+ e( I5 a9 G
函数模板使用示例:) s' u/ j; ~6 F5 P% ?* q
在以上那段代码的后面加上以下代码:( a1 ]( Z3 a  u5 A% e

7 X6 q; w1 S/ f3 k: j8 t3 y! r 6 v" r3 ?/ @. Y
1 C7 l9 S8 U! r; y& W" Z5 N* {
程序代码:
. u( l9 L5 u# i1 S
6 Y6 g  O& O  H; ^#include<strstream>
4 a5 F& P* Q0 j5 v7 B4 \#include<iostream>2 }9 Y* `- g# q/ P: v+ q5 E
#include<string>2 C' c. c3 c+ C2 c. n2 F2 a
using namespace std;
3 F0 x5 d& {1 O) ?) l: R# gint main(void)
6 M/ ~- ?- l, N$ |( u- p% q{
# g9 v# ]1 n0 `8 E$ P8 x, L    string s1;2 C0 T; K1 s2 [; `2 N) E/ v
    while(cin>>s1)
  L& C  ]% r# w+ _2 F! p% U    {. r  `' {! n# b6 C9 I
        istrstream isin(s1.data());
* t5 m8 C% i! u' d5 b8 C5 E! W        double d;2 _; E+ m  q* U9 X6 M: N( h' R
        if(fy_Exp::GetExpValue(isin, d))
7 B; N3 y) [# E! h9 }        {+ M  c4 Q3 @! F) Y! I
            cout<<d<<endl;* _; l, I: Z; y  n* l
        }
- Z+ Y  ]; L3 M0 x+ z% |        else/ J9 D$ m1 n9 X$ @: ]$ ^1 A
        {
  I8 {* t7 K# @& E            cout<<"ERROR"<<endl;
6 U7 I1 `* M; n4 g* N        }
7 U; g8 r/ P7 h6 O7 Q& V+ u    }
, g1 j, l" F) d3 A( z; `! n8 |, M    return 0;
1 N/ ~) h* T9 B) j: C}$ y! l; D' Z7 P4 D1 h  x" y; [  u$ T) J
+ [& g( v+ Z, A; ^& ]; B
: B1 R, H) r( b' [* s
然后编译执行就可以了(*^_^*)
6 k. S+ o4 q7 J. ~% L6 ]其它:TC++上一定编译错误,不保证在VC6上也能通过编译
- S2 e& @7 Y& H7 B      建议使用VC7或VC更高版本,或者使用GNU C++编译

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