返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
6 D9 j! }8 x8 C" B5 p/ a; J一个很方便的函数模板,可以并且只可以计算含括号的四则表达式( Q; N% ~7 a# Z2 f$ f0 q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn). v+ B5 {" h$ F/ g: j
参数解释:
* N  `8 [/ ?2 v, D( wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# B: ]% O* X4 y# W* Z7 ?& [nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
; M+ t2 p( ~, e# W; S' _返回值:. [0 R7 n- G8 @. Y, q
返回非0表示计算成功,0表示计算失败有错误
! o: b4 H& P, W8 e) G) f3 u- ]: ~0 |9 p/ @
2 W$ Z) J* y5 l/ m* P7 P
- ?3 {) j, Z0 Q6 d) M/ J  w
程序代码:
7 b# I$ N" x+ A5 Q
$ l8 L- L5 ?! j- B3 G2 Enamespace fy_Exp{
8 S, h9 W3 z# U8 D2 enamespace {template <class _T>! l8 |2 ]$ f+ b$ ]. J% d* H
inline _T GetExpValue(_T t[], char& csym){4 a/ f" G# h5 e9 R) @* y+ J; q) C) k
    char c=csym; csym=0;4 O% V! q% p$ V- z2 ?; o) ]: E3 X
    switch(c){: U3 N6 C! g- x2 M1 f! ^1 b
    case '+':return t[0] += t[1];+ d0 ^; V: s3 l9 X
    case '-':return t[0] -= t[1];
, {* w+ C: X* M9 h( I% P    case '*':return t[0] *= t[1];
) X/ }& F1 W; [2 P$ @; N    default: return t[0] /= t[1];//case '/':
9 @2 L/ D- I7 s! S  b$ @* u+ s2 G! i) |- |    }
2 o- K' t& X: w# \2 ^: d}}
5 U/ _$ v& R: c+ n8 stemplate <class _T, class _Tstream>
1 t$ w( F; ]" q/* _Tstream: inputstream, _T: get return value9 K) z+ t$ g  R6 ^) ]
* Return nonzero if get value successfully */
; p( I- Z0 u$ ?" x. E# o4 U) dint GetExpValue(_Tstream& istrin, _T& nReturn){
& G: G# c6 N4 ]: S8 j    _T t[3] = {0}; //雨中飞燕之作
9 c" g! D2 V* V6 S* t7 t3 F! ^    char csym[3] = "++";# `* x2 y; c( e2 A6 C8 d( Y6 ~- E* I
    int nLevel = 1, nERR = 0;
+ W" ]2 v- x+ o1 h7 C7 T    if(!(istrin>>t[1]))istrin.clear();4 n5 c$ o9 u) ~2 e
    for(;;){" i$ `; s( p) }" D! P
        if(istrin>>csym[2]){
- Q$ R1 j" p4 ], `5 \3 M( G$ R0 s            switch(csym[2]){
  {+ G2 m0 J. i: u, s7 y) U            case '(':$ N- q( @7 C) a
                if(!csym[1]){nLevel=0x100; nERR=1;}else, \3 K+ W- r/ B1 ?* I* F
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 B9 _0 q/ |1 d; ?& z
                else{nLevel=0x100; nERR=1;}
& k* F" J/ i  _# \                break;
9 ~5 f, M* I* u9 a4 ?            case ')':, E% E5 k& M6 O/ O. D
                {nLevel = 0x100;}break;
( y* S& g( b" b& y% Z& `+ R            case '+':case '-':case '*':case '/':
  W/ b9 I9 x: ]" Z' \9 @! I                {csym[nLevel++] = csym[2];}break;
9 ~; `3 {' c! ?* O            case ' ':case '\r':case '\n':case '\t':continue;
5 L) a7 `' ], w# _9 M$ h3 X            default:& Y2 T- O, T  O
                {nLevel=0x100; nERR=1;}
4 \: V+ e' i- @. P; d9 t2 ^, _6 e            }
9 o+ t1 k: Y6 Y            if(nLevel==0x100)break;
# ^9 n9 f% s* h. w' l4 l2 F            if(nLevel&0x10 || istrin>>t[2]){' L& x2 Q* S, H; }: w
                nLevel &= 0xF;+ V8 h1 L; K6 N3 p# K) ]1 i* l: }
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 m! e* K+ A$ c3 q# s$ \# V                if(csym[1]=='*'||csym[1]=='/'){
$ M8 F& j  I6 \- p8 a. c$ b3 |                    GetExpValue(t+1, csym[1]);2 S1 J' S5 t' F
                }
' }, o# `9 \- r! Z                else{
) Q8 a3 c1 ]. s# u                    GetExpValue(t, csym[0]);
" p+ G) W4 V: ]  }: J$ M                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;% c( P! C; o! ]  E% D( n
                }
" K# |3 H9 t+ F                nLevel = 1;+ {: f6 a1 I" ^' `( p: ^
            }* r. q8 J5 O! I- r" v" c8 I
            else istrin.clear();) x) k4 `0 q: Q( Z) b
        }
) `- ?, n) w( @. @' \        else{nERR = -1; break;}* }: P$ d4 r2 ]; s/ z& s% T, y) @
    }/ P4 `+ J/ x* K4 p1 J2 D& H
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);' F- }& B  b: A, J3 l+ X
    else nReturn=GetExpValue(t, csym[0]);7 g3 o% \0 O( p* z
    return nERR==-1?1:0;
3 H, o' f; y- V6 U% }}}
' _, E# F0 g6 a$ ]% A. g  }. X7 M

! @6 S* C* X; X; t. _& t; f7 V4 R
( R+ ?4 B% e0 Q7 r9 E8 w& v! M函数模板使用示例:
) p5 }: l  {1 N) j0 n在以上那段代码的后面加上以下代码:
7 N( X! c( v+ A; t- r8 G  ^- Q- I7 {0 G  s# U7 ~) K8 @

$ r& s9 b, E# g  q* K* g& X8 E5 |
. S$ P! o/ H& L! x! a; u' D程序代码:
" d* E! Y- e4 k) ~) y+ [" k7 ^1 M
#include<strstream>
; V8 M- B1 a9 E1 r#include<iostream>
7 ?% N* m( }; c/ q( S4 x#include<string>$ X" H$ G- i8 y. ]) e! C
using namespace std;" h/ s0 `* `! {* i  C" u
int main(void)8 ?1 l( x) O5 {
{
5 H$ M, J- C" A! O$ l7 S( g. d' ]6 ^8 F    string s1;+ w$ K/ D# @$ |  R/ |
    while(cin>>s1)  V( p( f: B6 I+ m  ~# z  y+ L
    {" Y' ]) W" o$ ?* N5 ^
        istrstream isin(s1.data());" B: P8 Z; l  f$ w
        double d;; n% f/ d! l/ o1 y; O1 W  w
        if(fy_Exp::GetExpValue(isin, d))
# ~7 n1 J. P* Z3 Y& z        {
$ @. M& [' r( Y            cout<<d<<endl;
( Y6 U' Z+ x; e/ \        }
# p% a2 Z; f+ f7 v        else( A' q- t/ W# S
        {
( z, X7 ^) s; |- T3 q9 l            cout<<"ERROR"<<endl;' w. {7 t8 V( W+ y
        }
8 `3 U; w+ Q* [5 l$ m- C. N4 w* c    }
& V. g4 W  @$ k( B" Q% ~- ]& i+ J    return 0;
; a2 z% k: u( e+ i' |* O; W0 N. ~}3 x4 Z+ s, U% K0 s4 `
1 m+ }. t: h+ o" \4 b6 _

( T; D; f6 }7 r% i1 ]然后编译执行就可以了(*^_^*)- ~, y# g) O/ m" V
其它:TC++上一定编译错误,不保证在VC6上也能通过编译( d+ B4 ]5 |  N1 @$ F3 t( D
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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